Skip to main content
skill CX Codex

sent-messaging — Claude Code skill: send SMS and WhatsApp

A skill for Sent messaging: builds a template-based send, then checks one message's status and delivery history through MCP tools.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add sentdm/sent-plugin --skill sent-messaging -a claude-code
Open on GitHub

What sent-messaging does

Three operations sit behind this skill: messages.send, messages.get and messages.activities.list. With them the agent fires off SMS, WhatsApp or RCS, reads the current record for a known identifier, and walks through lifecycle events. Sends are template-only. You locate an existing template through templates.list or templates.get in the same acting scope, pass its real ID or name, and supply every declared variable. Free-form text will not work as a template name.

Before any mutation the skill builds the exact messages.send arguments without calling the tool, then shows a preview: organization, Sender Profile, channel, destination, template and its reviewed content, variables, scheduling and idempotency inputs. Confirmation must be explicit and tied to that payload — approval given earlier in the conversation does not carry over. For a scheduled send, scheduledAt takes an ISO-8601 timestamp with an explicit UTC offset or Z; offset-free values are rejected, and the instant has to land between 1 minute and 30 days ahead. No MCP tool exists for rescheduling or cancelling.

The MCP client handles OAuth 2.1/PKCE authorization, and the skill forbids asking for, printing or storing tokens and API keys. If the client lacks MCP support or authorization fails, the skill still helps plan a payload but cannot execute the send. A retry counts as a fresh mutation: rebuild the payload, preview again, confirm again.

What it helps with

  • send an SMS or WhatsApp message from an existing template
  • schedule a send for a specific local time
  • confirm whether a message was delivered, given its ID
  • trace lifecycle events to find why a send failed
  • recover from a timed-out send without duplicating it

Example prompts for the agent

  • Send a message using the order_shipped template to the number on this order
  • Schedule the send for tomorrow at 10:00 Moscow time
  • Check message msg_123 and show me its activity history

How to install sent-messaging

1Skills CLI (Vercel)

npx skills add sentdm/sent-plugin --skill sent-messaging -a claude-code

2Manually: put the files in place

~/.claude/skills/sent-messaging/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/sent-messaging/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about sent-messaging

How do I install sent-messaging in Claude Code?

Run npx skills add sentdm/sent-plugin --skill sent-messaging -a claude-code. The skill file then sits at ~/.claude/skills/sent-messaging/SKILL.md.

What does sent-messaging do?

It prepares and sends a template-based message through Sent, then reads back the state of that message and its delivery events. For aggregate diagnosis across many sends it hands off to messaging-performance-analyzer.

Does the skill need an API key?

No. The MCP client runs OAuth 2.1/PKCE authorization, and the skill forbids requesting, printing or storing tokens and keys. Without a successful authorization only payload planning is available.

Source text

SKILL.md · MIT
---
name: sent-messaging
description: Sends SMS, WhatsApp, or RCS messages through Sent and retrieves individual message status and activity history with the Sent MCP tools. Use when a user asks to send, schedule, or preview a message, check a message ID, confirm delivery status, inspect lifecycle events, investigate a timed-out or ambiguous send, or retry safely. Use messaging-performance-analyzer for aggregate delivery diagnosis.
---

# Sent Messaging

Operate direct message workflows with `messages.send`, `messages.get`, and `messages.activities.list`.

## Establish connection and scope

1. Let the MCP client perform OAuth 2.1/PKCE authorization. Never request, accept, print, or store tokens, API keys, authorization headers, client IDs, or secrets.
2. Surface the organization and Sender Profile selected by the active connection before a mutation. If the client context does not expose both, use `sent-account-readiness` to inspect the authorized scope before continuing.
3. Use an explicit, validated acting profile when an organization grant supports it.
4. Minimize sensitive output. Mask phone numbers where practical and do not repeat message bodies after the operator has reviewed them.

If MCP is unsupported or authorization fails, keep the skill usable for payload planning. Explain that execution requires a compatible client or reauthorization; never ask the user to paste a credential.

An organization grant may select an owned Sender Profile with the tool schema's optional `profileId`; omit it to act as the authenticated account. Validate ownership with `sender_profiles.list` or `sender_profiles.get`, and use the same selector for preflight reads, mutations, and follow-up reads. Profile grants cannot use this selector. Reauthorize for a different organization or a profile outside the grant. Never invent scope fields or request credentials.

## Inspect a message

