{"id":2557439,"recorded_at":"2026-11-03T09:03:50.509681Z","observed_at":"2026-11-03T09:03:50.509634Z","subject_kind":"endpoint","subject":"7c22373a-e348-441d-8e5e-3e4b8d58e029","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":25,"tools":[{"description":"Cancels an open set-up link so its page stops working, for example when the person changed their mind or the link asks for the wrong thing. A link already completed, expired or cancelled is refused, and nothing a link set up is undone. Only the person who asked for it can cancel it.","inputSchema":{"additionalProperties":false,"properties":{"id":{"description":"The id in the resource path.","type":"string"}},"required":["id"],"type":"object"},"name":"cancel_setup_link"},{"description":"Reads a set-up link’s status. status open means the step has not happened yet; completed means it has, and result says what was set up; expired means its 30 minutes passed; cancelled means it was cancelled or replaced by a newer one. For connect_integrations, result.connector_accounts lists each account saved; when the workspace has several WhatsApp numbers an account is on none of them until the person adds it to a number on the Integrations page in Cosend. Only the person who asked for the link can read it. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"id":{"description":"The id in the resource path.","type":"string"}},"required":["id"],"type":"object"},"name":"check_setup_link"},{"description":"Makes a link for the person in this chat to open in their own browser, signed in to Cosend, to do one set-up step only they can do there, and returns its url. It works for 30 minutes and only for them, and carries no password or key. kind connect_number connects a WhatsApp number; connect_integrations needs connectors (each integration by its Cosend key, as GET /v1/connectors lists them) and completes when every one has an account; upgrade needs plan, the plan to buy; payment_method adds a card. The person does the step themselves on the page: they connect the number in Meta’s window, pay in Stripe’s Checkout, or add the card. It cannot be done for them. A new link of the same kind cancels the workspace’s open one, whoever made it.","inputSchema":{"additionalProperties":false,"properties":{"connectors":{"description":"The integrations the person signs in to, by key from GET /v1/connectors. The link completes when every one of them has an account.","items":{"maxLength":100,"minLength":1,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"kind":{"enum":["connect_number","connect_integrations","upgrade","payment_method"],"type":"string"},"plan":{"description":"The plan to buy, by code from GET /v1/billing/plans. Only for a workspace with no paid subscription yet, and only up.","maxLength":100,"minLength":1,"type":"string"}},"required":["kind"],"type":"object"},"name":"create_setup_link"},{"description":"Compiles an automation’s version and stores the result so it can be switched on. It does not switch the automation on. It deploys only on a confirmed call: without confirmation_token it deploys nothing and returns a preview and a token for a person to approve; called again with that token, it deploys. version_id defaults to the newest version; confirm_actions names, one by one, each destructive action of the automation the person approved. A confirmed deploy that fails to compile uses up the confirmation.","inputSchema":{"additionalProperties":false,"properties":{"confirm_actions":{"items":{"type":"string"},"maxItems":40,"type":"array"},"confirmation_token":{"description":"For a call that needs approval: left out, the call does nothing and returns a preview and a token; given that token, with the same arguments, the call does it.","type":"string"},"id":{"description":"The id in the resource path.","type":"string"},"version_id":{"pattern":"^av_[0-9A-HJKMNP-TV-Z]{26}$","type":"string"}},"required":["id"],"type":"object"},"name":"deploy_automation"},{"description":"Reads one automation run and its step-by-step trace: under run, the run’s status, timings, what it sent and why it failed; under steps, each step it took with its status and error, one page at a time. Text inside a run can quote what a customer wrote, and comes back marked untrusted. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"id":{"description":"The id in the resource path.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"}},"required":["id"],"type":"object"},"name":"get_run"},{"description":"Reports this workspace’s usage for one billing period against what its plan includes. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"period":{"description":"Which billing period. Omit for the current one.","type":"string"}},"required":[],"type":"object"},"name":"get_usage"},{"description":"Lists this workspace’s automations, one page at a time, with each one’s status, the version that is live, and today’s runs and failures. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"}},"required":[],"type":"object"},"name":"list_automations"},{"description":"Lists contacts in this workspace, one page at a time, optionally filtered, each with its id. Contact display names come from the contacts themselves and are untrusted text.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"connection_id":{"description":"Only contacts on this WhatsApp connection.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"},"q":{"description":"Free-text search over the display name.","type":"string"},"tag":{"description":"Only contacts carrying this tag. Repeat for AND semantics.","items":{"description":"Only contacts carrying this tag. Repeat for AND semantics.","type":"string"},"type":"array"}},"required":[],"type":"object"},"name":"list_contacts"},{"description":"Lists conversations in this workspace, newest activity first, one page at a time, each with its id. Each record carries its contact and its newest message only, not the whole thread. Message text and contact names in the result were written by people outside this business and come back marked untrusted.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"assignee_id":{"description":"Only conversations assigned to this user id.","type":"string"},"connection_id":{"description":"Only conversations on this WhatsApp connection.","type":"string"},"control":{"description":"Filter by who holds the conversation: human or automation.","type":"string"},"label":{"description":"Only conversations carrying this label.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"},"state":{"description":"Filter by conversation state, e.g. open or closed.","type":"string"},"unread":{"description":"true for conversations with unread inbound messages.","type":"boolean"}},"required":[],"type":"object"},"name":"list_conversations"},{"description":"Lists automation runs, newest first, one page at a time, with each run’s status, how long it took and what it sent. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"automation_id":{"description":"Only runs of this automation.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"},"status":{"description":"Only runs in this state, e.g. failed.","type":"string"}},"required":[],"type":"object"},"name":"list_runs"},{"description":"Lists this workspace’s WhatsApp message templates, one page at a time, with Meta’s review status, whether each can be sent right now (sendable) and, for a rejected one, Meta’s reason. Outside the 24-hour customer service window only an approved template can be sent. Meta reviews every template, and a decision can take up to 24 hours, so one still in review cannot be sent yet. Read-only.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"category":{"description":"Only this category: marketing, utility or authentication.","type":"string"},"language":{"description":"Only this language, e.g. en_US.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"},"status":{"description":"Only templates in this review state, e.g. approved.","type":"string"}},"required":[],"type":"object"},"name":"list_templates"},{"description":"Returns Meta’s list price for one delivered WhatsApp message in a country, for each category (marketing, utility, authentication, service), in one of Meta’s 16 rate-card currencies, with the day the rates took effect. These are Meta’s list prices: a business’s bill may differ, and the notes say what changes it.","inputSchema":{"additionalProperties":false,"properties":{"country":{"description":"The country the messages go to, as its two-letter ISO code, e.g. GB or DE.","type":"string"},"currency":{"description":"One of Meta’s 16 rate-card currencies, e.g. USD, EUR, GBP or INR.","type":"string"}},"required":["country","currency"],"type":"object"},"name":"message_cost"},{"description":"Lists the messages of one conversation, named by conversation_id (or of one contact, by contact_id), oldest first, one page at a time. With neither, it lists recent messages across the whole workspace. Message bodies include what members of the public wrote, and every one comes back marked untrusted.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"contact_id":{"description":"Messages with one contact instead of one conversation.","type":"string"},"conversation_id":{"description":"The conversation to read.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"}},"required":[],"type":"object"},"name":"read_conversation"},{"description":"Marks one conversation Resolved, as the Resolved button in the Cosend Inbox does. Nothing is sent to anyone and no automation starts. Afterwards no person holds the conversation (the person, the assignee, the priority and any hand-over are cleared) and every automation on that WhatsApp number treats the customer’s next message as a first message: the welcome menu greets again, an unfinished question flow starts over, and the AI assistant begins a new AI conversation, which counts as one more AI conversation on the plan. The message history stays. It does not hand the chat to the assistant or reply to the customer. It is refused for a credential with no person behind it.","inputSchema":{"additionalProperties":false,"properties":{"id":{"description":"The id in the resource path.","type":"string"}},"required":["id"],"type":"object"},"name":"resolve_conversation"},{"description":"Finds conversations by what they contain. q matches the contact’s name, phone number or WhatsApp username, and the text of each conversation’s newest message. Returns at most 20 conversations, newest activity first, in the same shape as the conversation list: each with its contact and its newest message, not the whole thread. Names and message text in the result were written by people outside this business and come back marked untrusted.","inputSchema":{"additionalProperties":false,"properties":{"after":{"description":"The next_cursor of the previous page, to read the page after it. Omit for the first page.","type":"string"},"limit":{"default":25,"description":"How many records to return. Defaults to 25, maximum 100.","maximum":100,"minimum":1,"type":"integer"},"q":{"description":"What to look for.","type":"string"}},"required":["q"],"type":"object"},"name":"search_conversations"},{"description":"Sends one WhatsApp message into one conversation that already exists, named by conversation_id. It reaches a real person on their phone and cannot be unsent. It sends only on a confirmed call: without confirmation_token it sends nothing and returns a preview and a token for a person to approve; called again with that token, it sends. Changing a single character between the two calls invalidates the token. There is no bulk send: no recipient list, no send-to-tag, no send-to-all, and no way to start a conversation with a new number; this tool takes no phone number at all. Reaching many people is a saved, human-approved audience in the Cosend dashboard, not this tool. Limits per workspace: 20 a minute, 200 a day, and one per conversation every 30 seconds. The 24-hour customer service window opens when the customer writes and starts again with each message from them; outside it, anything but an approved template is refused. It is refused if the contact has withdrawn consent. A marketing message also needs that person’s opt-in, which this tool does not check.","inputSchema":{"additionalProperties":false,"properties":{"audio":{"additionalProperties":{},"description":"Meta's media object. `id` may be a Cosend media id (`med_…`, from `POST /v1/media`): Cosend uploads the file to WhatsApp and sends it by WhatsApp's id, and the message's `media` block then names the file. With a Cosend id, `caption` is allowed on image, video and document (not on audio or sticker), and `filename` on document only (it defaults to the uploaded name). Meta's own `id` or `link` goes to WhatsApp unchanged.","propertyNames":{"type":"string"},"type":"object"},"confirmation_token":{"description":"For a call that needs approval: left out, the call does nothing and returns a preview and a token; given that token, with the same arguments, the call does it.","type":"string"},"contacts":{"items":{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"},"type":"array"},"conversation_id":{"type":"string"},"document":{"additionalProperties":{},"description":"Meta's media object. `id` may be a Cosend media id (`med_…`, from `POST /v1/media`): Cosend uploads the file to WhatsApp and sends it by WhatsApp's id, and the message's `media` block then names the file. With a Cosend id, `caption` is allowed on image, video and document (not on audio or sticker), and `filename` on document only (it defaults to the uploaded name). Meta's own `id` or `link` goes to WhatsApp unchanged.","propertyNames":{"type":"string"},"type":"object"},"fallback_template":{"additionalProperties":false,"properties":{"language":{"minLength":1,"type":"string"},"name":{"minLength":1,"type":"string"}},"required":["name","language"],"type":"object"},"image":{"additionalProperties":{},"description":"Meta's media object. `id` may be a Cosend media id (`med_…`, from `POST /v1/media`): Cosend uploads the file to WhatsApp and sends it by WhatsApp's id, and the message's `media` block then names the file. With a Cosend id, `caption` is allowed on image, video and document (not on audio or sticker), and `filename` on document only (it defaults to the uploaded name). Meta's own `id` or `link` goes to WhatsApp unchanged.","propertyNames":{"type":"string"},"type":"object"},"interactive":{"anyOf":[{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"buttons":{"items":{"additionalProperties":false,"properties":{"reply":{"additionalProperties":false,"properties":{"id":{"maxLength":256,"type":"string"},"title":{"maxLength":20,"type":"string"}},"required":["id","title"],"type":"object"},"type":{"const":"reply","type":"string"}},"required":["type","reply"],"type":"object"},"maxItems":3,"minItems":1,"type":"array"}},"required":["buttons"],"type":"object"},"body":{"additionalProperties":false,"properties":{"text":{"maxLength":1024,"type":"string"}},"required":["text"],"type":"object"},"footer":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"}},"required":["text"],"type":"object"},"header":{"oneOf":[{"additionalProperties":false,"properties":{"text":{"minLength":1,"type":"string"},"type":{"const":"text","type":"string"}},"required":["type","text"],"type":"object"},{"additionalProperties":false,"properties":{"image":{"additionalProperties":{},"properties":{"id":{"minLength":1,"type":"string"},"link":{"minLength":1,"type":"string"}},"type":"object"},"type":{"const":"image","type":"string"}},"required":["type","image"],"type":"object"},{"additionalProperties":false,"properties":{"type":{"const":"video","type":"string"},"video":{"additionalProperties":{},"properties":{"id":{"minLength":1,"type":"string"},"link":{"minLength":1,"type":"string"}},"type":"object"}},"required":["type","video"],"type":"object"},{"additionalProperties":false,"properties":{"document":{"additionalProperties":{},"properties":{"id":{"minLength":1,"type":"string"},"link":{"minLength":1,"type":"string"}},"type":"object"},"type":{"const":"document","type":"string"}},"required":["type","document"],"type":"object"}]},"type":{"const":"button","type":"string"}},"required":["type","body","action"],"type":"object"},{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"button":{"maxLength":20,"type":"string"},"sections":{"items":{"additionalProperties":false,"properties":{"rows":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":72,"type":"string"},"id":{"maxLength":200,"type":"string"},"title":{"maxLength":24,"type":"string"}},"required":["id","title"],"type":"object"},"minItems":1,"type":"array"},"title":{"maxLength":24,"type":"string"}},"required":["rows"],"type":"object"},"maxItems":10,"minItems":1,"type":"array"}},"required":["button","sections"],"type":"object"},"body":{"additionalProperties":false,"properties":{"text":{"maxLength":4096,"type":"string"}},"required":["text"],"type":"object"},"footer":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"}},"required":["text"],"type":"object"},"header":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"},"type":{"const":"text","type":"string"}},"required":["type","text"],"type":"object"},"type":{"const":"list","type":"string"}},"required":["type","body","action"],"type":"object"},{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"name":{"const":"catalog_message","type":"string"},"parameters":{"additionalProperties":false,"properties":{"thumbnail_product_retailer_id":{"minLength":1,"type":"string"}},"required":["thumbnail_product_retailer_id"],"type":"object"}},"required":["name"],"type":"object"},"body":{"additionalProperties":false,"properties":{"text":{"maxLength":1024,"type":"string"}},"required":["text"],"type":"object"},"footer":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"}},"required":["text"],"type":"object"},"type":{"const":"catalog_message","type":"string"}},"required":["type","body","action"],"type":"object"},{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"catalog_id":{"minLength":1,"type":"string"},"product_retailer_id":{"minLength":1,"type":"string"}},"required":["product_retailer_id"],"type":"object"},"body":{"additionalProperties":false,"properties":{"text":{"maxLength":1024,"type":"string"}},"required":["text"],"type":"object"},"footer":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"}},"required":["text"],"type":"object"},"type":{"const":"product","type":"string"}},"required":["type","action"],"type":"object"},{"additionalProperties":false,"properties":{"action":{"additionalProperties":false,"properties":{"catalog_id":{"minLength":1,"type":"string"},"sections":{"items":{"additionalProperties":false,"properties":{"product_items":{"items":{"additionalProperties":false,"properties":{"product_retailer_id":{"minLength":1,"type":"string"}},"required":["product_retailer_id"],"type":"object"},"minItems":1,"type":"array"},"title":{"maxLength":24,"type":"string"}},"required":["product_items"],"type":"object"},"maxItems":10,"minItems":1,"type":"array"}},"required":["sections"],"type":"object"},"body":{"additionalProperties":false,"properties":{"text":{"maxLength":1024,"type":"string"}},"required":["text"],"type":"object"},"footer":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"}},"required":["text"],"type":"object"},"header":{"additionalProperties":false,"properties":{"text":{"maxLength":60,"type":"string"},"type":{"const":"text","type":"string"}},"required":["type","text"],"type":"object"},"type":{"const":"product_list","type":"string"}},"required":["type","header","body","action"],"type":"object"},{"additionalProperties":{},"properties":{"type":{"type":"string"}},"required":["type"],"type":"object"}],"description":"Meta's interactive object. Checked against WhatsApp's limits before anything is written, and refused in words naming the field: a reply-button message (type \"button\", up to 3 buttons), a list message (type \"list\"), a catalogue message (type \"catalog_message\": body up to 1024 characters, footer up to 60, optional action.parameters.thumbnail_product_retailer_id), a single-product message (type \"product\": action.product_retailer_id, optional body and footer, no header) and a multi-product message (type \"product_list\": a text header up to 60 characters, a body, action.sections of product_items, at most 10 sections and 30 products, a title up to 24 characters on each section when there is more than one). A product message may leave out action.catalog_id, and Cosend sends the catalogue linked to the number's WhatsApp Business account in Meta's Commerce Manager; a catalogue message, and a product message without catalog_id, are refused in words when the number has none linked. A catalog_id you give is sent as given. Like every free-form message, they go only inside the 24-hour customer service window. Any other interactive type goes to WhatsApp unchanged."},"location":{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"},"metadata":{"additionalProperties":{"type":"string"},"propertyNames":{"type":"string"},"type":"object"},"reaction":{"additionalProperties":false,"properties":{"emoji":{"type":"string"},"message_id":{"minLength":1,"type":"string"}},"required":["message_id","emoji"],"type":"object"},"reply_to":{"anyOf":[{"minLength":1,"type":"string"},{"type":"null"}]},"send_mode":{"default":"strict","enum":["auto","strict"],"type":"string"},"source":{"description":"Who is sending. Left out, it is agent for a person (the dashboard Inbox, or an MCP client acting for one) and api for an API key.","enum":["customer","app","api","agent","automation","ai","notify","history","system"],"type":"string"},"sticker":{"additionalProperties":{},"description":"Meta's media object. `id` may be a Cosend media id (`med_…`, from `POST /v1/media`): Cosend uploads the file to WhatsApp and sends it by WhatsApp's id, and the message's `media` block then names the file. With a Cosend id, `caption` is allowed on image, video and document (not on audio or sticker), and `filename` on document only (it defaults to the uploaded name). Meta's own `id` or `link` goes to WhatsApp unchanged.","propertyNames":{"type":"string"},"type":"object"},"template":{"additionalProperties":{},"description":"Meta's template object: {\"name\", \"language\": {\"code\"}, \"components\"}. A header parameter of type image, video or document may name a file uploaded with POST /v1/media by its id ({\"type\": \"image\", \"image\": {\"id\": \"med_…\"}}): Cosend uploads it to Meta for this number and sends Meta's id; a link, or a media id from Meta, is sent as it is. A location parameter ({\"type\": \"location\", \"location\": {\"latitude\", \"longitude\", \"name\", \"address\"}}) needs a latitude from -90 to 90 and a longitude from -180 to 180, in decimal degrees; name and address are text.","propertyNames":{"type":"string"},"type":"object"},"text":{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"},"type":{"enum":["text","image","audio","video","document","sticker","location","contacts","interactive","template","reaction"],"type":"string"},"video":{"additionalProperties":{},"description":"Meta's media object. `id` may be a Cosend media id (`med_…`, from `POST /v1/media`): Cosend uploads the file to WhatsApp and sends it by WhatsApp's id, and the message's `media` block then names the file. With a Cosend id, `caption` is allowed on image, video and document (not on audio or sticker), and `filename` on document only (it defaults to the uploaded name). Meta's own `id` or `link` goes to WhatsApp unchanged.","propertyNames":{"type":"string"},"type":"object"}},"required":["type","conversation_id"],"type":"object"},"name":"send_message"},{"description":"Switches an automation on or off. state \"disable\" is the emergency stop: it takes effect at once and needs no confirmation. state \"enable\" switches it on, and from then on it acts with nobody in the loop, so enabling happens only on a confirmed call: without confirmation_token it changes nothing and returns a preview and a token for a person to approve; called again with that token, it enables. version_id (enable only) picks the version to run; the default is the newest one, which has to have been checked and deployed first.","inputSchema":{"additionalProperties":false,"properties":{"confirmation_token":{"description":"For a call that needs approval: left out, the call does nothing and returns a preview and a token; given that token, with the same arguments, the call does it.","type":"string"},"id":{"description":"The id in the resource path.","type":"string"},"state":{"description":"enable to switch the automation on, disable to switch it off.","enum":["enable","disable"],"type":"string"},"version_id":{"pattern":"^av_[0-9A-HJKMNP-TV-Z]{26}$","type":"string"}},"required":["id","state"],"type":"object"},"name":"set_automation_state"},{"description":"Records a contact's marketing or utility consent as a new entry in an append-only ledger. Nothing is overwritten and nothing is deleted, so this is an audit record of what the business was told, not a switch. A recorded grant can make that contact reachable by marketing.","inputSchema":{"additionalProperties":false,"properties":{"category":{"enum":["marketing","utility","authentication"],"type":"string"},"connection_id":{"type":"string"},"evidence":{"additionalProperties":{},"default":{},"propertyNames":{"type":"string"},"type":"object"},"id":{"description":"The id in the resource path.","type":"string"},"source":{"default":"api","type":"string"},"state":{"enum":["granted","withdrawn","unknown"],"type":"string"}},"required":["id","category","state"],"type":"object"},"name":"set_contact_consent"},{"description":"Creates a new WhatsApp message template and sends it to Meta for review. This leaves Cosend: Meta reviews every template (a decision can take up to 24 hours), and a rejection counts against the WhatsApp account’s quality history. It submits only on a confirmed call: without confirmation_token it submits nothing and returns a preview and a token for a person to approve; called again with that token, it submits. Ten a day per workspace. The categories: marketing makes people aware of the business, its offers and sales; utility follows up on something the customer did or asked for (an order, a booking) and may not promote anything, so an order update with a discount in it is marketing; authentication is a one-time code. A wrong category is moved or rejected by Meta. Meta’s answer shows in the template’s review status. It sends no message to anyone.","inputSchema":{"additionalProperties":false,"properties":{"authentication":{"anyOf":[{"additionalProperties":false,"properties":{"add_security_recommendation":{"description":"Whether Meta adds \"For your security, do not share this code.\" to the body.","type":"boolean"},"button":{"deprecated":true,"description":"Refused. WhatsApp writes the button label in each language; there is no text to set. Give delivery instead: {\"type\": \"copy_code\"}."},"code_expiration_minutes":{"anyOf":[{"maximum":90,"minimum":1,"type":"integer"},{"type":"null"}],"description":"Minutes the code stays valid, 1 to 90: Meta's footer \"This code expires in N minutes.\" Left out or null, there is no footer."},"delivery":{"description":"How the code reaches the person: {\"type\": \"copy_code\"}, or {\"type\": \"one_tap\" | \"zero_tap\", \"apps\": [{\"package_name\": \"com.example.app\", \"signature_hash\": \"K8a/AINcGX7\"}]} (1 to 5 apps); zero-tap also takes \"zero_tap_terms_accepted\": true.","oneOf":[{"additionalProperties":false,"properties":{"type":{"const":"copy_code","type":"string"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"apps":{"description":"The Android apps the code is handed to: 1 to 5, Meta's supported_apps.","items":{"additionalProperties":false,"properties":{"package_name":{"maxLength":224,"pattern":"^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+$","type":"string"},"signature_hash":{"pattern":"^[A-Za-z0-9+/=]{11}$","type":"string"}},"required":["package_name","signature_hash"],"type":"object"},"maxItems":5,"minItems":1,"type":"array"},"type":{"const":"one_tap","type":"string"}},"required":["type","apps"],"type":"object"},{"additionalProperties":false,"properties":{"apps":{"description":"The Android apps the code is handed to: 1 to 5, Meta's supported_apps.","items":{"additionalProperties":false,"properties":{"package_name":{"maxLength":224,"pattern":"^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+$","type":"string"},"signature_hash":{"pattern":"^[A-Za-z0-9+/=]{11}$","type":"string"}},"required":["package_name","signature_hash"],"type":"object"},"maxItems":5,"minItems":1,"type":"array"},"type":{"const":"zero_tap","type":"string"},"zero_tap_terms_accepted":{"const":true,"description":"Meta's zero_tap_terms_accepted: \"Set to true to indicate that you understand that your use of zero-tap authentication is subject to the WhatsApp Business Terms of Service.\" Sent to Meta and recorded in the audit log.","type":"boolean"}},"required":["type","apps","zero_tap_terms_accepted"],"type":"object"}]},"languages":{"description":"The language versions to create, e.g. [\"fr\", \"en_US\"]: one template per language, each written by WhatsApp in its language. On an edit, left out or exactly the template's own language.","items":{"maxLength":32,"minLength":2,"type":"string"},"minItems":1,"type":"array"},"message_send_ttl_seconds":{"anyOf":[{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},{"type":"null"}],"description":"How long WhatsApp keeps trying to deliver the message: 30 to 900 seconds, or -1 for 30 days. Left out or null, WhatsApp's default for authentication, 10 minutes."}},"required":["languages","add_security_recommendation","delivery"],"type":"object"},{"type":"null"}],"description":"An authentication template, in Meta's shape, in place of components and language: {\"languages\": [\"fr\", \"en_US\"], \"add_security_recommendation\": true, \"code_expiration_minutes\": 10, \"delivery\": {\"type\": \"copy_code\"}, \"message_send_ttl_seconds\": 600}. WhatsApp writes the message and the button label in each language (\"{{1}} is your verification code.\" in English); there is no text to set. One template is created per language, each its own resource; the answer is the version in the first language. Required when category is authentication, and refused on any other category; null is the same as leaving it out."},"category":{"enum":["marketing","utility","authentication"],"type":"string"},"components":{"description":"Meta's components; required on every category but authentication, which takes authentication instead. A HEADER carries its format (TEXT, IMAGE, VIDEO, DOCUMENT or LOCATION), and a header without one is sent as TEXT. An IMAGE, VIDEO or DOCUMENT header's sample is a file uploaded with POST /v1/media, named by its id in Meta's own field: {\"type\": \"HEADER\", \"format\": \"IMAGE\", \"example\": {\"header_handle\": [\"med_…\"]}}. The file must be a JPEG or PNG image of at most 5 MB, an MP4 video of at most 16 MB, or a PDF of at most 100 MB (WhatsApp's limits), and Cosend uploads it to Meta and sends Meta's handle in its place; a handle from Meta itself is sent as it is. A LOCATION header takes no sample, and only a utility or marketing template can have one.","items":{"anyOf":[{"additionalProperties":false,"properties":{"buttons":{"items":{"anyOf":[{"additionalProperties":false,"properties":{"text":{"maxLength":25,"type":"string"},"type":{"const":"QUICK_REPLY","type":"string"}},"required":["type","text"],"type":"object"},{"additionalProperties":false,"properties":{"example":{"items":{"minLength":1,"type":"string"},"maxItems":1,"minItems":1,"type":"array"},"text":{"maxLength":25,"type":"string"},"type":{"const":"URL","type":"string"},"url":{"maxLength":2000,"minLength":1,"type":"string"}},"required":["type","text","url"],"type":"object"},{"additionalProperties":false,"properties":{"phone_number":{"minLength":1,"type":"string"},"text":{"maxLength":25,"type":"string"},"type":{"const":"PHONE_NUMBER","type":"string"}},"required":["type","text","phone_number"],"type":"object"},{"additionalProperties":{},"properties":{"type":{"type":"string"}},"required":["type"],"type":"object"}]},"maxItems":10,"minItems":1,"type":"array"},"type":{"const":"BUTTONS","type":"string"}},"required":["type","buttons"],"type":"object"},{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"}]},"minItems":1,"type":"array"},"confirmation_token":{"description":"For a call that needs approval: left out, the call does nothing and returns a preview and a token; given that token, with the same arguments, the call does it.","type":"string"},"connection_id":{"type":"string"},"display_name":{"description":"The human name, free text (e.g. \"Order shipped\"). When name is left out, the system name is generated from it: lowercase, accents dropped, every other run of characters an underscore, at most 512 characters, with _2, _3… added when a template on the WABA already has that name.","maxLength":512,"minLength":1,"type":"string"},"example_values":{"additionalProperties":false,"description":"A sample value for every variable in the TEXT header and the body, keyed per component by the name between the braces: {\"body\": {\"1\": \"Pablo\", \"2\": \"860198-230332\"}} or {\"body\": {\"first_name\": \"Pablo\"}}. Required for each such variable, because Meta rejects a template without samples; a missing one is refused with invalid_request, param example_values. Sent to Meta as each component's example. A component that already carries Meta's own example and has no entry here is sent as it is.","properties":{"body":{"additionalProperties":{"minLength":1,"type":"string"},"propertyNames":{"type":"string"},"type":"object"},"header":{"additionalProperties":{"minLength":1,"type":"string"},"propertyNames":{"type":"string"},"type":"object"}},"type":"object"},"language":{"description":"The language, e.g. \"en_US\". Required on every category but authentication, which takes authentication.languages instead.","maxLength":32,"minLength":2,"type":"string"},"name":{"description":"The system name, used as given. Optional: leave it out and it is generated from display_name. Give it to add a language to an existing template. One of name and display_name is required.","maxLength":512,"minLength":1,"pattern":"^[a-z0-9_]+$","type":"string"},"parameter_format":{"enum":["positional","named"],"type":"string"}},"required":["connection_id","category"],"type":"object"},"name":"submit_template"},{"description":"Checks a WhatsApp message template (category, language, components and example values, as Meta takes them) against Meta’s rules, which are errors, and the warning signals Meta names, which are warnings; each problem says where it is and what to change. The verdict is fix_first, warnings or ready, and ready is not an approval: Meta still reviews every template itself. Nothing is submitted.","inputSchema":{"additionalProperties":false,"properties":{"authentication":{"anyOf":[{"additionalProperties":false,"properties":{"add_security_recommendation":{"description":"Whether Meta adds \"For your security, do not share this code.\" to the body.","type":"boolean"},"button":{"deprecated":true,"description":"Refused. WhatsApp writes the button label in each language; there is no text to set. Give delivery instead: {\"type\": \"copy_code\"}."},"code_expiration_minutes":{"anyOf":[{"maximum":90,"minimum":1,"type":"integer"},{"type":"null"}],"description":"Minutes the code stays valid, 1 to 90: Meta's footer \"This code expires in N minutes.\" Left out or null, there is no footer."},"delivery":{"description":"How the code reaches the person: {\"type\": \"copy_code\"}, or {\"type\": \"one_tap\" | \"zero_tap\", \"apps\": [{\"package_name\": \"com.example.app\", \"signature_hash\": \"K8a/AINcGX7\"}]} (1 to 5 apps); zero-tap also takes \"zero_tap_terms_accepted\": true.","oneOf":[{"additionalProperties":false,"properties":{"type":{"const":"copy_code","type":"string"}},"required":["type"],"type":"object"},{"additionalProperties":false,"properties":{"apps":{"description":"The Android apps the code is handed to: 1 to 5, Meta's supported_apps.","items":{"additionalProperties":false,"properties":{"package_name":{"maxLength":224,"pattern":"^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+$","type":"string"},"signature_hash":{"pattern":"^[A-Za-z0-9+/=]{11}$","type":"string"}},"required":["package_name","signature_hash"],"type":"object"},"maxItems":5,"minItems":1,"type":"array"},"type":{"const":"one_tap","type":"string"}},"required":["type","apps"],"type":"object"},{"additionalProperties":false,"properties":{"apps":{"description":"The Android apps the code is handed to: 1 to 5, Meta's supported_apps.","items":{"additionalProperties":false,"properties":{"package_name":{"maxLength":224,"pattern":"^[A-Za-z][A-Za-z0-9_]*(\\.[A-Za-z][A-Za-z0-9_]*)+$","type":"string"},"signature_hash":{"pattern":"^[A-Za-z0-9+/=]{11}$","type":"string"}},"required":["package_name","signature_hash"],"type":"object"},"maxItems":5,"minItems":1,"type":"array"},"type":{"const":"zero_tap","type":"string"},"zero_tap_terms_accepted":{"const":true,"description":"Meta's zero_tap_terms_accepted: \"Set to true to indicate that you understand that your use of zero-tap authentication is subject to the WhatsApp Business Terms of Service.\" Sent to Meta and recorded in the audit log.","type":"boolean"}},"required":["type","apps","zero_tap_terms_accepted"],"type":"object"}]},"languages":{"description":"The language versions to create, e.g. [\"fr\", \"en_US\"]: one template per language, each written by WhatsApp in its language. On an edit, left out or exactly the template's own language.","items":{"maxLength":32,"minLength":2,"type":"string"},"minItems":1,"type":"array"},"message_send_ttl_seconds":{"anyOf":[{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},{"type":"null"}],"description":"How long WhatsApp keeps trying to deliver the message: 30 to 900 seconds, or -1 for 30 days. Left out or null, WhatsApp's default for authentication, 10 minutes."}},"required":["languages","add_security_recommendation","delivery"],"type":"object"},{"type":"null"}],"description":"An authentication template, in Meta's shape, in place of components and language: {\"languages\": [\"fr\", \"en_US\"], \"add_security_recommendation\": true, \"code_expiration_minutes\": 10, \"delivery\": {\"type\": \"copy_code\"}, \"message_send_ttl_seconds\": 600}. WhatsApp writes the message and the button label in each language (\"{{1}} is your verification code.\" in English); there is no text to set. One template is created per language, each its own resource; the answer is the version in the first language. Required when category is authentication, and refused on any other category; null is the same as leaving it out."},"category":{"enum":["marketing","utility","authentication"],"type":"string"},"components":{"description":"Meta's components, as POST /v1/templates takes them; required on every category but authentication, which takes authentication instead.","items":{"anyOf":[{"additionalProperties":false,"properties":{"buttons":{"items":{"anyOf":[{"additionalProperties":false,"properties":{"text":{"maxLength":25,"type":"string"},"type":{"const":"QUICK_REPLY","type":"string"}},"required":["type","text"],"type":"object"},{"additionalProperties":false,"properties":{"example":{"items":{"minLength":1,"type":"string"},"maxItems":1,"minItems":1,"type":"array"},"text":{"maxLength":25,"type":"string"},"type":{"const":"URL","type":"string"},"url":{"maxLength":2000,"minLength":1,"type":"string"}},"required":["type","text","url"],"type":"object"},{"additionalProperties":false,"properties":{"phone_number":{"minLength":1,"type":"string"},"text":{"maxLength":25,"type":"string"},"type":{"const":"PHONE_NUMBER","type":"string"}},"required":["type","text","phone_number"],"type":"object"},{"additionalProperties":{},"properties":{"type":{"type":"string"}},"required":["type"],"type":"object"}]},"maxItems":10,"minItems":1,"type":"array"},"type":{"const":"BUTTONS","type":"string"}},"required":["type","buttons"],"type":"object"},{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"}]},"minItems":1,"type":"array"},"example_values":{"additionalProperties":false,"description":"A sample value for every variable in the TEXT header and the body, keyed per component by the name between the braces: {\"body\": {\"1\": \"Pablo\", \"2\": \"860198-230332\"}} or {\"body\": {\"first_name\": \"Pablo\"}}. Required for each such variable, because Meta rejects a template without samples; a missing one is refused with invalid_request, param example_values. Sent to Meta as each component's example. A component that already carries Meta's own example and has no entry here is sent as it is.","properties":{"body":{"additionalProperties":{"minLength":1,"type":"string"},"propertyNames":{"type":"string"},"type":"object"},"header":{"additionalProperties":{"minLength":1,"type":"string"},"propertyNames":{"type":"string"},"type":"object"}},"type":"object"},"language":{"description":"The language, e.g. \"en_US\". Required on every category but authentication, which takes authentication.languages instead.","maxLength":32,"minLength":2,"type":"string"},"parameter_format":{"enum":["positional","named"],"type":"string"}},"required":["category"],"type":"object"},"name":"template_check"},{"description":"Writes a new automation, or a new version of an existing one, from an automation document (ir). Without id it creates one: name, connection_id (the WhatsApp number it belongs to) and ir are then required, and it is created as a draft that does not run. With id it saves a new version of that automation; if it is switched on, the new version goes live with the save, or the save is refused in words and the old version keeps running. It saves only on a confirmed call: without confirmation_token it saves nothing and returns a preview and a token for a person to approve; called again with that token, it saves. Only the document is accepted: no code, commands, arbitrary URLs or SQL.","inputSchema":{"additionalProperties":false,"properties":{"change_note":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}]},"confirmation_token":{"description":"For a call that needs approval: left out, the call does nothing and returns a preview and a token; given that token, with the same arguments, the call does it.","type":"string"},"connection_id":{"description":"The WhatsApp number (connection id) this automation belongs to: its triggers come from it, its messages go from it, and its templates are read on it. Required, and it cannot be moved afterwards. The same recipe (slug) can be set up once on each number, or once per source on it when the recipe has `multiple`.","maxLength":64,"minLength":1,"type":"string"},"description":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}]},"id":{"description":"The id in the resource path.","type":"string"},"ir":{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"},"name":{"maxLength":120,"minLength":1,"type":"string"},"slug":{"pattern":"^[a-z][a-z0-9-]{1,60}$","type":"string"}},"required":["ir"],"type":"object"},"name":"upsert_automation"},{"description":"Creates a contact, or updates the one that already exists for that phone number or BSUID (the business-scoped user id Meta sends; a contact may have one and no phone). Writes only to Cosend: it sends nothing and the contact is not notified. It does not grant permission to message anyone: consent is separate, and is recorded on its own ledger.","inputSchema":{"additionalProperties":false,"properties":{"attributes":{"additionalProperties":{},"description":"Free-form values, replaced whole on PATCH. A key registered in /v1/contact-fields must hold a value of its type (text: a string; number: a number; date: YYYY-MM-DD; boolean: true or false; choice: one of its choices) or null; a PATCH that sets attributes must give every required field a value. A key that is not registered is kept as it comes.","propertyNames":{"type":"string"},"type":"object"},"bsuid":{"anyOf":[{"type":"string"},{"type":"null"}]},"connection_id":{"type":"string"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"maxLength":200,"minLength":1,"type":"string"},{"type":"null"}]},"phone_e164":{"anyOf":[{"type":"string"},{"type":"null"}]},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"items":{"type":"string"},"type":"array"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["connection_id"],"type":"object"},"name":"upsert_contact"},{"description":"Checks an automation document (ir) with Cosend’s compiler and returns its full report: every error with a JSON pointer into the document and, where one exists, a fix that can be applied. Nothing is written and nothing is deployed. id is the automation the draft belongs to; a brand-new automation gets its id when it is first saved, and saving checks the document the same way. It needs the automations:write permission because it is the authoring tool, though it changes nothing.","inputSchema":{"additionalProperties":false,"properties":{"id":{"description":"The id in the resource path.","type":"string"},"ir":{"additionalProperties":{},"propertyNames":{"type":"string"},"type":"object"}},"required":["id","ir"],"type":"object"},"name":"validate_automation"},{"description":"Makes a wa.me chat link and its QR code (an SVG image) for a WhatsApp number, with an opening message if one is given. country is the two-letter ISO code and number is the number exactly as it is typed in that country (as written at home, with +, with 00 or with the country code in front); a number of another country is refused. It sends nothing to anyone.","inputSchema":{"additionalProperties":false,"properties":{"country":{"description":"The country the number belongs to, as its two-letter ISO code: \"GB\", \"US\", \"DE\". A number of another country is refused.","type":"string"},"message":{"description":"The message the chat starts with, at most 500 characters. Left out or blank, the link opens an empty chat.","maxLength":500,"type":"string"},"number":{"description":"The WhatsApp number as people type it: as written at home (07700 900123), with + (+44 7700 900123), with 00 (0044 7700 900123) or with the country code in front (44 7700 900123). Spaces, dashes, brackets and digits in any script are fine.","type":"string"}},"required":["country","number"],"type":"object"},"name":"whatsapp_link"},{"description":"Returns the Cosend workspace, plan and connected WhatsApp numbers for the credential in use, and the permissions it was granted, which decide which tools the credential can call and show which WhatsApp business number an outbound message would come from. Read-only and cheap. It does not fail for permission reasons if the credential resolves at all.","inputSchema":{"additionalProperties":false,"properties":{},"required":[],"type":"object"},"name":"whoami"}]},"body_sha256":"277704ad8d342db121288b834c1b6424136feca136a2d1fd53f521ea443d697e","prev_id":null,"leaf":"0xeed71fc5b664a4850e5a920cc8da1b23363078f387a9812b8aa737b1b25e549d","leaf_text":"{\"body\":\"277704ad8d342db121288b834c1b6424136feca136a2d1fd53f521ea443d697e\",\"id\":2557439,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793696630509634,\"prev\":null,\"subject\":\"7c22373a-e348-441d-8e5e-3e4b8d58e029\",\"subject_kind\":\"endpoint\"}","day":{"day":"2026-11-03","leaves":425475,"root":"0xb646ffa569e24bf8336b0a15a9d98d0a2f1239f58e10c2b18a9d22e43343566a","chained":"0x35e926359fd19031c6b5e08fb3b44f2524386a57c8fdd353336c185603f53d43","anchor_chain":"eip155:5042002","anchor_tx":"0xa5f9dadba13cde129126b950e64b815e6833cb8ff53b75026c9dbe769c3768c7","anchor_block":70601990},"proof":["0xeed735de66656af273a60b6a45351f8649dbfe3bded8cf0a9357e55203e6116a","0x2be8e45ce24064ea7ebc0b7d552d34d326c30725cfb6eb24a3cc7e7f95323c56","0x79933491cfd20e5dd3351950b5b5b0c8d9dfc539e550975161eaf8ecbb357092","0xc85106bade87d84a36e4da5ffffa19ba423b985b9c415b5b41e1d0bad3bc8f05","0x67695f3dbd4f81e3dd4acef383a2c1061ab1fd8630d355470a4de22d83a3b1d5","0xb9d6dc593cc9a27f0b98ab2748ce4a6df4a100a9889b90d15c0a849ee0d5cfb4","0x79c9376ee1cdbf673e79deb09329cf909b1ce5d4f498835f7e3b4d780be1256f","0xf7fb92a8df3a89ecfc0a37031d6fcbc68dd2318c05f7fab94c689f836ec0f356","0xf28760190c58c23f1f509fa98e61ce552b2d1e7150843ccb465389f10ba73a8c","0x63edce8eeb0c2822d10c3486d6bd0130b11eab28cbb6d970b44c6b97ebc0ed39","0xe32d67149b3ab2515478adf674b01afebcae77c0efe3369c1ea51eb09462cf3c","0x40503628e813f8ddcdce5088c1edce887d490d34ddbacedf2b89aae0441113e6","0x01e9de68aa9b43892927b1c264f77e0ac05047278992dbb0b29801b5ee9c6fd2","0x2548979bbd7b1568b5a14db6fca0201979c48165192f2b55f45fa21471031e4f","0xa29933ab8020ad948edbcf3e65194e73a6b113a0063231c1105b56c2d59ab97d","0xd60b16e6a71fbffc93a233ee89f916e50c0206a56f52c852b85e5a246b6b417c","0x85f3a27c16056a361d9ba33355a575ca7123f86de901b204c88953c4b8ea441a"]}