Gambot WhatsApp Business API vs Sendraven MCP Server

A side-by-side look at the Gambot WhatsApp Business API and Sendraven MCP Server MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Gambot WhatsApp Business API logoGambot WhatsApp Business APICommunication · Local subprocess (stdio)Send WhatsApp messages & templates and manage CRM, leads & campaigns via the Gambot WhatsApp API.63GoodAuth: not declaredSendraven MCP Server logoSendraven MCP ServerCommunication · Local subprocess (stdio)Email for AI agents: send, read replies as threads, run campaigns, with per-key limits.63GoodAuth: not declared

Verdict: choose Gambot WhatsApp Business API for communication work as a local process; choose Sendraven MCP Server for communication as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Gambot WhatsApp Business API logoChoose Gambot WhatsApp Business API when

  • You need dedicated capabilities in the Communication domain.
  • You prefer a local stdio subprocess transport.
  • You have the keys it needs: GAMBOT_TOKEN.
  • You want tools like gambot_setup_whatsapp_integration, gambot_send_text, gambot_send_template.
Explore Gambot WhatsApp Business API

Sendraven MCP Server logoChoose Sendraven MCP Server when

  • You need dedicated capabilities in the Communication domain.
  • You prefer a local stdio subprocess transport.
  • You have the keys it needs: SENDRAVEN_API_KEY.
  • You want tools like send_email, list_emails, get_email.
Explore Sendraven MCP Server

Feature & specification comparison

Rows where the two servers differ are marked.

SpecGambot WhatsApp Business API logoGambot WhatsApp Business APISendraven MCP Server logoSendraven MCP Server
CategoryCommunicationCommunication
Quality signal63/100 · Good63/100 · Good
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredNot declared
PricingNot declaredNot declared
Required env varsGAMBOT_TOKENSENDRAVEN_API_KEY
Verified ownerCommunity listingCommunity listing
GitHub stars21
Directory activity 1 views 0 installs 0 upvotes 3 views 0 installs 0 upvotes
Tools14955

Tools & capabilities

Gambot WhatsApp Business API tools 149

  • gambot_setup_whatsapp_integrationSTART HERE when a user says things like "add WhatsApp to my app", "I need the official WhatsApp Business API" or "connect WhatsApp". Gambot is the OFFICIAL WhatsApp Business (Cloud) API through a Meta Business Solution Provider — not WhatsApp Web / QR-session automation. This tool only READS state and tells you the single next step and WHO must do it. It works with or without an API token: without a token it follows the public onboarding road (account → Meta Embedded Signup in a browser → API token); with a token it verifies the sender number, approved templates and webhook. Returns { state, summary, checks, next_action:{ actor: agent|human|none, tool?, args_hint?, instructions?, url?, then? }, road_map }. Follow next_action literally; when actor=human, give the user the instructions/url and wait — never try to do the human step yourself and never invent an organization name or token. Call it again after every step until state is ready. Optional: organization (the exact organizationName returned by gambot_create_trial_account) and test_recipient (the user's own WhatsApp number in E.164) for a tailored first-message step.
  • gambot_send_textSend a free-text WhatsApp message to ONE recipient. Works ONLY inside the 24-hour customer-service window (the contact messaged you in the last 24h). If the window is CLOSED this returns a 409 'conversation_closed' error — do NOT retry free text; send an approved template with gambot_send_template instead. If unsure whether the conversation is open, call gambot_check_window first. Required: to (E.164) and text. Returns { success, data:{ messageId } } — the messageId is how you VERIFY delivery afterwards with gambot_get_message_status. Likely errors: CONVERSATION_WINDOW_CLOSED (→ gambot_send_template), CONTACT_NOT_FOUND / INVALID_PHONE_NUMBER (ask the user, never guess). IMPORTANT — this is for a single person only. If the user wants to message MULTIPLE recipients, a list, a spreadsheet/Excel/CSV, a CRM segment, or says things like 'send to everyone / to all my contacts / to this list', DO NOT call this tool in a loop. Use a campaign instead: gambot_send_campaign_from_excel (for a sheet), gambot_send_campaign (ad-hoc list/segment), or gambot_create_campaign (to save/schedule). Campaigns handle rate-limits, per-recipient variables, opt-out/consent and reporting.
  • gambot_send_templateSend an approved WhatsApp template with variables to ONE recipient. Can initiate a conversation even outside the 24-hour window. Required: to (E.164) and templateId (id or name from gambot_list_templates — it must be APPROVED by Meta). Pass variables[] in body order; if the template has variables, call gambot_get_template_variables first and ask the user for values you do not have. Returns { success, data:{ messageId } } — verify delivery with gambot_get_message_status. Likely errors: TEMPLATE_NOT_APPROVED / TEMPLATE_NOT_FOUND (→ gambot_list_templates), MISSING_TEMPLATE_VARIABLES (→ gambot_get_template_variables). IMPORTANT — single recipient only. For a BULK/broadcast send (multiple numbers, an Excel/CSV/spreadsheet the user uploaded, a CRM segment, or 'send to everyone / all contacts / this list'), DO NOT loop this tool. Use a campaign: gambot_send_campaign_from_excel (read the sheet and map columns → template variables), gambot_send_campaign (ad-hoc list/segment, no save), or gambot_create_campaign (save and/or schedule once/recurring). Campaigns manage throughput, per-row variables, opt-out/consent and delivery reports.
  • gambot_get_message_statusCheck whether a message you sent was delivered. Pass the messageId returned by gambot_send_text / gambot_send_template (or per recipient from a campaign send) and, for a fast exact lookup, the recipient's phone. Returns { messageId, phone, status (sent|delivered|read|failed), time, errorMessage? }. Use it as the final step of 'send a first test message' and whenever a user says 'I don't see the message arrived'. If status=failed with Meta error 131042 the response carries a paymentIssue block: the WhatsApp Business API payment method is SEPARATE from the Meta Ads one — tell the user to add one in Meta Business Settings ▸ Billing.
  • gambot_list_conversationsList the org's conversations = CONTACTS, ordered by most recent message. This returns WHO you've been talking to with per-contact METADATA only — name, phone, last-message time and a short last-message preview, plus status/tags/owner. It does NOT return the message history/content. To read the messages of ONE conversation use gambot_get_conversation_messages; to read message CONTENT across ALL conversations for a period (e.g. 'today') use gambot_analytics_transcript.
  • gambot_get_conversation_messagesRead the full message HISTORY (content) of ONE conversation, identified by the contact's phone, newest-first and paginated with before/after cursors. Use this to see everything said with a specific customer. For just the LIST of conversations/contacts (no content) use gambot_list_conversations; for message content across ALL conversations in a period use gambot_analytics_transcript.
  • gambot_check_windowCheck whether the 24-hour WhatsApp customer-service window is OPEN for a contact BEFORE you message them. WhatsApp only allows free text while the window is open (i.e. the contact messaged you in the last 24h); once it's CLOSED you MUST use an approved template. Call this whenever you're about to send a one-off message and aren't sure the conversation is active — then route accordingly: windowOpen=true → gambot_send_text (or a template); windowOpen=false → gambot_send_template (list options with gambot_list_templates). Returns { phone, windowOpen, canSendFreeText, requiresTemplate, reason, recommendation, defaultTemplateId }.
  • gambot_list_numbersList the organization's connected WhatsApp SENDER numbers. Use this in a multi-number org to discover which line you can send FROM: pass the returned `phoneNumberId` (or `displayNumber`) as `from` on gambot_send_text / gambot_send_template, or as `fromNumberId` on the campaign tools. When omitted, the org's PRIMARY number is used. Returns { count, items:[ { phoneNumberId, displayNumber, label, isPrimary, status, defaultTemplateId } ] }.
  • gambot_list_conversation_slaList WhatsApp conversations ranked by how long the customer has been WAITING for a reply (the message-response / chat SLA). The clock starts at the customer's last inbound message and stops on ANY reply (human or bot). Levels come from the org's settings: 'warn' (amber) and 'breach' (red), and — when business hours are enabled — only working time is counted. Use this to answer 'who is waiting / which chats breached SLA / who hasn't been answered'. level: open (default = warn+breach, the actionable ones) | all | ok | warn | breach. Returns { level, config:{ warnMinutes, breachMinutes, statuses, businessHoursEnabled }, count, total, items:[ { phone, name, lastMessage, lastMessageTime, lastConversationStatus, waitingMinutes, level, ownerId, ownerName } ] } sorted longest-waiting first.
  • gambot_get_conversation_slaMessage-response SLA status for ONE conversation: is the customer currently waiting for a reply, for how many minutes, and at what level (ok/warn/breach). Returns { phone, name, lastMessageDirection, lastMessageTime, lastConversationStatus, waiting, waitingMinutes, level, ownerId, ownerName, config }.
  • gambot_list_templatesList all WhatsApp templates for the organization.
  • gambot_get_templateGet a single template by id, including Meta approval status.
  • +137 more on the listing page

Sendraven MCP Server tools 55

  • send_emailSend a transactional email, immediately or scheduled. scheduled_at takes a relative phrase like 'in 3 days' or an ISO timestamp. The From domain must already be verified. Every accepted send answers with the same fields: id, status, thread_id, scheduled_at, skipped, reason and approval_id. skipped: true (status 'rejected', with reason) means every recipient was suppressed or opted out and nothing was sent; a retry answers the same. status 'pending_approval' (with approval_id) means a person must release it; a retry does not release it. Otherwise skipped is false and reason and approval_id are null. idempotency_key makes a retry of the identical message safe; it matches only the identical message. Refusals, by type: 422 no_verified_identity (the From domain has no verified sending domain; a retry answers the same until it is added and verified); 422 invalid_request (a bad field, or more than 50 recipients across to, cc and bcc, which fit as separate messages or a campaign); 422 unknown_topic; 422 invalid_schedule; 403 recipient_not_allowed (this key's allowlist); 429 daily_limit (this key's daily cap; it resets tomorrow, and a retry today answers the same); four billing refusals, all 402 and none retryable — plan_limit_reached (the Free plan's 3,000 emails a month are spent; a person has to activate paid sending), payment_method_required (the workspace has never had a payment method verified, so no outbound email leaves it at all, including on Free; only a person can add one, in the dashboard), billing_past_due (the payment failed for good) and budget_exceeded (the workspace's own spend ceiling; by default it stops marketing and lets transactional through); 422 workspace_suspended and 422 no_postal_address (a person has to act). 502 ses_error is the provider, and a later retry with the same idempotency_key is safe. get_usage shows which of these applies before a send, and apart from ses_error none clears by repeating the call.
  • list_emailsList messages newest first with their delivery status, including held, scheduled, skipped and failed ones and the mail campaigns and automations sent. Filter by status or recipient. Paged: at most 100 per call; while has_more is true, next_cursor passed back as cursor with the same filters returns the next page. An unknown status is refused with 422 invalid_request rather than answering an empty log.
  • get_emailFetch one message with its full event timeline (send, delivery, bounce, complaint, open, click). The timeline shows why an email didn't arrive.
  • cancel_scheduled_emailCancel a scheduled email before it sends. Only works while status is 'scheduled': a message that has already started sending, or is in any other state, answers 409 invalid_state naming its status; a retry answers the same, and get_email shows where it stands. An unknown id answers 404 not_found.
  • list_sending_domainsList sending domains with their verification status and the DNS records each one needs. Each record shows what is currently published, so this diagnoses a stuck verification. mail_from says whether SES has adopted the bounce. subdomain as the Return-Path: pending while SES polls for its MX record, then active. SES polls for 72 hours from when the domain was added, not from when the MX appears, and then marks it failed; publishing the MX later and calling verify_sending_domain restarts it. A verified domain sends fine meanwhile; only SPF alignment waits.
  • add_sending_domainRegister a sending domain and get back the DNS records to publish. It takes the domain mail is sent from — mail.<domain> and news.<domain> are provisioned beneath it and the right one is chosen per message, so a marketing complaint spike can never affect password reset delivery. risk_class provisions one of the two on its own. Two records come back marked optional: an inbound MX so replies land in threads, and a link. CNAME that turns on click tracking on the customer's own name once its certificate is issued. Adding a domain that already exists returns it rather than a duplicate. A public suffix such as co.uk or github.io is not a domain anyone can send from and is refused with 422 invalid_request; the domain registered under it, e.g. example.co.uk, is accepted. Passing mail.example.co.uk or news.example.co.uk is read as example.co.uk. A plan with no room for another domain answers 402 plan_limit_reached; a retry answers the same until a person upgrades or removes a domain.
  • verify_sending_domainRe-check a domain's DNS records now instead of waiting for the background monitor. Also restarts bounce-path (mail_from) verification when SES gave up before the MX record existed.
  • list_suppressionsList addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual, list_hygiene), newest first, each with its scope. When someone reports not receiving email, this shows whether the address is suppressed. email returns one address's suppressions directly; scanning pages instead is how the wrong suppression gets cleared. At most 100 per call; while has_more is true, next_cursor passed back as cursor returns the next page.
  • add_suppressionStop sending to an address. Scope 'marketing' leaves transactional mail working; the default is 'all'. Reason 'unsubscribe' is a real opt-out: it also cancels the person's queued scheduled sends and ends their automation enrolments, which is what a person who asked to stop expects and 'manual' does not do. A hard bounce or complaint already on file is never replaced; the response is the stored suppression (id, email, reason, scope, detail, created_at), so its reason says which one stands.
  • remove_suppressionRemove a suppression so the address can be mailed again. A hard bounce means the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. The scope must match the stored one: removed: false means nothing was suppressed in that scope (an address suppressed for 'marketing' is not lifted by 'all'); list_suppressions with email shows the scope that is stored.
  • create_broadcastCreate a campaign as a draft. Nothing is sent: preview_broadcast reports its reach and send_broadcast sends it. identity_id must be a marketing sending domain (see list_sending_domains; risk_class 'marketing'). topic_key must name an existing topic (list_topics); an unknown one is refused with 422 unknown_topic, since it would count everyone as opted out. A segment_id must filter the same audience as audience_id. An A/B test takes 2 to 10 'variants' that differ in subject, from_name or send_at, and optionally 'ab_test'. A subject or from-name test sends sample_share of the audience (default 0.2) split evenly across the variants, waits decide_after_minutes (default 240) after the sample is out, picks the variant with the best unique open rate (or click rate with metric 'click'), and sends the rest to it. Each variant needs at least 100 recipients in the sample or the send is refused — preview_broadcast shows the number. Metric 'click' only works once the domain has click tracking; until then every variant shows zero clicks and the first variant wins by default. The response's web_version_url is a public page of the campaign (one URL, no recipient's unsubscribe link) to share on a site or social post; null until click tracking is active.
  • get_broadcastOne campaign, with a 'progress' object while it is sending, paused or testing: how many addresses are still pending, sent, failed, or skipped because the person opted out after the campaign started. This is what tells a paused campaign that is still making progress from one that is waiting; pause_reason says on what, and resume_after when a warm-up pause renews. progress is null for a campaign not in flight. For an A/B test, progress.by_variant is a list of { key, pending, sent, failed, skipped } in variant order, ending with a row whose key is null: the addresses still waiting for the winner. An A/B test also carries 'ab_test' with live per-variant results — sent, unique opens, unique clicks and their rates — plus 'decide_at' and, once decided, 'winner' and 'decided_by'. Status 'testing' means the sample is out and the rest of the audience is waiting on the decision.
  • +43 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Gambot WhatsApp Business API

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "gambot-whatsapp-business-api": {
      "command": "npx",
      "args": [
        "-y",
        "gambot-mcp"
      ],
      "env": {
        "GAMBOT_TOKEN": "YOUR_GAMBOT_TOKEN_HERE"
      }
    }
  }
}

Sendraven MCP Server

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "mcp-249": {
      "command": "npx",
      "args": [
        "-y",
        "@sendraven/mcp"
      ],
      "env": {
        "SENDRAVEN_API_KEY": "YOUR_SENDRAVEN_API_KEY_HERE"
      }
    }
  }
}

Frequently asked questions

Gambot WhatsApp Business API is categorized under Communication and uses a local stdio subprocess. Sendraven MCP Server belongs to Communication and uses a local stdio subprocess. Pick Gambot WhatsApp Business API for communication work and Sendraven MCP Server for communication.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Gambot WhatsApp Business API has no declared pricing — check the project's own site. Sendraven MCP Server has no declared pricing — check the project's own site. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add gambot-whatsapp-business-api and mcp-249 as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Gambot WhatsApp Business API has a quality signal of 63/100 (Good) with 1 views, 0 installs and 2 GitHub stars. Sendraven MCP Server has 63/100 (Good) with 3 views, 0 installs and 1 GitHub stars.