- Use `messages.get` for the current record when a message identifier is known.
- Use `messages.activities.list` for lifecycle events and delivery evidence.
- State that an accepted or queued send is not proof of delivery. Report delivered only when the returned state or activity establishes delivery.
- Return identifiers, timestamps, and status evidence needed to answer the question, masking recipient data and omitting the message body unless it is necessary.

For aggregate trends, funnels, or root-cause analysis across many delivery records, hand off to `messaging-performance-analyzer`.

## Prepare a send

1. Resolve the intended channel, Sender Profile, recipient, existing template, variables, `scheduledAt`, and `idempotencyKey`. Sends are template-only: first use `templates.list` or `templates.get` in the same acting scope, reference its real ID or name in `template`, and provide every declared variable in `template.parameters`. Never pass message text as a template name or invent a free-form text argument. Do not invent missing values.
2. For a high-volume send, use `sent-account-readiness` to check `balance.get` before preparing the mutation. Stop if the available balance or account readiness is insufficient or unclear.
3. Build the exact `messages.send` arguments without calling the tool.
4. Show a payload preview that includes the selected organization, Sender Profile, channel, exact destination, existing template identifier and its reviewed content, variables, and scheduling/idempotency inputs. Show sensitive content once only; mask it where the operator can still verify the target.
5. Ask for explicit confirmation for this exact payload. General approval given earlier in the conversation is not sufficient.
6. Call `messages.send` immediately after that confirmation. If any payload value, scope, or elapsed context changes, discard the confirmation and preview again.

Never call `messages.send` without the preview and explicit confirmation immediately before the call.

## Schedule a send

`scheduledAt` is optional. Resolve the user's date, time, and timezone into an ISO-8601 timestamp with an explicit UTC offset or `Z`; offset-free timestamps are rejected. The instant must be 1 minute to 30 days ahead at execution. Include the exact local time and UTC instant in the preview, and revalidate the window before calling.

Acceptance returns `QUEUED` with `scheduledAt`; the message then moves to `SCHEDULED`, visible through `messages.get`, and releases around the requested time within a few minutes. Recipient quiet hours can defer it to the next allowed time, reported through `message.scheduled`. Do not promise an exact delivery time. Account scheduling limits can reject the send. There is no MCP reschedule or cancellation tool; do not invent one.

For schema-supported idempotency, use camelCase `idempotencyKey`; the same key can replay a cached send result for 24 hours. Keep the original key and arguments when recovering the same operation. A different intended send needs its own key. Idempotency does not replace review and confirmation.

## Handle results and retries

- Report the message identifier and the returned acceptance state. Say "accepted" or "queued" when that is all the response establishes; do not say "delivered."
- Use `messages.get` or `messages.activities.list` when the user asks for subsequent delivery state.
- Treat every retry as a new mutation: reconstruct the payload, show a fresh preview, and obtain new explicit confirmation immediately before the retry.
- Never blindly retry an ambiguous send. If the first call times out or its outcome is unknown, inspect `messages.get` and `messages.activities.list` when an identifier exists. Without conclusive evidence, report the unknown outcome and duplication risk. Only attempt another send after the operator chooses to do so and completes a new preview and confirmation.

© sentdm · MIT · sentdm/sent-plugin

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set18

sent-account-readiness This skill uses Sent MCP tools to check whether an account can send: balance, onboarding, KYC and the selected Sender Profile. CX Codex +1 2,900installs sent-templates Inspects, discovers, and removes existing Sent message templates via MCP tools. Useful for checking template review statuses or cleaning up obsolete records. CX Codex +1 2,900installs sent-contacts A skill that runs Sent contact operations through MCP tools: search, bulk import, messaging summary, deletion. Creates and deletes go through confirmation gates. CX Codex +1 2,900installs sent-analytics A skill for Claude, Codex and Cursor that pulls Sent messaging, deliverability and contact metrics through MCP tools and checks phone-number capabilities. CX Codex +1 2,900installs sender-profile-architect Designs Sent v3 Sender Profile architecture for multi-tenant and multi-channel applications. It helps set up isolation, API key scoping, WABA, and billing boundaries. CX Codex +1 2,900installs sms-10dlc-registration Prepares and validates a Sent US A2P 10DLC brand and campaign registration: consent evidence, use cases, sample messages. CX Codex +1 2,900installs rcs-agent-onboarding Walks you through Sent RCS and RBM onboarding: launch evidence checklist, Sender Profile readiness, templates and routing tests. CX Codex +1 2,900installs template-builder-ui Helps design and audit tenant-facing Sent v3 template builders, preview interfaces, channel validation, and lifecycle states before submitting to providers. CX Codex +1 2,900installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor