{"$schema":"https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json","name":"com.wabery/mcp","title":"Wabery MCP Server","description":"WhatsApp Business tools for projects, channels, messages, Flows, broadcasts, functions, and agents.","version":"54ab78ffdd76","serverUrl":"https://mcp.wabery.com","websiteUrl":"https://wabery.com/developers/","icons":[{"src":"https://wabery.com/android-chrome-512x512.png","mimeType":"image/png","sizes":["512x512"]}],"remotes":[{"type":"streamable-http","url":"https://mcp.wabery.com"}],"tools":[{"name":"wabery_check_connection","title":"Check Wabery connection","description":"Use this when you need to verify that the current credential can reach Wabery projects, WhatsApp channels, and the config schema before other work.","readOnly":true},{"name":"wabery_get_config_example","title":"Get example Wabery config","description":"Use this when you need a starter wabery.config.json with one WhatsApp Flow and one send_flow automation; optional project_id comes from wabery_list_projects.","readOnly":true},{"name":"wabery_get_config_schema","title":"Get Wabery config schema","description":"Use this when you need the current JSON Schema before generating a wabery.config.json with Flows, automations, webhooks, or business_agent declarations.","readOnly":true},{"name":"wabery_export_config","title":"Export Wabery config","description":"Use this when you need the selected project's current Flows, automations, webhook settings, and Business Agent declarations as declarative config. Do not use it to inspect live provider status.","readOnly":true},{"name":"wabery_validate_config","title":"Validate Wabery config","description":"Use this when you need to validate a complete declarative config without changing resources. Hosted-agent fields are Draft-only; Live cannot be edited here. Use wabery_preview_config_diff next to inspect effects.","readOnly":true},{"name":"wabery_preview_config_diff","title":"Preview Wabery config diff","description":"Use this when you need to preview what a complete config would create, update, delete, or leave unchanged without applying it. Hosted-agent changes land on Draft only; Live stays unchanged until someone uses Review & publish in Wabery. Use wabery_apply_config only after reviewing this diff.","readOnly":true},{"name":"wabery_apply_config","title":"Apply Wabery config","description":"Use this when you need to apply a reviewed complete config, creating or updating the hosted-agent Draft plus Flows, automations, webhooks, and eligible Business Agent resources. It cannot edit Live or publish the hosted agent to customers. Do not use it for one resource update when a narrow update tool fits. It never publishes Flows; use wabery_publish_flow separately. Hosted-agent publish happens on Agents after Sandbox testing.","readOnly":false},{"name":"wabery_list_projects","title":"List Wabery projects","description":"Use this when you need to discover Wabery projects and their project_id values before selecting a project or passing an explicit project_id.","readOnly":true},{"name":"wabery_get_project_readiness","title":"Get Wabery project readiness","description":"Use this when you need capability readiness for the selected project or a project_id from wabery_list_projects: sandbox_test, production_inbound, flow_publish, flow_send, templates, proactive_messages, submission_handling, or agent_runtime. The response exposes whether the project is AI-ready, automations-only, or needs billing/action. Use channel readiness only for provider-specific phone details.","readOnly":true},{"name":"wabery_get_project","title":"Get a Wabery project","description":"Use this when you need one project's user-safe settings by project_id from wabery_list_projects. Do not use it for capability readiness; use wabery_get_project_readiness.","readOnly":true},{"name":"wabery_update_project","title":"Update a Wabery project","description":"Use this when you need to overwrite project name, description, routing_mode, require_opt_in, group management webhook opt-in, or signed-webhook settings for a project_id from wabery_list_projects. Prefer wabery_apply_config for reviewed project-wide declarative changes.","readOnly":false},{"name":"wabery_rotate_webhook_secret","title":"Rotate a project's webhook secret","description":"Use this when you need to invalidate and replace the signed-webhook secret for a project_id from wabery_list_projects. The MCP result never returns the new secret; manage it in the Wabery dashboard.","readOnly":false},{"name":"wabery_list_channels","title":"List Wabery channels","description":"Use this when you need WhatsApp channel_id values, connection state, routing warnings, or provider publish_readiness. Use project readiness first for capability-level discovery.","readOnly":true},{"name":"wabery_get_channel","title":"Get a Wabery channel","description":"Use this when you need routing_warning and WhatsApp publish_readiness for a channel_id from wabery_list_channels. Do not use it as a substitute for project-level readiness.","readOnly":true},{"name":"wabery_update_channel","title":"Update a Wabery channel's routing","description":"Use this when you need to overwrite a dedicated channel's routing_mode with AGENT or EXTERNAL using a channel_id from wabery_list_channels. Do not use it for the shared sandbox; update project routing instead.","readOnly":false},{"name":"wabery_create_registration_intent","title":"Create registration intent","description":"Use this when you need a single-use wa.me link for an end customer to register with a project_id from wabery_list_projects. This creates the link but does not contact the customer.","readOnly":false},{"name":"wabery_get_registration_intent","title":"Get registration intent","description":"Use this when you need to poll a registration intent by intent_id returned by wabery_create_registration_intent. Do not create another intent merely to check status.","readOnly":true},{"name":"wabery_get_limits","title":"Get Wabery API limits","description":"Use this when you need the current credential's enforced public API rate limit and monthly request quota. Do not use it for product-plan feature readiness.","readOnly":true},{"name":"wabery_list_flows","title":"List Wabery flows","description":"Use this when you need WhatsApp Flow ids, config keys, project ids, or Meta publish statuses before get, publish, send, dispatch, or submission operations.","readOnly":true},{"name":"wabery_get_flow","title":"Get Wabery flow","description":"Use this when you need one WhatsApp Flow's draft, field schema, and publish status by flow_id from wabery_list_flows.","readOnly":true},{"name":"wabery_publish_flow","title":"Publish Wabery flow","description":"Use this when you need to publish a reviewed draft WhatsApp Flow to Meta using a flow_id from wabery_list_flows. Do not use it to save a draft; use config apply, and obtain explicit confirmation first.","readOnly":false},{"name":"wabery_enroll_contact","title":"Enroll WhatsApp contact","description":"Use this when you need to create or update a controlled, explicitly opted-in WhatsApp contact for a project_id from wabery_list_projects. It can replace contact metadata, language, and sandbox routing, and returns stable contact_id and channel_id values for later sends.","readOnly":false},{"name":"wabery_list_contacts","title":"List Wabery contacts","description":"Use this when you need enrolled WhatsApp contacts, stable contact_id values, and opt-in metadata before a targeted send or audience preparation.","readOnly":true},{"name":"wabery_get_contact","title":"Get Wabery contact","description":"Use this when you need one enrolled WhatsApp contact and consent state by contact_id from wabery_list_contacts or wabery_enroll_contact.","readOnly":true},{"name":"wabery_list_contact_imports","title":"List Wabery contact imports","description":"Use this when you need CSV import_id values and processing counts after uploading through the dashboard or CLI. Only a completed import belongs in wabery_prepare_broadcast_audience.","readOnly":true},{"name":"wabery_get_contact_import","title":"Get Wabery contact import","description":"Use this when you need status and row counts for an import_id from wabery_list_contact_imports. Wait for completed before broadcast preparation.","readOnly":true},{"name":"wabery_unenroll_contact","title":"Unenroll Wabery contact","description":"Use this when you need to remove sandbox authorization for a contact_id from wabery_list_contacts. Set erase=true only for confirmed, irreversible organization-scoped contact-data deletion.","readOnly":false},{"name":"wabery_list_broadcasts","title":"List Wabery broadcasts","description":"Use this when you need WhatsApp broadcast_id values, lifecycle states, or aggregate delivery counts. Filter by status when monitoring preparation or delivery.","readOnly":true},{"name":"wabery_get_broadcast","title":"Get Wabery broadcast","description":"Use this when you need lifecycle status and recipient counts for a broadcast_id from wabery_list_broadcasts. Poll while preparing and review counts before send or schedule confirmation.","readOnly":true},{"name":"wabery_create_broadcast","title":"Create Wabery broadcast draft","description":"Use this when you need a new WhatsApp broadcast draft from approved template variants and a channel_id from wabery_list_channels. This does not select recipients or send; use prepare next.","readOnly":false},{"name":"wabery_prepare_broadcast_audience","title":"Prepare Wabery broadcast audience","description":"Use this when you need to start asynchronous audience resolution and overwrite the frozen recipient snapshot for a draft broadcast_id. Supply exactly one source: contact_ids from wabery_list_contacts, a completed import_id, or filter. This does not send; poll wabery_get_broadcast.","readOnly":false},{"name":"wabery_list_broadcast_recipients","title":"List Wabery broadcast recipients","description":"Use this when you need the frozen recipients, language selection, exclusions, failures, or delivery state for a prepared broadcast_id from wabery_list_broadcasts.","readOnly":true},{"name":"wabery_send_broadcast","title":"Send Wabery broadcast","description":"Use this when you need to start real WhatsApp delivery for a ready broadcast_id after reviewing its frozen audience and counts. Do not use it for preparation; explicit confirmation is required.","readOnly":false},{"name":"wabery_schedule_broadcast","title":"Schedule Wabery broadcast","description":"Use this when you need future WhatsApp delivery for a ready broadcast_id after reviewing its frozen audience, scheduled_at, and IANA timezone. Do not use it for immediate delivery; explicit confirmation is required.","readOnly":false},{"name":"wabery_cancel_broadcast","title":"Cancel Wabery broadcast","description":"Use this when you need to cancel a broadcast_id and stop recipients not yet dispatched. Already accepted WhatsApp messages cannot be recalled; explicit confirmation is required.","readOnly":false},{"name":"wabery_duplicate_broadcast","title":"Duplicate Wabery broadcast","description":"Use this when you need a new draft copied from a broadcast_id's channel, template variants, and mappings. The audience is never copied; prepare a new controlled audience.","readOnly":false},{"name":"wabery_list_conversations","title":"List Wabery conversations","description":"Use this when you need organization-scoped WhatsApp conversation_id values for inbox review, support, or message-history lookup. Filter by contact_id when known.","readOnly":true},{"name":"wabery_get_conversation","title":"Get Wabery conversation","description":"Use this when you need one organization-scoped WhatsApp conversation by conversation_id from wabery_list_conversations.","readOnly":true},{"name":"wabery_list_conversation_messages","title":"List Wabery conversation messages","description":"Use this when you need message history for a conversation_id from wabery_list_conversations. Retained inbound media may include short-lived signed URLs; expires_at is the retention deadline. Inbound WhatsApp messages can use outer type \"unsupported\" when Cloud API does not provide the original body. Inspect unsupported.type: \"revoke\" and \"edit\" are message mutations, not unavailable media; never answer them or call wabery_send_message in response. Other unsupported subtypes are unavailable content and may be handled as such. Direct type revoke/edit are also official coexistence delete/edit events; inspect original_message_id when present.","readOnly":true},{"name":"wabery_list_groups","title":"List WhatsApp groups","description":"Use this when you need organization-scoped WhatsApp group_id values. A group_id is an opaque Meta ID, not a phone number or the messages.send to field. Groups require an eligible Official Business Account Cloud API channel. limit defaults to 25 and accepts 1–1024; starting_after/ending_before (or after/before) are opaque cursors.","readOnly":true},{"name":"wabery_get_group","title":"Get WhatsApp group","description":"Use this when you need group settings, suspension state, participant count, or participant data for one opaque group_id from wabery_list_groups. The participant count excludes the business account.","readOnly":true},{"name":"wabery_create_group","title":"Create WhatsApp group","description":"Use this when you need to create a WhatsApp group on an eligible Official Business Account Cloud API channel. Supply a caller-generated stable idempotency_key and reuse it for every retry. Meta limits groups to 8 participants and 10,000 groups per business number; explicit confirmation is required.","readOnly":false},{"name":"wabery_update_group_settings","title":"Update WhatsApp group settings","description":"Use this when you need to change a group's subject or description. Meta reports the final result asynchronously through group.settings; explicit confirmation is required.","readOnly":false},{"name":"wabery_update_group_profile_picture","title":"Update WhatsApp group profile picture","description":"Use this when you need to upload a JPEG group profile picture as base64. Meta validates square aspect ratio and minimum dimensions and reports the final result asynchronously through group.settings. Explicit confirmation is required.","readOnly":false},{"name":"wabery_get_group_invite_link","title":"Get WhatsApp group invite link","description":"Use this when you need the current chat.whatsapp.com invite link for a group_id. Reading the link is safe; share it only with the intended audience.","readOnly":true},{"name":"wabery_reset_group_invite_link","title":"Reset WhatsApp group invite link","description":"Use this when you need Meta to invalidate the current group invite link and issue a new one. Existing links stop working; explicit confirmation is required.","readOnly":false},{"name":"wabery_list_group_join_requests","title":"List WhatsApp group join requests","description":"Use this when you need pending join-request IDs before approving or rejecting requests in bulk. limit defaults to 25 and accepts 1–1024; starting_after/ending_before (or after/before) are opaque cursors. Pass the returned opaque IDs to the corresponding mutation tool.","readOnly":true},{"name":"wabery_approve_group_join_requests","title":"Approve WhatsApp group join requests","description":"Use this when you need to approve one or more pending group join-request IDs. This uses Meta's bulk join_requests contract and requires explicit confirmation.","readOnly":false},{"name":"wabery_reject_group_join_requests","title":"Reject WhatsApp group join requests","description":"Use this when you need to reject one or more pending group join-request IDs. This uses Meta's bulk join_requests contract and requires explicit confirmation.","readOnly":false},{"name":"wabery_remove_group_participants","title":"Remove WhatsApp group participants","description":"Use this when you need to remove WhatsApp users from a group. Pass participant user IDs in Meta's required participants:[{user}] shape; partial failures are returned per participant. Explicit confirmation is required.","readOnly":false},{"name":"wabery_delete_group","title":"Delete WhatsApp group","description":"Use this when you need to permanently delete a Wabery-managed WhatsApp group. This is irreversible at the provider and requires explicit confirmation.","readOnly":false},{"name":"wabery_send_group_message","title":"Send WhatsApp group message","description":"Use this when you need to send a supported WhatsApp message to a group_id through POST /messages. group_id is an opaque Meta ID and is mutually exclusive with conversation_id/to. Groups support text, media, and text/media templates, but not commerce or interactive messages. Explicit confirmation is required.","readOnly":false},{"name":"wabery_get_whatsapp_management","title":"Read WhatsApp management data","description":"Use this when you need to read channel-scoped Meta WhatsApp configuration without exposing the Meta access token. Supports business profiles, commerce, QR codes, webhook subscriptions, phone/WABA details, analytics, credit lines, calling settings, call permissions, and blocked users.","readOnly":true},{"name":"wabery_manage_whatsapp","title":"Manage a WhatsApp channel","description":"Use this when you need to change channel-scoped Meta WhatsApp settings through Wabery. Covers profiles, commerce, QR codes, media deletion, registration and two-step verification, webhook subscriptions, calling, and blocking or unblocking users. Explicit confirmation is required.","readOnly":false},{"name":"wabery_send_message","title":"Send WhatsApp message","description":"Use this when you need to send one real WhatsApp text, approved template, media, or interactive message. Do not use it to send a Flow; use wabery_send_flow. The body must identify channel and exactly one recipient: conversation_id, to, or opaque group_id. group_id is not a phone number; use wabery_send_group_message for the dedicated group-safe path. Include idempotency_key; explicit confirmation is required.","readOnly":false},{"name":"wabery_get_message","title":"Get Wabery message","description":"Use this when you need queued, provider, delivery, or failure status for a message_id returned by wabery_send_message or message history. An accepted send is not proof of delivery. Inbound WhatsApp messages can use outer type \"unsupported\" when Cloud API does not provide the original body. Inspect unsupported.type: \"revoke\" and \"edit\" are message mutations, not unavailable media; never answer them or call wabery_send_message in response. Other unsupported subtypes are unavailable content and may be handled as such.","readOnly":true},{"name":"wabery_list_templates","title":"List WhatsApp templates","description":"Use this when you need WhatsApp template_id values and approval states, optionally for a channel_id from wabery_list_channels, before template sends or broadcasts.","readOnly":true},{"name":"wabery_get_template","title":"Get WhatsApp template","description":"Use this when you need one template by template_id from wabery_list_templates. Set refresh=true only for a live Meta check that also updates Wabery's cached status.","readOnly":false},{"name":"wabery_create_template","title":"Create WhatsApp template","description":"Use this when you need to submit a new WhatsApp template to Meta for approval after checking channel publish_readiness. Do not use it to inspect or send an existing template; explicit confirmation is required.","readOnly":false},{"name":"wabery_wait_template","title":"Wait for WhatsApp template approval","description":"Use this when you need to poll Meta for a template_id from wabery_list_templates until APPROVED or timeout. This repeatedly refreshes Wabery's cached provider status; do not use it for a single cached read.","readOnly":false},{"name":"wabery_send_flow","title":"Send WhatsApp Flow","description":"Use this when you need to send one published WhatsApp Flow using flow_id and channel_id from list tools plus exactly one controlled contact_id, conversation_id, or phone number. Do not use wabery_send_message for a Flow; explicit confirmation is required.","readOnly":false},{"name":"wabery_list_submissions","title":"List Wabery submissions","description":"Use this when you need completed WhatsApp Flow submissions, optionally filtered by project agent_id or flow_id from wabery_list_flows.","readOnly":true},{"name":"wabery_list_dispatches","title":"List Wabery dispatches","description":"Use this when you need sent WhatsApp Flow dispatches and flow_token values, optionally filtered by flow_id or contact_id. Use wabery_get_dispatch for one token.","readOnly":true},{"name":"wabery_get_dispatch","title":"Get Wabery dispatch","description":"Use this when you need provider and completion status for one WhatsApp Flow dispatch by flow_token returned by wabery_send_flow or wabery_list_dispatches.","readOnly":true},{"name":"wabery_list_functions","title":"List hosted functions","description":"Use this when you need hosted function_id values, deployment state, or exposure settings for the selected project before get, deploy, test, invoke, update, or delete operations.","readOnly":true},{"name":"wabery_get_function","title":"Get a hosted function","description":"Use this when you need metadata and current source for a function_id from wabery_list_functions. Do not use it to execute the function.","readOnly":true},{"name":"wabery_create_function","title":"Create a hosted function","description":"Use this when you need a new hosted-function record without deploying source. trigger_type accepts values such as KEYWORD, WELCOME, or ANY_MESSAGE; use wabery_deploy_function next.","readOnly":false},{"name":"wabery_deploy_function","title":"Deploy a hosted function","description":"Use this when you need to bundle and overwrite the active TypeScript deployment for a function_id from wabery_list_functions. Do not use it to execute code; use test or invoke after reviewing diagnostics.","readOnly":false},{"name":"wabery_test_function","title":"Test a hosted function","description":"Use this when you need to execute a function_id with a synthetic message event and inspect its result and logs. Do not use it as a side-effect-free preview: function code can persist data or call external APIs; use wabery_invoke_function for a real structured tool call.","readOnly":false},{"name":"wabery_tail_function_logs","title":"Tail hosted function logs","description":"Use this when you need recent invocation status, CPU, errors, or captured logs for a function_id from wabery_list_functions. This does not execute the function.","readOnly":true},{"name":"wabery_delete_function","title":"Delete a hosted function","description":"Use this when you need to permanently delete a function_id from wabery_list_functions and its deployed Worker. Do not use update to simulate deletion.","readOnly":false},{"name":"wabery_update_function","title":"Update a hosted function","description":"Use this when you need to overwrite metadata for a function_id from wabery_list_functions: name, expose_as_mcp_tool, is_active, or input_schema. Do not use it to deploy source or invoke code.","readOnly":false},{"name":"wabery_invoke_function","title":"Invoke a hosted function as a tool","description":"Use this when you need a real structured mcp_call to an exposed function_id from wabery_list_functions, optionally with contact_id from wabery_list_contacts. Do not use it for synthetic testing; arbitrary function code can persist data, call APIs, or send messages.","readOnly":false}]}