{"serverInfo": {"name": "GoodBarber Public MCP", "version": "1.2.0"}, "authentication": {"required": true, "schemes": ["oauth2"]}, "tools": [{"name": "meta_get_tool_plan", "title": "Get tool plan", "description": "Retrieve full guidance for one tool name, including the recommended discover/call/verify sequence and failure policy.", "inputSchema": {"type": "object", "properties": {"tool_name": {"type": "string", "description": "Exact name of the MCP tool to retrieve guidance for, e.g. 'shop_create_product'."}}, "required": ["tool_name"]}, "annotations": {"title": "Get tool plan", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": false}}, {"name": "shop_list_collections", "title": "List collections", "description": "List shop collections (paginated). Returns count/previous/next/collections.", "inputSchema": {"type": "object", "properties": {"keyword": {"type": "string", "description": "Filter by collection name, supports comma-separated OR terms."}, "page": {"type": "integer", "description": "Page number (default 1)"}, "per_page": {"type": "integer", "description": "Items per page"}, "sort": {"type": "string", "enum": ["alpha", "alpha_desc", "first_added", "last_added"]}}, "required": []}, "annotations": {"title": "List collections", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_collection", "title": "Get collection", "description": "Retrieve one collection by id. Returns collection object.", "inputSchema": {"type": "object", "properties": {"collection_id": {"type": "integer", "description": "Collection identifier"}}, "required": ["collection_id"]}, "annotations": {"title": "Get collection", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_options", "title": "List options", "description": "List variant options (paginated). Returns count/previous/next/options.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}, "search": {"type": "string", "description": "Filter by option name substring"}}, "required": []}, "annotations": {"title": "List options", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_option", "title": "Create option", "description": "Create a new variant option for product variants.", "inputSchema": {"type": "object", "properties": {"name": {"type": "string", "description": "Option name (e.g. 'Color', 'Size')"}}, "required": ["name"]}, "annotations": {"title": "Create option", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_update_option", "title": "Update option", "description": "Update the name of a variant option.", "inputSchema": {"type": "object", "properties": {"option_id": {"type": "integer"}, "name": {"type": "string"}}, "required": ["option_id", "name"]}, "annotations": {"title": "Update option", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_option", "title": "Delete option", "description": "Delete a specific variant option.", "inputSchema": {"type": "object", "properties": {"option_id": {"type": "integer"}}, "required": ["option_id"]}, "annotations": {"title": "Delete option", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_products", "title": "List products", "description": "List products (paginated). Returns count/previous/next/products.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}, "collection": {"type": "array", "items": {"type": "integer"}, "description": "List of collection ids. Use [id] for a single collection, [id1, id2, ...] for OR filtering across multiple collections. Always pass an array, even for one collection. Do NOT make multiple calls to filter across several collections \u2014 this parameter handles it natively."}, "keyword": {"type": "string"}, "status": {"type": "string", "enum": ["DEMO", "DRAFT", "INVISIBLE", "PUBLISHED"]}}, "required": []}, "annotations": {"title": "List products", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_product", "title": "Create product", "description": "Create a product. Returns created product object.", "inputSchema": {"type": "object", "properties": {"title": {"type": "string"}, "meta_title": {"type": "string"}, "meta_description": {"type": "string"}, "summary": {"type": "string"}, "status": {"type": "string", "enum": ["DRAFT", "PUBLISHED", "INVISIBLE"]}, "visibility_start": {"type": "string", "description": "ISO datetime"}, "visibility_end": {"type": "string", "description": "ISO datetime"}, "highlight": {"type": "boolean"}, "slug": {"type": "string"}, "media": {"type": "integer", "description": "Slide id used as product thumbnail"}, "tags": {"type": "array", "items": {"type": "string"}}, "collections": {"type": "array", "items": {"type": "integer"}}, "show_similar_products": {"type": "boolean"}, "set_custom_similar_products": {"type": "array", "items": {"type": "integer"}}, "product_ref": {"type": "string"}, "brand": {"type": "string"}}, "required": ["title"]}, "annotations": {"title": "Create product", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_get_product", "title": "Get product", "description": "Retrieve one product by id. Returns product object with variants/slides.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}}, "required": ["product_id"]}, "annotations": {"title": "Get product", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_update_product", "title": "Update product", "description": "Update a product in the shop.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "title": {"type": "string"}, "meta_title": {"type": "string"}, "meta_description": {"type": "string"}, "summary": {"type": "string"}, "status": {"type": "string", "enum": ["DRAFT", "PUBLISHED", "INVISIBLE"]}, "visibility_start": {"type": "string", "description": "ISO datetime"}, "visibility_end": {"type": "string", "description": "ISO datetime"}, "highlight": {"type": "boolean"}, "slug": {"type": "string"}, "media": {"type": "integer"}, "tags": {"type": "array", "items": {"type": "string"}}, "collections": {"type": "array", "items": {"type": "integer"}}, "show_similar_products": {"type": "boolean"}, "set_custom_similar_products": {"type": "array", "items": {"type": "integer"}}, "product_ref": {"type": "string"}, "brand": {"type": "string"}}, "required": ["product_id"]}, "annotations": {"title": "Update product", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_product", "title": "Delete product", "description": "Delete a specific product from the shop.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}}, "required": ["product_id"]}, "annotations": {"title": "Delete product", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_paragraphs", "title": "List paragraphs", "description": "List product description paragraphs sorted by position.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}}, "required": ["product_id"]}, "annotations": {"title": "List paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_paragraph", "title": "Create paragraph", "description": "Add a description paragraph to a product.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "paragraph_type": {"type": "string", "enum": ["TEXT", "QUOTE", "PHOTO", "EMBED"]}, "html": {"type": "boolean"}, "content": {"type": "string"}, "position": {"type": "integer", "description": "Order index"}}, "required": ["product_id", "paragraph_type", "position"]}, "annotations": {"title": "Create paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_update_paragraph", "title": "Update paragraph", "description": "Update a product description paragraph.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "paragraph_id": {"type": "string"}, "html": {"type": "boolean"}, "paragraph_type": {"type": "string", "enum": ["TEXT", "QUOTE", "PHOTO", "EMBED"]}, "position": {"type": "integer"}, "content": {"type": "string"}, "media_id": {"type": "integer"}}, "required": ["product_id", "paragraph_id"]}, "annotations": {"title": "Update paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_paragraph", "title": "Delete paragraph", "description": "Delete a specific product description paragraph.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "paragraph_id": {"type": "string"}}, "required": ["product_id", "paragraph_id"]}, "annotations": {"title": "Delete paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_create_paragraph_media", "title": "Create paragraph media", "description": "Create a media object for a paragraph. For PHOTO: pass media_type=PHOTO and image_file. For EMBED: pass media_type=EMBED and content.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product the paragraph belongs to."}, "paragraph_id": {"type": "string", "description": "Id of the description paragraph to attach the media to (from shop_list_paragraphs)."}, "media_type": {"type": "string", "description": "Required. PHOTO or EMBED.", "enum": ["PHOTO", "EMBED"]}, "image_file": {"type": "string", "description": "Required for PHOTO. Image payload. Accepts: (1) a data URI 'data:image/png;base64,...', (2) a raw base64-encoded string of the image bytes, or (3) a public http(s) URL. Do NOT pass a local filesystem path."}, "content": {"type": "string", "description": "Required for EMBED. Embed content."}, "focal_point": {"type": "string", "description": "Image crop focal point, format 40x50."}}, "required": ["product_id", "paragraph_id", "media_type"]}, "annotations": {"title": "Create paragraph media", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_get_paragraph_media", "title": "Get paragraph media", "description": "Retrieve the details of a paragraph media object.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "paragraph_id": {"type": "string"}, "media_id": {"type": "integer"}}, "required": ["product_id", "paragraph_id", "media_id"]}, "annotations": {"title": "Get paragraph media", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_update_paragraph_media", "title": "Update paragraph media", "description": "Update a paragraph media object (content, type, focal point, and/or image_file).", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product the paragraph belongs to."}, "paragraph_id": {"type": "string", "description": "Id of the description paragraph the media belongs to."}, "media_id": {"type": "integer", "description": "Unique ID of the media to update."}, "media_type": {"type": "string", "enum": ["PHOTO", "EMBED"], "description": "Type of media: PHOTO or EMBED."}, "image_file": {"type": "string", "description": "Image payload. Accepts: (1) a data URI 'data:image/png;base64,...', (2) a raw base64-encoded string of the image bytes, or (3) a public http(s) URL. Do NOT pass a local filesystem path \u2014 the server cannot read the user's disk."}, "content": {"type": "string", "description": "Required for EMBED. Embed content/code."}, "focal_point": {"type": "string", "description": "Image crop focal point, format '40x50'."}}, "required": ["product_id", "paragraph_id", "media_id"]}, "annotations": {"title": "Update paragraph media", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_paragraph_media", "title": "Delete paragraph media", "description": "Delete a paragraph media object.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "paragraph_id": {"type": "string"}, "media_id": {"type": "integer"}}, "required": ["product_id", "paragraph_id", "media_id"]}, "annotations": {"title": "Delete paragraph media", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_upload_product_pdf", "title": "Upload product PDF", "description": "Download a PDF from a URL and attach it to a product (multipart upload).", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product to attach the PDF to."}, "pdf": {"type": "string", "description": "Public URL of the PDF to download and upload"}, "pdf_name": {"type": "string", "description": "Display name (default: filename from URL)"}}, "required": ["product_id", "pdf"]}, "annotations": {"title": "Upload product PDF", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_delete_product_pdf", "title": "Delete product PDF", "description": "Delete the PDF file associated with a product.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}}, "required": ["product_id"]}, "annotations": {"title": "Delete product PDF", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_upload_product_slide", "title": "Upload product slide", "description": "Upload an image file as a product slide (multipart form-data).", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product to add the slide to."}, "image_file": {"type": "string", "description": "Image payload. Accepts: (1) a data URI 'data:image/png;base64,...', (2) a raw base64-encoded string of the image bytes, or (3) a public http(s) URL. Do NOT pass a local filesystem path \u2014 the server cannot read the user's disk."}, "position": {"type": "integer", "description": "Zero-based order index controlling where the slide appears (lower comes first)."}, "focal_point": {"type": "string", "description": "Image crop focal point, format '40x50'."}}, "required": ["product_id", "image_file"]}, "annotations": {"title": "Upload product slide", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_update_product_slide", "title": "Update product slide", "description": "Update a slide (position, focal_point and/or replacement image via image_file).", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product the slide belongs to."}, "slide_id": {"type": "integer", "description": "Numeric id of the slide to update."}, "position": {"type": "integer", "description": "Zero-based order index controlling where the slide appears (lower comes first)."}, "image_file": {"type": "string", "description": "Image payload. Accepts: (1) a data URI 'data:image/png;base64,...', (2) a raw base64-encoded string of the image bytes, or (3) a public http(s) URL. Do NOT pass a local filesystem path \u2014 the server cannot read the user's disk."}, "focal_point": {"type": "string", "description": "Image crop focal point, format '40x50'."}}, "required": ["product_id", "slide_id"]}, "annotations": {"title": "Update product slide", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_product_slide", "title": "Delete product slide", "description": "Delete a specific product slide.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "slide_id": {"type": "integer"}}, "required": ["product_id", "slide_id"]}, "annotations": {"title": "Delete product slide", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_create_variant", "title": "Create variant", "description": "Create a new variant for a product. IMPORTANT: all variants of the same product MUST share the exact same set of option_ids. When you introduce a new option on one variant, you must also add that option (with an appropriate value) to every other existing variant via shop_update_variant \u2014 otherwise the product ends up in an inconsistent state.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "price": {"type": "string", "description": "Decimal as string, e.g. '10.50000'"}, "compare_at": {"type": "string"}, "stock": {"type": "integer"}, "weight": {"type": "string"}, "position": {"type": "integer"}, "sku": {"type": "string"}, "option_values": {"type": "array", "description": "List of option/value pairs that identify this variant. Each item must include option_id and value, for example [{\"option_id\": 1, \"value\": \"Red\"}, {\"option_id\": 2, \"value\": \"M\"}].", "items": {"type": "object", "properties": {"option_id": {"type": "integer", "minimum": 1, "description": "Numeric option id."}, "value": {"type": "string", "description": "Option value for this variant."}}, "required": ["option_id", "value"], "additionalProperties": false}}, "media": {"type": "integer"}}, "required": ["product_id", "price", "option_values"]}, "annotations": {"title": "Create variant", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_get_variant", "title": "Get variant", "description": "Retrieve the details of a product variant.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer", "description": "Numeric id of the product the variant belongs to."}, "variant_id": {"type": "integer", "description": "Numeric id of the variant to retrieve."}}, "required": ["product_id", "variant_id"]}, "annotations": {"title": "Get variant", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_update_variant", "title": "Update variant", "description": "Update the details of a product variant.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "variant_id": {"type": "integer"}, "price": {"type": "string"}, "compare_at": {"type": "string"}, "stock": {"type": "integer"}, "weight": {"type": "string"}, "position": {"type": "integer"}, "sku": {"type": "string"}, "option_values": {"type": "array", "description": "List of option/value pairs that identify this variant. Each item must include option_id and value, for example [{\"option_id\": 1, \"value\": \"Red\"}, {\"option_id\": 2, \"value\": \"M\"}].", "items": {"type": "object", "properties": {"option_id": {"type": "integer", "minimum": 1, "description": "Numeric option id."}, "value": {"type": "string", "description": "Option value for this variant."}}, "required": ["option_id", "value"], "additionalProperties": false}}, "media": {"type": "integer"}}, "required": ["product_id", "variant_id"]}, "annotations": {"title": "Update variant", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_delete_variant", "title": "Delete variant", "description": "Delete a specific product variant.", "inputSchema": {"type": "object", "properties": {"product_id": {"type": "integer"}, "variant_id": {"type": "integer"}}, "required": ["product_id", "variant_id"]}, "annotations": {"title": "Delete variant", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_tags", "title": "List tags", "description": "List all tags used in the shop catalog.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}, "sort": {"type": "string", "enum": ["alpha", "last_created", "most_tagged"]}}, "required": []}, "annotations": {"title": "List tags", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_validate_jwt", "title": "Validate JWT", "description": "Validate a front-end JWT for a shop customer.", "inputSchema": {"type": "object", "properties": {"user_id": {"type": "string", "description": "Target user id for token validation"}, "jwt": {"type": "string", "description": "The JWT to validate"}}, "required": ["jwt"]}, "annotations": {"title": "Validate JWT", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_customers", "title": "List customers", "description": "List customers of the shop.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}}, "required": []}, "annotations": {"title": "List customers", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_customer", "title": "Get customer", "description": "Retrieve the details of a specific shop customer.", "inputSchema": {"type": "object", "properties": {"customer_id": {"type": "integer"}}, "required": ["customer_id"]}, "annotations": {"title": "Get customer", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_prospects", "title": "List prospects", "description": "List prospects (newsletter subscribers) of the shop.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}}, "required": []}, "annotations": {"title": "List prospects", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_prospect", "title": "Get prospect", "description": "Retrieve the details of a specific shop prospect.", "inputSchema": {"type": "object", "properties": {"user_id": {"type": "string", "description": "Unique ID of the user"}}, "required": ["user_id"]}, "annotations": {"title": "Get prospect", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_push_broadcast", "title": "Create push broadcast", "description": "Send a push notification broadcast to all shop app users.", "inputSchema": {"type": "object", "properties": {"message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "product_url", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url, product_url with product_slug, or section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. For section actions, provide only when a public URL or path is already known."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'; can open any resolved app or shop section. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types plus commerce. Match titles case-insensitively and ask the user for an id only if nothing matches. Do not use section_id/item_id for eCommerce products."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "product_slug": {"type": "string", "description": "Product slug for action_type='product_url'."}}, "required": ["message"]}, "annotations": {"title": "Create push broadcast", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_create_push_notification", "title": "Create push notification", "description": "Send a shop push notification with optional user targeting, scheduling, and tap action.", "inputSchema": {"type": "object", "properties": {"message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "product_url", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url, product_url with product_slug, or section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. For section actions, provide only when a public URL or path is already known."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'; can open any resolved app or shop section. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types plus commerce. Match titles case-insensitively and ask the user for an id only if nothing matches. Do not use section_id/item_id for eCommerce products."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "product_slug": {"type": "string", "description": "Product slug for action_type='product_url'."}, "targeting": {"type": "object", "description": "Optional user targeting. If omitted, sends to all eligible push recipients.", "properties": {"user_ids": {"oneOf": [{"type": "integer"}, {"type": "array", "items": {"type": "integer"}}], "description": "One user ID or a list of user IDs resolved from this app's user, customer, prospect, or subscription list tools."}, "user_id": {"type": "integer", "description": "Alias for a single user ID."}}, "required": []}}, "required": ["message"]}, "annotations": {"title": "Create push notification", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_orders", "title": "List orders", "description": "List orders of the shop. Supports filtering by status and date range.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "per_page": {"type": "integer"}, "status": {"description": "One status or a list of statuses to OR-filter.", "oneOf": [{"type": "string", "enum": ["PENDING", "FULFILLED", "DELIVERED", "CANCELLED"]}, {"type": "array", "items": {"type": "string", "enum": ["PENDING", "FULFILLED", "DELIVERED", "CANCELLED"]}}]}, "creation_date_from": {"type": "string", "description": "Filter orders created after this datetime (yyyy-mm-ddThh:MM, UTC)"}, "creation_date_to": {"type": "string", "description": "Filter orders created before this datetime (yyyy-mm-ddThh:MM, UTC)"}, "delivery_date_from": {"type": "string", "description": "Filter by delivery slot start after this datetime"}, "delivery_date_to": {"type": "string", "description": "Filter by delivery slot end before this datetime"}}, "required": []}, "annotations": {"title": "List orders", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_order", "title": "Get order", "description": "Retrieve the details of a specific order.", "inputSchema": {"type": "object", "properties": {"order_id": {"type": "integer", "description": "Unique ID of the order"}}, "required": ["order_id"]}, "annotations": {"title": "Get order", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_order_shipping", "title": "Get order shipping", "description": "Get the shipping information (status, tracking number, tracking URL) of an order.", "inputSchema": {"type": "object", "properties": {"order_id": {"type": "integer"}}, "required": ["order_id"]}, "annotations": {"title": "Get order shipping", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_update_order_shipping", "title": "Update order shipping", "description": "Update the shipping information of an order. Status can only go PENDING \u2192 FULFILLED \u2192 DELIVERED.", "inputSchema": {"type": "object", "properties": {"order_id": {"type": "integer"}, "status": {"type": "string", "enum": ["FULFILLED", "DELIVERED"], "description": "New order status"}, "shipping_tracking_num": {"type": "string"}, "shipping_tracking_url": {"type": "string"}}, "required": ["order_id"]}, "annotations": {"title": "Update order shipping", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_loyalty", "title": "Get loyalty", "description": "Retrieve the loyalty points details of a shop user.", "inputSchema": {"type": "object", "properties": {"user_id": {"type": "integer"}}, "required": ["user_id"]}, "annotations": {"title": "Get loyalty", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_update_loyalty", "title": "Update loyalty", "description": "Update the loyalty points of a shop user.", "inputSchema": {"type": "object", "properties": {"user_id": {"type": "integer"}, "points_count": {"type": "integer", "description": "New points total"}}, "required": ["user_id", "points_count"]}, "annotations": {"title": "Update loyalty", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_get_promocode", "title": "Get promocode", "description": "Retrieve the details of a specific promocode.", "inputSchema": {"type": "object", "properties": {"promocode_id": {"type": "integer"}}, "required": ["promocode_id"]}, "annotations": {"title": "Get promocode", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_promocodes_amount", "title": "List promocodes amount", "description": "List promocodes based on order amount.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer", "description": "1-based page number to retrieve. Defaults to the first page when omitted."}, "per_page": {"type": "integer", "description": "Number of promocodes returned per page."}}, "required": []}, "annotations": {"title": "List promocodes amount", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_promocode_amount", "title": "Create promocode amount", "description": "Create a promocode based on order amount.", "inputSchema": {"type": "object", "properties": {"code": {"type": "string"}, "name": {"type": "string"}, "discount_type": {"type": "string", "enum": ["PERCENT", "ABSOLUTE"]}, "value": {"type": "number"}, "max_uses": {"type": "integer"}, "one_use_by_user": {"type": "boolean"}, "registered_only": {"type": "boolean"}, "specific_registered_only": {"type": "boolean"}, "specific_registered_ids": {"type": "array", "items": {"type": "integer"}, "description": "List of specific user IDs"}, "conditions": {"type": "string", "enum": ["NONE", "PRICE_RANGE", "NUMBER_OF_PRODUCTS"]}, "min_quantity": {"type": "integer"}, "min_price": {"type": "number"}, "max_price": {"type": "number"}, "start_at": {"type": "string", "description": "ISO datetime"}, "end_at": {"type": "string", "description": "ISO datetime. Use end_date='none' for no expiration."}, "end_date": {"type": "string", "description": "Alias for end_at. Set to 'none' for no expiration."}}, "required": ["name", "discount_type", "value", "start_at"]}, "annotations": {"title": "Create promocode amount", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_promocodes_collections", "title": "List promocodes collections", "description": "List promocodes based on dedicated collections.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer", "description": "1-based page number to retrieve. Defaults to the first page when omitted."}, "per_page": {"type": "integer", "description": "Number of promocodes returned per page."}}, "required": []}, "annotations": {"title": "List promocodes collections", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_promocode_collections", "title": "Create promocode collections", "description": "Create a promocode based on dedicated collections.", "inputSchema": {"type": "object", "properties": {"code": {"type": "string"}, "name": {"type": "string"}, "discount_type": {"type": "string", "enum": ["PERCENT", "ABSOLUTE"]}, "value": {"type": "number"}, "collection_ids": {"type": "array", "items": {"type": "integer"}, "description": "List of collection IDs this promocode applies to"}, "max_uses": {"type": "integer"}, "one_use_by_user": {"type": "boolean"}, "registered_only": {"type": "boolean"}, "specific_registered_only": {"type": "boolean"}, "specific_registered_ids": {"type": "array", "items": {"type": "integer"}}, "conditions": {"type": "string", "enum": ["NONE", "PRICE_RANGE", "NUMBER_OF_PRODUCTS"]}, "min_quantity": {"type": "integer"}, "min_price": {"type": "number"}, "max_price": {"type": "number"}, "start_at": {"type": "string"}, "end_at": {"type": "string", "description": "ISO datetime. Use end_date='none' for no expiration."}, "end_date": {"type": "string", "description": "Alias for end_at. Set to 'none' for no expiration."}}, "required": ["name", "discount_type", "value", "collection_ids", "start_at"]}, "annotations": {"title": "Create promocode collections", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_promocodes_product", "title": "List promocodes product", "description": "List promocodes based on a dedicated product.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer", "description": "1-based page number to retrieve. Defaults to the first page when omitted."}, "per_page": {"type": "integer", "description": "Number of promocodes returned per page."}}, "required": []}, "annotations": {"title": "List promocodes product", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_promocode_product", "title": "Create promocode product", "description": "Create a promocode based on a dedicated product.", "inputSchema": {"type": "object", "properties": {"code": {"type": "string"}, "name": {"type": "string"}, "discount_type": {"type": "string", "enum": ["PERCENT", "ABSOLUTE"]}, "value": {"type": "number"}, "product_id": {"type": "integer", "description": "Product this promocode applies to"}, "max_uses": {"type": "integer"}, "one_use_by_user": {"type": "boolean"}, "registered_only": {"type": "boolean"}, "specific_registered_only": {"type": "boolean"}, "specific_registered_ids": {"type": "array", "items": {"type": "integer"}}, "conditions": {"type": "string", "enum": ["NONE", "PRICE_RANGE", "NUMBER_OF_PRODUCTS"]}, "min_quantity": {"type": "integer"}, "min_price": {"type": "number"}, "max_price": {"type": "number"}, "start_at": {"type": "string"}, "end_at": {"type": "string", "description": "ISO datetime. Use end_date='none' for no expiration."}, "end_date": {"type": "string", "description": "Alias for end_at. Set to 'none' for no expiration."}}, "required": ["name", "discount_type", "value", "product_id", "start_at"]}, "annotations": {"title": "Create promocode product", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_promocodes_tags", "title": "List promocodes tags", "description": "List promocodes based on dedicated tags.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer", "description": "1-based page number to retrieve. Defaults to the first page when omitted."}, "per_page": {"type": "integer", "description": "Number of promocodes returned per page."}}, "required": []}, "annotations": {"title": "List promocodes tags", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_create_promocode_tags", "title": "Create promocode tags", "description": "Create a promocode based on dedicated tags.", "inputSchema": {"type": "object", "properties": {"code": {"type": "string"}, "name": {"type": "string"}, "discount_type": {"type": "string", "enum": ["PERCENT", "ABSOLUTE"]}, "value": {"type": "number"}, "tags": {"type": "array", "items": {"type": "string"}, "description": "List of tags this promocode applies to"}, "max_uses": {"type": "integer"}, "one_use_by_user": {"type": "boolean"}, "registered_only": {"type": "boolean"}, "specific_registered_only": {"type": "boolean"}, "specific_registered_ids": {"type": "array", "items": {"type": "integer"}}, "conditions": {"type": "string", "enum": ["NONE", "PRICE_RANGE", "NUMBER_OF_PRODUCTS"]}, "min_quantity": {"type": "integer"}, "min_price": {"type": "number"}, "max_price": {"type": "number"}, "start_at": {"type": "string"}, "end_at": {"type": "string", "description": "ISO datetime. Use end_date='none' for no expiration."}, "end_date": {"type": "string", "description": "Alias for end_at. Set to 'none' for no expiration."}}, "required": ["name", "discount_type", "value", "tags", "start_at"]}, "annotations": {"title": "Create promocode tags", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "shop_list_downloads", "title": "List downloads", "description": "List app download statistics for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "Start date (YYYY-MM-DD)"}, "end_date": {"type": "string", "description": "End date (YYYY-MM-DD)"}, "platform": {"type": "string", "enum": ["all", "android", "ipad", "iphone"]}}, "required": []}, "annotations": {"title": "List downloads", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_downloads_global", "title": "List downloads global", "description": "List global (all-time) app download statistics for the shop.", "inputSchema": {"type": "object", "properties": {"platform": {"type": "string", "enum": ["all", "android", "ipad", "iphone"]}}, "required": []}, "annotations": {"title": "List downloads global", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_launches", "title": "List launches", "description": "List app launch statistics for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}, "platform": {"type": "string", "enum": ["all", "android", "html5", "ipad", "iphone"]}}, "required": []}, "annotations": {"title": "List launches", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_unique_launches", "title": "List unique launches", "description": "List unique app launch statistics for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}, "platform": {"type": "string", "enum": ["all", "android", "html5", "ipad", "iphone"]}}, "required": []}, "annotations": {"title": "List unique launches", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_page_views", "title": "List page views", "description": "List page view statistics for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}, "platform": {"type": "string", "enum": ["all", "android", "html5", "ipad", "iphone"]}}, "required": []}, "annotations": {"title": "List page views", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_page_views_per_weekday", "title": "List page views per weekday", "description": "List page views broken down by day of the week for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List page views per weekday", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "shop_list_session_times", "title": "List session times", "description": "List session time statistics for the shop.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List session times", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_list_sections", "title": "List sections", "description": "List app sections for the current app by section type. This generic section catalog can return CMS content sections, content sections powered by other providers, and non-content sections. Use type='commerce' for eCommerce sections because commerce sections are not MCMS sections. The response includes section ids and titles and, when present, category ids and titles.", "inputSchema": {"type": "object", "properties": {"type": {"type": "string", "description": "Section type to discover. The generic section catalog can return any matching app section, including content and non-content sections. Common values include 'article', 'photo', 'video', 'sound', 'maps', 'agenda', and 'commerce'. Use 'commerce' for eCommerce sections. Prefer cms_list_cms_sections for CMS-only article, photo, video, sound, maps, and agenda discovery."}}, "required": ["type"]}, "annotations": {"title": "List sections", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_list_cms_sections", "title": "List CMS sections", "description": "List CMS content sections for the current app by CMS content type. Use this to discover CMS-created article, maps, video, photo, agenda, or sound sections before listing CMS content that requires category ids. The response includes each section's id and title and its categories with ids and titles.", "inputSchema": {"type": "object", "properties": {"type": {"type": "string", "enum": ["article", "maps", "video", "photo", "agenda", "sound"], "description": "CMS content type to discover."}}, "required": ["type"]}, "annotations": {"title": "List CMS sections", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_list_articles", "title": "List articles", "description": "List CMS articles for the current app. Optionally filter by one or more category ids (use cms_list_cms_sections first to discover them); omit category to list across every article category. Also filter by publication status, article title search terms, article ids, pagination, and sorting.", "inputSchema": {"type": "object", "properties": {"category": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional article category ids returned by cms_list_cms_sections. Omit to list across all categories."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of articles per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional article ids to filter the list."}, "status": {"type": "string", "enum": ["draft", "published", "stock", "scheduled"], "description": "Optional publication status filter. Omit to list every non-deleted item in scope."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the article list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the article list."}}, "required": []}, "annotations": {"title": "List articles", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_article", "title": "Get article", "description": "Retrieve one CMS article for the current app by article id. Use cms_list_articles first when the article id is unknown. The response fields accessTier and maxFreeParagraphs apply only to in-app-purchase items: maxFreeParagraphs is the number of body paragraphs shown as a free preview before purchase.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}}, "required": ["id"]}, "annotations": {"title": "Get article", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_article", "title": "Create article", "description": "Create one CMS article for the current app. Use cms_list_cms_sections first to discover article category ids.", "inputSchema": {"type": "object", "properties": {"title": {"type": "string", "maxLength": 250, "description": "Article headline shown in feeds and on the item page."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Article category ids returned by cms_list_cms_sections."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Optional article deck HTML."}, "author": {"type": "string", "maxLength": 255, "description": "Optional byline or author display name. If omitted, the app account holder's name is used."}, "date": {"type": "string", "format": "date-time", "description": "Optional editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Optional URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Optional SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this article."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Publication status. Omit to default to published."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date in RFC 3339 format."}, "pinned": {"type": "boolean", "description": "Whether the article is pinned in its category listing."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Paywall tier. 'premium' locks the article behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}, "maxFreeParagraphs": {"type": "integer", "minimum": 0, "maximum": 5, "description": "Number of body paragraphs shown as a free preview before purchase, 0 to 5. Applies only to premium in-app-purchase articles."}, "displaySummaryInList": {"type": "boolean", "description": "Whether the article summary is shown in list views. Writable only when maxFreeParagraphs is 0."}}, "required": ["title", "categories"]}, "annotations": {"title": "Create article", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_update_article", "title": "Update article", "description": "Update one CMS article for the current app by article id. Provide at least one field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "title": {"type": "string", "maxLength": 250, "description": "Replacement article headline shown in feeds and on the item page."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Replacement article category ids returned by cms_list_cms_sections."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Replacement article deck HTML."}, "author": {"type": "string", "maxLength": 255, "description": "Replacement byline or author display name."}, "date": {"type": "string", "format": "date-time", "description": "Replacement editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Replacement URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Replacement SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this article."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Replacement publication status."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date. Send an empty string to clear an existing scheduled unpublication."}, "pinned": {"type": "boolean", "description": "Whether the article is pinned in its category listing."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Replacement paywall tier. 'premium' locks the article behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}, "maxFreeParagraphs": {"type": "integer", "minimum": 0, "maximum": 5, "description": "Number of body paragraphs shown as a free preview before purchase, 0 to 5. Applies only to premium in-app-purchase articles."}, "displaySummaryInList": {"type": "boolean", "description": "Whether the article summary is shown in list views. Writable only when maxFreeParagraphs is 0."}}, "required": ["id"]}, "annotations": {"title": "Update article", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_article", "title": "Delete article", "description": "Delete one CMS article for the current app by article id. Use cms_get_article or cms_list_articles first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}}, "required": ["id"]}, "annotations": {"title": "Delete article", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_article_paragraphs", "title": "List article paragraphs", "description": "List body paragraphs for one CMS article, sorted by paragraph position.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}}, "required": ["id"]}, "annotations": {"title": "List article paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_article_paragraph", "title": "Create article paragraph", "description": "Create one body paragraph under a CMS article. Paragraph type must be text, photo, quote, or embed. Required fields depend on the paragraph type.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "type": {"type": "string", "enum": ["text", "quote", "photo", "embed"], "description": "Paragraph body-block kind."}, "position": {"type": "integer", "minimum": 1, "description": "Optional 1-based insert position; omit to append."}, "content": {"type": "string", "description": "Required for text and quote paragraphs."}, "caption": {"type": "string", "description": "Optional caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Required embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "originalThumbnail": {"type": "string", "description": "Required image URL, data URI, or base64 source for photo paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the article thumbnail."}}, "required": ["id", "type"]}, "annotations": {"title": "Create article paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_get_article_paragraph", "title": "Get article paragraph", "description": "Retrieve one body paragraph by article id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_article_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Get article paragraph", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_article_paragraph", "title": "Update article paragraph", "description": "Update one body paragraph under a CMS article. Provide at least one paragraph field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_article_paragraphs."}, "content": {"type": "string", "description": "Replacement text HTML or quote body, depending on paragraph type."}, "caption": {"type": "string", "description": "Replacement caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Replacement embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the article thumbnail."}, "originalThumbnail": {"type": "string", "description": "Replacement image URL, data URI, or base64 source for photo paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Update article paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_article_paragraph", "title": "Delete article paragraph", "description": "Delete one body paragraph from a CMS article by article id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_article_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Delete article paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_reorder_article_paragraphs", "title": "Reorder article paragraphs", "description": "Reorder all body paragraphs for one CMS article. Pass a full ordered list of paragraph ids.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Article id returned by cms_list_articles."}, "paragraph_ids": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Full ordered list of paragraph ids for this article."}}, "required": ["id", "paragraph_ids"]}, "annotations": {"title": "Reorder article paragraphs", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_maps", "title": "List maps", "description": "List CMS map (point of interest) items for the current app. Optionally filter by one or more category ids (use cms_list_cms_sections with type='maps' first to discover them); omit category to list across every map category. Also filter by publication status.", "inputSchema": {"type": "object", "properties": {"category": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional map category ids returned by cms_list_cms_sections. Omit to list across all categories."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of map items per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional map item ids to filter the list."}, "status": {"type": "string", "enum": ["draft", "published", "stock", "scheduled"], "description": "Optional publication status filter. Omit to list every non-deleted item in scope."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the map list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the map list."}}, "required": []}, "annotations": {"title": "List maps", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_map", "title": "Get map", "description": "Retrieve one CMS map item for the current app by map item id. Use cms_list_maps first when the map item id is unknown. The response fields accessTier and maxFreeParagraphs apply only to in-app-purchase items: maxFreeParagraphs is the number of body paragraphs shown as a free preview before purchase.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}}, "required": ["id"]}, "annotations": {"title": "Get map", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_map", "title": "Create map", "description": "Create one CMS map (point of interest) item for the current app. Use cms_list_cms_sections with type='maps' first to discover map category ids.", "inputSchema": {"type": "object", "properties": {"title": {"type": "string", "maxLength": 250, "description": "Map point name shown in feeds and on the item page."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Map category ids returned by cms_list_cms_sections."}, "address": {"type": "string", "description": "Street or place address of the point of interest."}, "latitude": {"type": "number", "description": "Latitude of the point in decimal degrees."}, "longitude": {"type": "number", "description": "Longitude of the point in decimal degrees."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Optional map point deck HTML."}, "slug": {"type": "string", "maxLength": 500000, "description": "Optional URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Optional SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this map item."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Publication status. Omit to default to published."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date in RFC 3339 format."}, "email": {"type": "string", "description": "Optional contact email for the map point."}, "phoneNumber": {"type": "string", "description": "Optional contact phone number for the map point."}, "website": {"type": "string", "description": "Optional website URL for the map point."}, "useThumbAsPinIcon": {"type": "boolean", "description": "Whether the map item thumbnail is used as the map pin icon. On create the server stores this as off; set a thumbnail via a photo paragraph first, then update this flag."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["title", "categories", "address", "latitude", "longitude"]}, "annotations": {"title": "Create map", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_update_map", "title": "Update map", "description": "Update one CMS map item for the current app by map item id. Provide at least one field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "title": {"type": "string", "maxLength": 250, "description": "Replacement map point name."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Replacement map category ids returned by cms_list_cms_sections."}, "address": {"type": "string", "description": "Replacement street or place address; cannot be cleared."}, "latitude": {"type": "number", "description": "Replacement latitude in decimal degrees."}, "longitude": {"type": "number", "description": "Replacement longitude in decimal degrees."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Replacement map point deck HTML."}, "slug": {"type": "string", "maxLength": 500000, "description": "Replacement URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Replacement SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this map item."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Replacement publication status."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date. Send an empty string to clear an existing scheduled unpublication."}, "email": {"type": "string", "description": "Replacement contact email for the map point."}, "phoneNumber": {"type": "string", "description": "Replacement contact phone number for the map point."}, "website": {"type": "string", "description": "Replacement website URL for the map point."}, "useThumbAsPinIcon": {"type": "boolean", "description": "Whether the map item thumbnail is used as the map pin icon."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Replacement paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["id"]}, "annotations": {"title": "Update map", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_map", "title": "Delete map", "description": "Delete one CMS map item for the current app by map item id. Use cms_get_map or cms_list_maps first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}}, "required": ["id"]}, "annotations": {"title": "Delete map", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_map_paragraphs", "title": "List map paragraphs", "description": "List body paragraphs for one CMS map item, sorted by paragraph position.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}}, "required": ["id"]}, "annotations": {"title": "List map paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_map_paragraph", "title": "Create map paragraph", "description": "Create one body paragraph under a CMS map item. Paragraph type must be text, photo, quote, or embed. Required fields depend on the paragraph type.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "type": {"type": "string", "enum": ["text", "photo", "quote", "embed"], "description": "Paragraph body-block kind."}, "position": {"type": "integer", "minimum": 1, "description": "Optional 1-based insert position; omit to append."}, "content": {"type": "string", "description": "Required for text and quote paragraphs."}, "caption": {"type": "string", "description": "Optional caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Required embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "originalThumbnail": {"type": "string", "description": "Required image URL, data URI, or base64 source for photo paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the map item thumbnail."}}, "required": ["id", "type"]}, "annotations": {"title": "Create map paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_get_map_paragraph", "title": "Get map paragraph", "description": "Retrieve one body paragraph by map item id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_map_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Get map paragraph", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_map_paragraph", "title": "Update map paragraph", "description": "Update one body paragraph under a CMS map item. Provide at least one paragraph field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_map_paragraphs."}, "content": {"type": "string", "description": "Replacement text HTML or quote body, depending on paragraph type."}, "caption": {"type": "string", "description": "Replacement caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Replacement embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the map item thumbnail."}, "originalThumbnail": {"type": "string", "description": "Replacement image URL, data URI, or base64 source for photo paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Update map paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_map_paragraph", "title": "Delete map paragraph", "description": "Delete one body paragraph from a CMS map item by map item id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_map_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Delete map paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_reorder_map_paragraphs", "title": "Reorder map paragraphs", "description": "Reorder all body paragraphs for one CMS map item. Pass a full ordered list of paragraph ids.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Map item id returned by cms_list_maps."}, "paragraph_ids": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Full ordered list of paragraph ids for this map item."}}, "required": ["id", "paragraph_ids"]}, "annotations": {"title": "Reorder map paragraphs", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_events", "title": "List events", "description": "List CMS agenda event items for the current app. Optionally filter by one or more category ids (use cms_list_cms_sections with type='agenda' first to discover them); omit category to list across every event category. Also filter by publication status.", "inputSchema": {"type": "object", "properties": {"category": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional event category ids returned by cms_list_cms_sections. Omit to list across all categories."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of events per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional event ids to filter the list."}, "status": {"type": "string", "enum": ["draft", "published", "stock", "scheduled"], "description": "Optional publication status filter. Omit to list every non-deleted item in scope."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the event list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the event list."}}, "required": []}, "annotations": {"title": "List events", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_event", "title": "Get event", "description": "Retrieve one CMS agenda event for the current app by event id. Use cms_list_events first when the event id is unknown. The response fields accessTier and maxFreeParagraphs apply only to in-app-purchase items: maxFreeParagraphs is the number of body paragraphs shown as a free preview before purchase.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}}, "required": ["id"]}, "annotations": {"title": "Get event", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_event", "title": "Create event", "description": "Create one CMS agenda event for the current app. Use cms_list_cms_sections with type='agenda' first to discover event category ids. sortDate is the event start and endDate the event end.", "inputSchema": {"type": "object", "properties": {"title": {"type": "string", "maxLength": 250, "description": "Event headline shown in feeds and on the item page."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Event category ids returned by cms_list_cms_sections."}, "sortDate": {"type": "string", "format": "date-time", "description": "Event start datetime in RFC 3339 format with timezone."}, "endDate": {"type": "string", "format": "date-time", "description": "Event end datetime in RFC 3339 format with timezone."}, "allDay": {"type": "boolean", "description": "Whether the event lasts the whole day."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Optional event deck HTML."}, "date": {"type": "string", "format": "date-time", "description": "Optional editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Optional URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Optional SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this event."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Publication status. Omit to default to published."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date in RFC 3339 format."}, "urlShop": {"type": "string", "description": "Optional ticketing or shop URL for the event."}, "urlEvent": {"type": "string", "description": "Optional official event info URL."}, "address": {"type": "string", "description": "Optional venue address for the event."}, "email": {"type": "string", "description": "Optional organizer contact email."}, "phoneNumber": {"type": "string", "description": "Optional organizer contact phone number."}, "latitude": {"type": "number", "description": "Optional venue latitude in decimal degrees."}, "longitude": {"type": "number", "description": "Optional venue longitude in decimal degrees."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["title", "categories", "sortDate", "endDate"]}, "annotations": {"title": "Create event", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_update_event", "title": "Update event", "description": "Update one CMS agenda event for the current app by event id. Provide at least one field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "title": {"type": "string", "maxLength": 250, "description": "Replacement event headline."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Replacement event category ids returned by cms_list_cms_sections."}, "sortDate": {"type": "string", "format": "date-time", "description": "Replacement event start datetime in RFC 3339 format with timezone."}, "endDate": {"type": "string", "format": "date-time", "description": "Replacement event end datetime in RFC 3339 format with timezone."}, "allDay": {"type": "boolean", "description": "Whether the event lasts the whole day."}, "leadin": {"type": "string", "maxLength": 500000, "description": "Replacement event deck HTML."}, "date": {"type": "string", "format": "date-time", "description": "Replacement editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Replacement URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Replacement SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this event."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Replacement publication status."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date. Send an empty string to clear an existing scheduled unpublication."}, "urlShop": {"type": "string", "description": "Replacement ticketing or shop URL for the event."}, "urlEvent": {"type": "string", "description": "Replacement official event info URL."}, "address": {"type": "string", "description": "Replacement venue address for the event."}, "email": {"type": "string", "description": "Replacement organizer contact email."}, "phoneNumber": {"type": "string", "description": "Replacement organizer contact phone number."}, "latitude": {"type": "number", "description": "Replacement venue latitude in decimal degrees."}, "longitude": {"type": "number", "description": "Replacement venue longitude in decimal degrees."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Replacement paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["id"]}, "annotations": {"title": "Update event", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_event", "title": "Delete event", "description": "Delete one CMS agenda event for the current app by event id. Use cms_get_event or cms_list_events first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}}, "required": ["id"]}, "annotations": {"title": "Delete event", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_event_paragraphs", "title": "List event paragraphs", "description": "List body paragraphs for one CMS agenda event, sorted by paragraph position.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}}, "required": ["id"]}, "annotations": {"title": "List event paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_event_paragraph", "title": "Create event paragraph", "description": "Create one body paragraph under a CMS agenda event. Paragraph type must be text, photo, quote, or embed. Required fields depend on the paragraph type.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "type": {"type": "string", "enum": ["text", "photo", "quote", "embed"], "description": "Paragraph body-block kind."}, "position": {"type": "integer", "minimum": 1, "description": "Optional 1-based insert position; omit to append."}, "content": {"type": "string", "description": "Required for text and quote paragraphs."}, "caption": {"type": "string", "description": "Optional caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Required embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "originalThumbnail": {"type": "string", "description": "Required image URL, data URI, or base64 source for photo paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the event thumbnail."}}, "required": ["id", "type"]}, "annotations": {"title": "Create event paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_get_event_paragraph", "title": "Get event paragraph", "description": "Retrieve one body paragraph by event id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_event_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Get event paragraph", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_event_paragraph", "title": "Update event paragraph", "description": "Update one body paragraph under a CMS agenda event. Provide at least one paragraph field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_event_paragraphs."}, "content": {"type": "string", "description": "Replacement text HTML or quote body, depending on paragraph type."}, "caption": {"type": "string", "description": "Replacement caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Replacement embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the event thumbnail."}, "originalThumbnail": {"type": "string", "description": "Replacement image URL, data URI, or base64 source for photo paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Update event paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_event_paragraph", "title": "Delete event paragraph", "description": "Delete one body paragraph from a CMS agenda event by event id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_event_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Delete event paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_reorder_event_paragraphs", "title": "Reorder event paragraphs", "description": "Reorder all body paragraphs for one CMS agenda event. Pass a full ordered list of paragraph ids.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Event id returned by cms_list_events."}, "paragraph_ids": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Full ordered list of paragraph ids for this event."}}, "required": ["id", "paragraph_ids"]}, "annotations": {"title": "Reorder event paragraphs", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_photos", "title": "List photos", "description": "List CMS photo gallery items for the current app. Optionally filter by one photo gallery section (use cms_list_cms_sections with type='photo' first to discover the section id); omit section to list across every photo gallery.", "inputSchema": {"type": "object", "properties": {"section": {"type": "integer", "minimum": 1, "description": "Optional photo gallery section id returned by cms_list_cms_sections. Omit to list across all galleries."}, "status": {"type": "string", "enum": ["published", "stock"], "description": "Optional publication status filter."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of photos per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional photo item ids to filter the list."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the photo list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the photo list."}}, "required": []}, "annotations": {"title": "List photos", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_photo", "title": "Get photo", "description": "Retrieve one CMS photo gallery item for the current app by photo id. Use cms_list_photos first when the photo id is unknown.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Photo item id returned by cms_list_photos."}}, "required": ["id"]}, "annotations": {"title": "Get photo", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_photos", "title": "Create photos", "description": "Upload one or more images to a CMS photo gallery section as a single batch. Use cms_list_cms_sections with type='photo' first to discover the photo section id. Each upload returns its own gallery photo item. Optional titles, contents, and photo_statuses arrays apply by photo order.", "inputSchema": {"type": "object", "properties": {"section": {"type": "integer", "minimum": 1, "description": "Photo gallery section id returned by cms_list_cms_sections."}, "photos": {"type": "array", "minItems": 1, "maxItems": 10, "items": {"type": "object", "properties": {"image": {"type": "string", "minLength": 1, "description": "Image source: public URL, data URI, or base64 raster payload."}}, "required": ["image"], "additionalProperties": false}, "description": "Up to 10 images to upload in one batch."}, "titles": {"type": "array", "maxItems": 10, "items": {"type": "string"}, "description": "Optional photo titles in the same order as photos. Omit an item or send an empty string for photos without a title."}, "contents": {"type": "array", "maxItems": 10, "items": {"type": "string"}, "description": "Optional photo descriptions or captions in the same order as photos. Omit an item or send an empty string for photos without content."}, "photo_statuses": {"type": "array", "maxItems": 10, "items": {"type": "string", "enum": ["published", "stock"]}, "description": "Optional per-photo publication statuses in the same order as photos. Each item overrides the batch status for that photo."}, "status": {"type": "string", "enum": ["published", "stock"], "description": "Optional batch publication status applied to every photo without its own status. Omit to default to published."}}, "required": ["section", "photos"], "additionalProperties": false}, "annotations": {"title": "Create photos", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_update_photo", "title": "Update photo", "description": "Update one CMS photo gallery item for the current app by photo id. Provide at least one field to change. Image bytes cannot be changed; delete then re-upload to replace an image.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Photo item id returned by cms_list_photos."}, "title": {"type": "string", "description": "Replacement photo title."}, "content": {"type": "string", "description": "Replacement photo description or caption. Send an empty string to clear the stored description."}, "status": {"type": "string", "enum": ["published", "stock"], "description": "Replacement publication status."}}, "required": ["id"]}, "annotations": {"title": "Update photo", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_photo", "title": "Delete photo", "description": "Delete one CMS photo gallery item for the current app by photo id. Use cms_get_photo or cms_list_photos first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Photo item id returned by cms_list_photos."}}, "required": ["id"]}, "annotations": {"title": "Delete photo", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_videos", "title": "List videos", "description": "List CMS video items for the current app. Optionally filter by one or more category ids (use cms_list_cms_sections with type='video' first to discover them); omit category to list across every video category. Also filter by publication status.", "inputSchema": {"type": "object", "properties": {"category": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional video category ids returned by cms_list_cms_sections. Omit to list across all categories."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of videos per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional video item ids to filter the list."}, "status": {"type": "string", "enum": ["draft", "published", "stock", "scheduled"], "description": "Optional publication status filter. Omit to list every non-deleted item in scope."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the video list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the video list."}}, "required": []}, "annotations": {"title": "List videos", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_video", "title": "Get video", "description": "Retrieve one CMS video item for the current app by video id. Use cms_list_videos first when the video id is unknown. The response fields accessTier and maxFreeParagraphs apply only to in-app-purchase items: maxFreeParagraphs is the number of body paragraphs shown as a free preview before purchase.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}}, "required": ["id"]}, "annotations": {"title": "Get video", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_video", "title": "Create video", "description": "Create one CMS video item for the current app. The video player is the embedUrl iframe HTML. Use cms_list_cms_sections with type='video' first to discover video category ids.", "inputSchema": {"type": "object", "properties": {"title": {"type": "string", "maxLength": 250, "description": "Video headline shown in feeds and on the item page."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Video category ids returned by cms_list_cms_sections."}, "embedUrl": {"type": "string", "description": "Video player iframe or embed HTML. Set an explicit iframe width and height (for example 100%) so the player renders at a visible size."}, "author": {"type": "string", "maxLength": 255, "description": "Optional byline or author display name. If omitted, the app account holder's name is used."}, "date": {"type": "string", "format": "date-time", "description": "Optional editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Optional URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Optional SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this video."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Publication status. Omit to default to published."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date in RFC 3339 format."}, "pinned": {"type": "boolean", "description": "Whether the video is pinned in its category listing."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["title", "categories", "embedUrl"]}, "annotations": {"title": "Create video", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_update_video", "title": "Update video", "description": "Update one CMS video item for the current app by video id. Provide at least one field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "title": {"type": "string", "maxLength": 250, "description": "Replacement video headline."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Replacement video category ids returned by cms_list_cms_sections."}, "embedUrl": {"type": "string", "description": "Replacement video player iframe or embed HTML. Set an explicit iframe width and height (for example 100%) so the player renders at a visible size."}, "author": {"type": "string", "maxLength": 255, "description": "Replacement byline or author display name."}, "date": {"type": "string", "format": "date-time", "description": "Replacement editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Replacement URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Replacement SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this video."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Replacement publication status."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date. Send an empty string to clear an existing scheduled unpublication."}, "pinned": {"type": "boolean", "description": "Whether the video is pinned in its category listing."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Replacement paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["id"]}, "annotations": {"title": "Update video", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_video", "title": "Delete video", "description": "Delete one CMS video item for the current app by video id. Use cms_get_video or cms_list_videos first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}}, "required": ["id"]}, "annotations": {"title": "Delete video", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_video_paragraphs", "title": "List video paragraphs", "description": "List body paragraphs for one CMS video item, sorted by paragraph position.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}}, "required": ["id"]}, "annotations": {"title": "List video paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_video_paragraph", "title": "Create video paragraph", "description": "Create one body paragraph under a CMS video item. Paragraph type must be text, photo, or quote. Video items have no embed paragraph; the player is set via the video item embedUrl.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "type": {"type": "string", "enum": ["text", "photo", "quote"], "description": "Paragraph body-block kind."}, "position": {"type": "integer", "minimum": 1, "description": "Optional 1-based insert position; omit to append."}, "content": {"type": "string", "description": "Required for text and quote paragraphs."}, "caption": {"type": "string", "description": "Optional caption for photo paragraphs."}, "originalThumbnail": {"type": "string", "description": "Required image URL, data URI, or base64 source for photo paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the video thumbnail."}}, "required": ["id", "type"]}, "annotations": {"title": "Create video paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_get_video_paragraph", "title": "Get video paragraph", "description": "Retrieve one body paragraph by video id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_video_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Get video paragraph", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_video_paragraph", "title": "Update video paragraph", "description": "Update one body paragraph under a CMS video item. Provide at least one paragraph field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_video_paragraphs."}, "content": {"type": "string", "description": "Replacement text HTML or quote body, depending on paragraph type."}, "caption": {"type": "string", "description": "Replacement caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Replacement iframe or embed HTML for embed paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the video thumbnail."}, "originalThumbnail": {"type": "string", "description": "Replacement image URL, data URI, or base64 source for photo paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Update video paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_video_paragraph", "title": "Delete video paragraph", "description": "Delete one body paragraph from a CMS video item by video id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_video_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Delete video paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_reorder_video_paragraphs", "title": "Reorder video paragraphs", "description": "Reorder all body paragraphs for one CMS video item. Pass a full ordered list of paragraph ids. The primary video block (the native player paragraph) is locked at position 1 \u2014 it must be the first id in the list.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Video item id returned by cms_list_videos."}, "paragraph_ids": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Full ordered list of paragraph ids for this video item. The primary video block must be the first id."}}, "required": ["id", "paragraph_ids"]}, "annotations": {"title": "Reorder video paragraphs", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_sounds", "title": "List sounds", "description": "List CMS sound items for the current app. Optionally filter by one or more category ids (use cms_list_cms_sections with type='sound' first to discover them); omit category to list across every sound category. Also filter by publication status.", "inputSchema": {"type": "object", "properties": {"category": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional sound category ids returned by cms_list_cms_sections. Omit to list across all categories."}, "search": {"type": "array", "items": {"type": "string"}, "description": "Optional title search terms."}, "page": {"type": "integer", "minimum": 1, "maximum": 10000, "description": "Page index."}, "per_page": {"type": "integer", "minimum": 1, "maximum": 100, "description": "Number of sounds per page."}, "id": {"type": "array", "items": {"type": "integer", "minimum": 1}, "description": "Optional sound item ids to filter the list."}, "status": {"type": "string", "enum": ["draft", "published", "stock", "scheduled"], "description": "Optional publication status filter. Omit to list every non-deleted item in scope."}, "sort": {"type": "string", "enum": ["recent", "alpha"], "description": "Sort field for the sound list."}, "order": {"type": "string", "enum": ["ASC", "DESC"], "description": "Sort order for the sound list."}}, "required": []}, "annotations": {"title": "List sounds", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_get_sound", "title": "Get sound", "description": "Retrieve one CMS sound item for the current app by sound id. Use cms_list_sounds first when the sound id is unknown. The response fields accessTier and maxFreeParagraphs apply only to in-app-purchase items: maxFreeParagraphs is the number of body paragraphs shown as a free preview before purchase.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}}, "required": ["id"]}, "annotations": {"title": "Get sound", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_sound", "title": "Update sound", "description": "Update one CMS sound item for the current app by sound id. Provide at least one field to change. The audio file cannot be changed through this tool.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "title": {"type": "string", "maxLength": 250, "description": "Replacement sound headline."}, "categories": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Replacement sound category ids returned by cms_list_cms_sections."}, "author": {"type": "string", "maxLength": 255, "description": "Replacement byline or author display name."}, "date": {"type": "string", "format": "date-time", "description": "Replacement editorial date in RFC 3339 format."}, "slug": {"type": "string", "maxLength": 500000, "description": "Replacement URL slug; the server may normalize it."}, "meta": {"type": "object", "additionalProperties": false, "properties": {"title": {"type": "string", "maxLength": 250}, "description": {"type": "string", "maxLength": 500000}}, "description": "Replacement SEO metadata."}, "commentsEnabled": {"type": "boolean", "description": "Whether end-user comments are enabled for this sound."}, "status": {"type": "string", "enum": ["published", "draft", "stock"], "description": "Replacement publication status."}, "publishedDate": {"type": "string", "format": "date-time", "description": "Optional future publication date. Requires status='stock' when provided."}, "publicationEndDate": {"type": "string", "format": "date-time", "description": "Optional future unpublication date. Send an empty string to clear an existing scheduled unpublication."}, "pinned": {"type": "boolean", "description": "Whether the sound is pinned in its category listing."}, "purchaseUrl": {"type": "string", "description": "Replacement purchase or storefront URL (default / iOS)."}, "purchaseUrlAndroid": {"type": "string", "description": "Replacement Android-specific purchase URL."}, "accessTier": {"type": "string", "enum": ["free", "premium"], "description": "Replacement paywall tier. 'premium' locks the item behind an in-app purchase; 'free' leaves it open. Applies only to apps that sell in-app purchases."}}, "required": ["id"]}, "annotations": {"title": "Update sound", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_sound", "title": "Delete sound", "description": "Delete one CMS sound item for the current app by sound id. Use cms_get_sound or cms_list_sounds first to confirm the target.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}}, "required": ["id"]}, "annotations": {"title": "Delete sound", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_list_sound_paragraphs", "title": "List sound paragraphs", "description": "List body paragraphs for one CMS sound item, sorted by paragraph position.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}}, "required": ["id"]}, "annotations": {"title": "List sound paragraphs", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_create_sound_paragraph", "title": "Create sound paragraph", "description": "Create one body paragraph under a CMS sound item. Paragraph type must be text, photo, quote, or embed. Required fields depend on the paragraph type.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "type": {"type": "string", "enum": ["text", "photo", "quote", "embed"], "description": "Paragraph body-block kind."}, "position": {"type": "integer", "minimum": 1, "description": "Optional 1-based insert position; omit to append."}, "content": {"type": "string", "description": "Required for text and quote paragraphs."}, "caption": {"type": "string", "description": "Optional caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Required embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "originalThumbnail": {"type": "string", "description": "Required image URL, data URI, or base64 source for photo paragraphs."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the sound thumbnail."}}, "required": ["id", "type"]}, "annotations": {"title": "Create sound paragraph", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_get_sound_paragraph", "title": "Get sound paragraph", "description": "Retrieve one body paragraph by sound id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_sound_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Get sound paragraph", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_update_sound_paragraph", "title": "Update sound paragraph", "description": "Update one body paragraph under a CMS sound item. Provide at least one paragraph field to change.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_sound_paragraphs."}, "content": {"type": "string", "description": "Replacement text HTML or quote body, depending on paragraph type."}, "caption": {"type": "string", "description": "Replacement caption for photo paragraphs."}, "embedUrl": {"type": "string", "description": "Replacement embed HTML for embed paragraphs. Set an explicit iframe width and height (for example 100%) so the block renders at a visible size."}, "isThumbnail": {"type": "boolean", "description": "Whether a photo paragraph should be used as the sound thumbnail."}, "originalThumbnail": {"type": "string", "description": "Replacement image URL, data URI, or base64 source for photo paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Update sound paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "cms_delete_sound_paragraph", "title": "Delete sound paragraph", "description": "Delete one body paragraph from a CMS sound item by sound id and paragraph id.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "paragraph_id": {"type": "integer", "minimum": 1, "description": "Paragraph id returned by cms_list_sound_paragraphs."}}, "required": ["id", "paragraph_id"]}, "annotations": {"title": "Delete sound paragraph", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "cms_reorder_sound_paragraphs", "title": "Reorder sound paragraphs", "description": "Reorder all body paragraphs for one CMS sound item. Pass a full ordered list of paragraph ids. The primary sound block (the native audio paragraph) is locked at position 1 \u2014 it must be the first id in the list.", "inputSchema": {"type": "object", "properties": {"id": {"type": "integer", "minimum": 1, "description": "Sound item id returned by cms_list_sounds."}, "paragraph_ids": {"type": "array", "minItems": 1, "items": {"type": "integer", "minimum": 1}, "description": "Full ordered list of paragraph ids for this sound item. The primary sound block must be the first id."}}, "required": ["id", "paragraph_ids"]}, "annotations": {"title": "Reorder sound paragraphs", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_create_push_broadcast", "title": "Create push broadcast", "description": "Send a push notification broadcast to all app users.", "inputSchema": {"type": "object", "properties": {"platform": {"description": "Platform targeted by the push notification. Use a single value or an array to target multiple platforms in one notification, for example ['ios', 'pwa'].", "oneOf": [{"type": "string", "enum": ["all", "pwa", "ios", "android"]}, {"type": "array", "items": {"type": "string", "enum": ["pwa", "ios", "android"]}, "minItems": 1, "uniqueItems": true}], "default": "all"}, "message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url; use section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. Must be an off-app URL, not a CMS/app content URL from this project."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types. Match titles case-insensitively and ask the user for an id only if nothing matches."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "filters": {"type": "object", "description": "Optional recipient filters. Use native for iOS/Android criteria and pwa for PWA criteria.", "properties": {"native": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "zones": {"type": "array", "items": {"type": "object", "properties": {"lat": {"type": "number"}, "lng": {"type": "number"}, "radius": {"type": "number", "description": "Radius in metric meters."}}, "required": ["lat", "lng", "radius"]}, "description": "Geolocation zones for native devices."}, "no_push": {"type": "boolean", "description": "When true, targets users who never received push notifications."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}, "pwa": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}}, "required": []}}, "required": ["message"]}, "annotations": {"title": "Create push broadcast", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_list_downloads", "title": "List downloads", "description": "List app download statistics.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "ISO date (YYYY-MM-DD)"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List downloads", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_downloads_global", "title": "List downloads global", "description": "List global (all-time) app download statistics.", "inputSchema": {"type": "object", "properties": {}, "required": []}, "annotations": {"title": "List downloads global", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_launches", "title": "List launches", "description": "List app launch statistics.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List launches", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_unique_launches", "title": "List unique launches", "description": "List unique app launch statistics.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List unique launches", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_page_views", "title": "List page views", "description": "List page view statistics.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List page views", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_page_views_per_weekday", "title": "List page views per weekday", "description": "List page views broken down by day of the week.", "inputSchema": {"type": "object", "properties": {}, "required": []}, "annotations": {"title": "List page views per weekday", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_session_times", "title": "List session times", "description": "List session time statistics.", "inputSchema": {"type": "object", "properties": {"start_date": {"type": "string", "description": "YYYY-MM-DD"}, "end_date": {"type": "string", "description": "YYYY-MM-DD"}}, "required": []}, "annotations": {"title": "List session times", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_devices_global", "title": "List devices global", "description": "List global device distribution statistics.", "inputSchema": {"type": "object", "properties": {}, "required": []}, "annotations": {"title": "List devices global", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_os_versions_global", "title": "List OS versions global", "description": "List global OS version distribution statistics.", "inputSchema": {"type": "object", "properties": {"platform": {"type": "string", "enum": ["android", "html5", "ipad", "iphone"]}}, "required": ["platform"]}, "annotations": {"title": "List OS versions global", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_mobile_os_distribution", "title": "List mobile OS distribution", "description": "List mobile OS distribution statistics.", "inputSchema": {"type": "object", "properties": {}, "required": []}, "annotations": {"title": "List mobile OS distribution", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_v3_create_push_notification", "title": "V3 create push notification", "description": "Send a Classic v3 push notification with optional user targeting, scheduling, and tap action.", "inputSchema": {"type": "object", "properties": {"platform": {"description": "Platform targeted by the push notification. Use a single value or an array to target multiple platforms in one notification, for example ['ios', 'pwa'].", "oneOf": [{"type": "string", "enum": ["all", "pwa", "ios", "android"]}, {"type": "array", "items": {"type": "string", "enum": ["pwa", "ios", "android"]}, "minItems": 1, "uniqueItems": true}], "default": "all"}, "message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url; use section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. Must be an off-app URL, not a CMS/app content URL from this project."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types. Match titles case-insensitively and ask the user for an id only if nothing matches."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "targeting": {"type": "object", "description": "Optional user targeting. If omitted, sends to all eligible push recipients.", "properties": {"user_ids": {"oneOf": [{"type": "integer"}, {"type": "array", "items": {"type": "integer"}}], "description": "One user ID or a list of user IDs resolved from this app's user, customer, prospect, or subscription list tools."}, "user_id": {"type": "integer", "description": "Alias for a single user ID."}, "subscription_status": {"type": "string", "enum": ["ACTIVE", "EXPIRED", "NOT_ACTIVE"], "description": "Classic v3 subscription audience. ACTIVE targets active subscribers, EXPIRED targets expired subscribers, and NOT_ACTIVE targets users without an active subscription. Interpret plain 'subscribers' as ACTIVE; expired subscribers must be explicit; users without a subscription map to NOT_ACTIVE. Cannot be combined with user_ids, platform targeting, or filters."}}, "required": []}, "filters": {"type": "object", "description": "Optional recipient filters. Use native for iOS/Android criteria and pwa for PWA criteria.", "properties": {"native": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "zones": {"type": "array", "items": {"type": "object", "properties": {"lat": {"type": "number"}, "lng": {"type": "number"}, "radius": {"type": "number", "description": "Radius in metric meters."}}, "required": ["lat", "lng", "radius"]}, "description": "Geolocation zones for native devices."}, "no_push": {"type": "boolean", "description": "When true, targets users who never received push notifications."}}, "required": []}, "pwa": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}}, "required": []}}, "required": []}}, "required": ["message"]}, "annotations": {"title": "V3 create push notification", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_validate_jwt", "title": "Validate JWT", "description": "Validate a front-end JWT for a Classic app user.", "inputSchema": {"type": "object", "properties": {"jwt": {"type": "string"}}, "required": ["jwt"]}, "annotations": {"title": "Validate JWT", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_prospects", "title": "List prospects", "description": "List all prospects (Memberships).", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}}, "required": []}, "annotations": {"title": "List prospects", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_get_prospect", "title": "Get prospect", "description": "Retrieve a specific prospect (Memberships).", "inputSchema": {"type": "object", "properties": {"prospect_id": {"type": "string"}}, "required": ["prospect_id"]}, "annotations": {"title": "Get prospect", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_update_prospect_note", "title": "Update prospect note", "description": "Update the internal note on a prospect (Memberships).", "inputSchema": {"type": "object", "properties": {"prospect_id": {"type": "string"}, "internal_note": {"type": "string"}}, "required": ["prospect_id", "internal_note"]}, "annotations": {"title": "Update prospect note", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_active_subscriptions", "title": "List active subscriptions", "description": "List all active subscriptions (Memberships).", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}}, "required": []}, "annotations": {"title": "List active subscriptions", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_get_active_subscription", "title": "Get active subscription", "description": "Retrieve an active subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}}, "required": ["subscription_id"]}, "annotations": {"title": "Get active subscription", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_update_active_subscription_note", "title": "Update active subscription note", "description": "Update the internal note on an active subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}, "internal_note": {"type": "string"}}, "required": ["subscription_id", "internal_note"]}, "annotations": {"title": "Update active subscription note", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_list_expired_subscriptions", "title": "List expired subscriptions", "description": "List all expired subscriptions (Memberships).", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}}, "required": []}, "annotations": {"title": "List expired subscriptions", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_get_expired_subscription", "title": "Get expired subscription", "description": "Retrieve an expired subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}}, "required": ["subscription_id"]}, "annotations": {"title": "Get expired subscription", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_update_expired_subscription_note", "title": "Update expired subscription note", "description": "Update the internal note on an expired subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}, "internal_note": {"type": "string"}}, "required": ["subscription_id", "internal_note"]}, "annotations": {"title": "Update expired subscription note", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_create_internal_subscription", "title": "Create internal subscription", "description": "Create an internal (manually granted) subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"user_id": {"type": "string"}, "expiration_date": {"type": ["string", "null"], "description": "ISO datetime or null for unlimited"}, "expires_at": {"type": "string", "description": "Alias for expiration_date."}}, "required": ["user_id", "expiration_date"]}, "annotations": {"title": "Create internal subscription", "readOnlyHint": false, "destructiveHint": false, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_get_internal_subscription", "title": "Get internal subscription", "description": "Retrieve an internal subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}}, "required": ["subscription_id"]}, "annotations": {"title": "Get internal subscription", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_update_internal_subscription", "title": "Update internal subscription", "description": "Update an internal subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}, "expiration_date": {"type": "string"}, "expires_at": {"type": "string", "description": "Alias for expiration_date."}, "internal_note": {"type": "string", "description": "Private staff-only note attached to the subscription; not shown to the end user."}, "note": {"type": "string", "description": "Alias for internal_note."}}, "required": ["subscription_id"]}, "annotations": {"title": "Update internal subscription", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_delete_internal_subscription", "title": "Delete internal subscription", "description": "Delete an internal subscription (Memberships).", "inputSchema": {"type": "object", "properties": {"subscription_id": {"type": "string"}}, "required": ["subscription_id"]}, "annotations": {"title": "Delete internal subscription", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_v1_create_push_notification", "title": "V1 create push notification", "description": "Send a Classic v1 push notification with optional user targeting, scheduling, and tap action.", "inputSchema": {"type": "object", "properties": {"platform": {"description": "Platform targeted by the push notification. Use a single value or an array to target multiple platforms in one notification, for example ['ios', 'pwa'].", "oneOf": [{"type": "string", "enum": ["all", "pwa", "ios", "android"]}, {"type": "array", "items": {"type": "string", "enum": ["pwa", "ios", "android"]}, "minItems": 1, "uniqueItems": true}], "default": "all"}, "message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url; use section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. Must be an off-app URL, not a CMS/app content URL from this project."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types. Match titles case-insensitively and ask the user for an id only if nothing matches."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "targeting": {"type": "object", "description": "Optional user targeting. If omitted, sends to all eligible push recipients.", "properties": {"user_ids": {"oneOf": [{"type": "integer"}, {"type": "array", "items": {"type": "integer"}}], "description": "One user ID or a list of user IDs resolved from this app's user, customer, prospect, or subscription list tools."}, "user_id": {"type": "integer", "description": "Alias for a single user ID."}}, "required": []}, "filters": {"type": "object", "description": "Optional recipient filters. Use native for iOS/Android criteria and pwa for PWA criteria.", "properties": {"native": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "zones": {"type": "array", "items": {"type": "object", "properties": {"lat": {"type": "number"}, "lng": {"type": "number"}, "radius": {"type": "number", "description": "Radius in metric meters."}}, "required": ["lat", "lng", "radius"]}, "description": "Geolocation zones for native devices."}, "no_push": {"type": "boolean", "description": "When true, targets users who never received push notifications."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}, "pwa": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}}, "required": []}}, "required": ["message"]}, "annotations": {"title": "V1 create push notification", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_create_push_by_groups", "title": "Create push by groups", "description": "Send a push notification to specific user groups.", "inputSchema": {"type": "object", "properties": {"platform": {"description": "Platform targeted by the push notification. Use a single value or an array to target multiple platforms in one notification, for example ['ios', 'pwa'].", "oneOf": [{"type": "string", "enum": ["all", "pwa", "ios", "android"]}, {"type": "array", "items": {"type": "string", "enum": ["pwa", "ios", "android"]}, "minItems": 1, "uniqueItems": true}], "default": "all"}, "message": {"type": "string", "maxLength": 255, "description": "Content of the push notification (max 255 characters)."}, "send": {"type": "string", "enum": ["now", "at"], "description": "Optional send timing. Omit or use 'now' for immediate send; use 'at' together with send_at for a delayed send."}, "send_at": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}[+-]\\d{2}:\\d{2}$", "description": "Timezone-aware datetime for send='at'. Use YYYY-MM-DDTHH:MM+HH:MM in the MCP client user's timezone, for example 2026-05-28T09:30+02:00."}, "use_local_time": {"type": "boolean", "description": "Optional, advanced. Omit it for normal scheduling; the tool converts send_at to UTC so the push fires at that instant. Set true only when the user explicitly wants delivery at the given wall-clock time in each recipient's own timezone."}, "action_type": {"type": "string", "enum": ["open_app", "external_link", "section"], "description": "Optional tap action. Omit or use open_app to open the app. Use external_link with action_url; use section with section_id."}, "action_url": {"type": "string", "description": "URL for action_type='external_link'. Must be an off-app URL, not a CMS/app content URL from this project."}, "section_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Section id for action_type='section'. When the user names a section, first call cms_list_cms_sections with types article, photo, video, sound, maps, and agenda; if no match, call cms_list_sections with the same types. Match titles case-insensitively and ask the user for an id only if nothing matches."}, "item_id": {"oneOf": [{"type": "integer"}, {"type": "string"}], "description": "Optional item id for section actions. Include it only when the parent section was resolved from cms_list_cms_sections; otherwise open the section without item_id."}, "groups": {"type": "array", "items": {"type": "integer"}}, "filters": {"type": "object", "description": "Optional recipient filters. Use native for iOS/Android criteria and pwa for PWA criteria.", "properties": {"native": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "zones": {"type": "array", "items": {"type": "object", "properties": {"lat": {"type": "number"}, "lng": {"type": "number"}, "radius": {"type": "number", "description": "Radius in metric meters."}}, "required": ["lat", "lng", "radius"]}, "description": "Geolocation zones for native devices."}, "no_push": {"type": "boolean", "description": "When true, targets users who never received push notifications."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}, "pwa": {"type": "object", "properties": {"period_launch": {"type": "array", "items": {"type": "integer"}, "minItems": 2, "maxItems": 2, "description": "Range of app opens over the last 30 days, for example [1, 5]."}, "language": {"type": "string", "enum": ["ar", "de", "en", "es", "fr", "hi", "it", "nb", "nl", "pl", "pt", "sv", "zh"], "description": "Recipient device language."}, "groups": {"type": "array", "items": {"type": "integer"}, "description": "Classic v1 user group IDs."}}, "required": []}}, "required": []}}, "required": ["message", "groups"]}, "annotations": {"title": "Create push by groups", "readOnlyHint": false, "destructiveHint": true, "idempotentHint": false, "openWorldHint": true}}, {"name": "classic_list_user_groups", "title": "List user groups", "description": "List all user groups in the Community app.", "inputSchema": {"type": "object", "properties": {}, "required": []}, "annotations": {"title": "List user groups", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}, {"name": "classic_v1_list_user", "title": "V1 list user", "description": "List users in the Community app.", "inputSchema": {"type": "object", "properties": {"page": {"type": "integer"}, "count": {"type": "integer", "maximum": 100, "description": "Users per page. Maximum 100."}}, "required": []}, "annotations": {"title": "V1 list user", "readOnlyHint": true, "destructiveHint": false, "idempotentHint": true, "openWorldHint": true}}], "resources": [], "prompts": []}