Generated banner for AWS Sms Voice
Generated logo for AWS Sms Voice

AWS Sms Voice

AWSOfficialPublished by AWS

  • Skill
  • Tool integration
  • Cloud and DevOps
  • Apache-2.0
  • Low risk

From the author

Onboards RCS Business Messaging and Notify OTP via the pinpoint-sms-voice-v2 AWS CLI. Covers creating a branded RCS test agent (logo, banner, rich cards, suggested replies), adding verified testers, and sending/receiving the first RCS message; and configuring AWS End User Messaging Notify to send one-time-passcode (OTP) verification codes through AWS-managed phone numbers without buying a number or completing carrier registration. Also discovers which registration type a country requires from live API definitions and runs the universal registration lifecycle (create, derive fields, fill, submit, recover from denial, resubmit) shared by 10DLC, toll-free, short code, sender ID, RCS country launch, and Notify tier upgrade. Applicable to RCS agent setup, RCS message send/receive, Notify OTP configuration, verification-code delivery, registration requirements by country, and registration submission. Does not cover WhatsApp (see aws-social-messaging).
— the description by AWS

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a structured approach to using the AWS End User Messaging SMS and Voice (pinpoint-sms-voice-v2) API. It guides users through the rapid setup of RCS Business Messaging test agents and Notify OTP configurations, as well as the more complex lifecycle of production registration for various messaging identities. It emphasizes using the AWS MCP server for secure, audited execution and provides clear paths for both testing and moving to production-grade messaging.

What it does

  • Creates branded RCS test agents with rich cards and suggested replies.
  • Configures Notify for OTP delivery using AWS-managed templates.
  • Discovers registration requirements for specific countries and identity types.
  • Executes the full registration lifecycle including submission and denial recovery.
  • Provides procedures for exiting the SMS sandbox and upgrading to production tiers.
  • Offers guidance on least-privilege IAM policies and security best practices.

When to use it

  • When you need to send rich, branded RCS messages to test devices.
  • When you require a fast, production-ready OTP verification solution.
  • When you need to determine registration requirements for international messaging.
  • When you are ready to move messaging identities from sandbox to production.
  • When you need to manage the registration lifecycle for 10DLC, toll-free, or short codes.

Advantages

  • Enables rapid prototyping with no phone number purchase required.
  • Provides a unified engine for diverse registration types.
  • Includes built-in failure mode analysis and cleanup procedures.
  • Promotes secure practices through least-privilege IAM and audit logging.
  • Supports both CLI and MCP-based execution for flexibility.

Usage examples

“Help me set up an RCS test agent to send a branded message.”
The agent will guide you through creating an RCS agent, adding a verified test device, and sending your first rich message using the pinpoint-sms-voice-v2 API.
“How do I send an OTP code using AWS Notify?”
The agent will assist in creating a Notify configuration, selecting an approved template, and sending a verification code to your specified phone number.
“What are the registration requirements for sending SMS in France?”
The agent will query live API definitions to identify the specific registration type and field requirements for the target country.
“I need to move my SMS identity out of the sandbox.”
The agent will walk you through the production go-to-production guide, including checking account attributes and managing spend limits.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/aws/aws-sms-voice/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip aws-sms-voice.zip -d .agents/skills

Documentation by AWS

AWS End User Messaging — SMS, Voice, RCS & Notify

Overview

AWS End User Messaging SMS and Voice (the pinpoint-sms-voice-v2 API) is the control and data plane for SMS, Voice, RCS Business Messaging, and Notify (OTP). This skill covers the two fastest onboarding paths — each reaches a real message on a real phone in about five minutes, with no phone-number purchase and no carrier registration:

  1. Create an RCS test agent and send your first branded message — a branded RCS Business Messaging agent, a verified test device, and a rich outbound + inbound message. See references/hello-rcs-test-agent.md.

  2. Send an OTP with Notify — a one-time-passcode text through AWS-managed sending identities and pre-approved templates. See references/hello-notify-otp.md.

Beyond onboarding, this skill takes an identity to production registration in three steps:

  1. Find which registration a country requires — discover the registration type and its live field set for a target country and identity type, reconciled with the official docs. See references/registration-requirements-by-country.md.

  2. Run the registration lifecycle — the universal engine (create, derive fields, fill, submit, poll, recover from denial, resubmit) shared by every registration type, including RCS country launch. See references/registration-core-engine.md.

  3. Take an identity to production — exit the SMS sandbox, launch RCS in a country with carrier monitoring and SMS fallback, upgrade Notify to Advanced, and apply production hygiene (keywords, configuration sets, protect configurations). See references/customer-go-to-production-guide.md.

Guardrail — where this skill's files live (MCP vs local install)

This skill can be loaded two ways, and the references/ files resolve differently:

  • Loaded through the AWS MCP retrieve_skill tool. Reference files do not exist on the local filesystem. Fetch them via retrieve_skill with the file parameter (e.g., file="references/hello-rcs-test-agent.md"). Do NOT file_read these paths locally — they are not there.

  • Installed locally (e.g., .kiro/skills/aws-sms-voice/). Read references from the local skill directory using the relative paths shown in this file.

This applies only to the skill's own packaged files. User-created artifacts (brand-assets/, temp files) are always in the user's working directory.

Execute commands using available tools from the AWS MCP server when connected — it provides sandboxed execution, audit logging, and observability. When the MCP server is not available, fall back to the AWS CLI or shell as needed.

Choosing a path

You want to…Go to
Send rich, branded messages (cards, logo, two-way) to your own test phonehello-rcs-test-agent.md
Send a verification code / OTP to any supported phone, fastest possible pathhello-notify-otp.md
Find out which registration a country needs and what fields it requiresregistration-requirements-by-country.md
Create and submit a registration of any type (10DLC, toll-free, sender ID, RCS launch, Notify tier)registration-core-engine.md
Take an identity to production (sandbox exit, RCS carrier launch + fallback, Notify Advanced, hygiene)customer-go-to-production-guide.md

RCS test agents deliver only to verified test devices and require a short brand registration (auto-reviewed in minutes). Notify sends to any recipient in its supported countries immediately, but is limited to AWS-managed OTP templates. Pick RCS to explore rich messaging; pick Notify for the shortest path to a production-grade verification text.

Before you start (both paths)

The AWS MCP server is recommended for the best experience here — it runs the many pinpoint-sms-voice-v2 and sts calls with sandboxed execution, audit logging, and observability. It is not a hard requirement: every step also works with the plain AWS CLI or the AWS Agent Toolkit when the MCP server is not available.

  1. Credentials. Run aws sts get-caller-identity --region <REGION> (pass --region to use the regional STS endpoint; the global sts.amazonaws.com endpoint is legacy). If it fails, configure the user's auth (named profile / SSO / access keys — --profile <PROFILE> on every command if a profile is in play) and prefer an assumed IAM role with ephemeral credentials. Each reference file's Prerequisites carry the full auth, CloudTrail-audit, and CLI-freshness steps.

  2. Least-privilege access. These tasks need a small set of specific sms-voice: actions in the target account (the reference files enumerate the read/write actions each step uses — for example sms-voice:DescribeRcsAgents, CreateRcsAgent, CreateRegistration, CreateNotifyConfiguration, and SendNotifyTextMessage). Scope the policy to exactly the actions the chosen path uses; do not grant sms-voice:* or *FullAccess.

  3. Don't trust the CLI version. Treat any Invalid choice '<operation>' on a pinpoint-sms-voice-v2 command, at any step, as a stale/partial local service model (not a permissions or account problem). The RCS and Notify reference files (prerequisite 3) carry the full reactive resolution: clear a stale ~/.aws/models/pinpoint-sms-voice-v2/ override, else upgrade the AWS CLI, with a boto3 fallback. AccessDeniedException means the identity is missing the required sms-voice: permissions.

Each reference file is self-contained: it tracks the IDs you collect as session state, audits required inputs against the service before any submit, and ends with a Failure modes table and a Cleanup section. Follow the file for the path the user chose rather than improvising the API sequence — several steps fail silently or depend on service-version-specific field sets that must be read live.

Security Considerations

  • Least-privilege IAM. Scope policies to specific sms-voice: actions; never use *FullAccess or sms-voice:* in production. The reference files enumerate the minimal read/write actions each onboarding path needs.

  • Ephemeral credentials. Assume an IAM role with ephemeral credentials; never embed long-lived access keys in code, config, or environment variables.

  • No secrets in messages or fields. OTP codes and message bodies can surface in CloudTrail and downstream logs — treat them as sensitive and never hardcode real codes. Enable CloudTrail logging for sms-voice API calls and encrypt CloudTrail logs and CloudWatch Log groups with a KMS CMK. Attach a configuration set with an event destination (CloudWatch Logs or Kinesis) for delivery monitoring before production traffic. Create CloudWatch alarms on key security signals (repeated AccessDeniedException, unusual send volumes, spend limit approaching threshold) for proactive alerting. Registration contact fields (email, phone, URLs) are submitted to partner review; use real but non-sensitive business contacts.

  • Consent and opt-out. Only message recipients who have opted in. Honor STOP / opt-out state; the RCS path shows how to check the opt-out list before sending. Test agents intentionally restrict delivery to verified test devices — do not work around that to reach unconsented numbers.

  • Spend limits and abuse. Default account spend limits are intentionally low; raise them deliberately and monitor. Notify enforces a non-adjustable per-day cap per destination — do not attempt to bypass it.

  • Destructive cleanup. The teardown steps delete agents, registrations, and configurations. They are irreversible — confirm with the user before running cleanup, and note RCS agents have deletion protection enabled by default in the onboarding flow.

Additional Resources

Files

references/registration-requirements-by-country.md

AWS End User Messaging: Registration requirements by country — live discovery

Country- and number-type-specific registration requirements change over time: registration types appear, field sets grow, review ETAs shift, and countries move between optional-registration and required-registration. Do not rely on this file's — or any cached copy's — per-country specifics. Inspect the live sources at the start of every run. This file is deliberately mostly pointers: the discovery commands that stay current, and the official docs pages that hold the human-readable per-country rules. The universal mechanics of working a registration (state machines, field filling, denial recovery) live in references/registration-core-engine.md — this file answers only "which type, and what does it require."

You run every command yourself. Your FIRST action MUST be to run describe-registration-type-definitions for the region — before you write any part of the answer. You MUST NOT state which registration a country needs, or name any registration type, until that command's output has returned this session; then you MUST run describe-registration-field-definitions on the matched type for the authoritative field set. A memorized or example-derived answer — including anything from this file's examples or your own training knowledge — is a defect, no matter how plausible. Before stating any conclusion you MUST also state the reconciliation rule (where docs and live field definitions disagree, the live definitions win). Treat the API output as the source of truth. Stop and consult the Failure modes table on any error.

Session state

ValueFormatSource
REGIONe.g. us-east-1ask the user (default us-east-1)
ISO2ISO 3166-1 alpha-2, e.g. XXthe user's target country
REG_TYPEe.g. <ISO2>_RCS_LAUNCH_REGISTRATIONmatched from discovery below

Prerequisites

  • AWS account with the AWS End User Messaging SMS and Voice service enabled.

  • IAM role with least-privilege permissions for the read-only sms-voice: describe actions used below (DescribeRegistrationTypeDefinitions, DescribeRegistrationFieldDefinitions, DescribeRegistrationSectionDefinitions). Prefer assuming an IAM role with ephemeral credentials over long-lived access keys.

  • Validate all input parameters (region, ISO country code, registration type) before calling APIs.

  • These operations are available through the AWS MCP Server, which provides sandboxed execution, audit logging, and observability. When the MCP server is not available, use the AWS CLI commands shown below.

  • Confirm the AWS CLI is available (aws --version). On CLI v1, URL-valued fields and aws logs tail behave differently — the core-engine file flags v1 forms where they matter.

Live discovery — the API is the authority

Three read-only calls give the current truth for the account and region.

First, list every registration type available in the region:

aws pinpoint-sms-voice-v2 describe-registration-type-definitions --region <REGION>

Match the returned names against the user's goal:

GoalType-name patterns to look for
RCS launch in a country<ISO2>_RCS_LAUNCH_REGISTRATION; also TEST_RCS_LAUNCH_REGISTRATION for the testing flow
Sender ID in a country<ISO2>_SENDER_ID_REGISTRATION
Short code in a country<ISO2>_SHORT_CODE_REGISTRATION
Long code in a country<ISO2>_LONG_CODE_REGISTRATION
US 10DLCUS_TEN_DLC_* (brand registration, brand vetting, campaign registration)
US toll-freeUS_TOLL_FREE_REGISTRATION
Notify tier / brandNOTIFY_* (filter the live output for types containing NOTIFY — e.g. the tier-upgrade and brand-verification variants)

Save the matched type name as REG_TYPE, plus its SupportedAssociations and AssociationBehavior. If no type matches the country/identity combination, that combination is not registrable via the API — check the docs pages below for whether it needs a Support case or is unsupported.

Then derive the authoritative field set for that type, and optionally its section grouping:

aws pinpoint-sms-voice-v2 describe-registration-field-definitions \
  --registration-type <REG_TYPE> --region <REGION>
aws pinpoint-sms-voice-v2 describe-registration-section-definitions \
  --registration-type <REG_TYPE> --region <REGION>

The field definitions output is the only authoritative statement of what a registration requires: field paths, types (TEXT/SELECT/ATTACHMENT), REQUIRED vs OPTIONAL, and validation constraints. It is paginated — walk all pages. Do not filter this output; conditional field requirements depend on context from the complete definition shape.

Official docs pages — the human-readable per-country rules

Fetch the relevant page(s) each run over HTTPS (append .md to any slug for a markdown variant):

PageURLWhat it holds
Registration overviewhttps://docs.aws.amazon.com/sms-voice/latest/userguide/registrations.htmlWhich registrations exist per country/identity type; console forms vs Support cases; status-vs-sending-behavior rules
Review ETAshttps://docs.aws.amazon.com/sms-voice/latest/userguide/registration-eta.htmlEstimated review time per country + identity type
Sender ID ruleshttps://docs.aws.amazon.com/sms-voice/latest/userguide/sender-id.htmlSender ID character rules, registered-vs-dynamic per country, the casing rule
Country capabilities hubhttps://docs.aws.amazon.com/sms-voice/latest/userguide/phone-numbers-sms-support-by-country.htmlSMS/MMS capabilities and restrictions; links to per-country supported-countries tables
RCS country launcheshttps://docs.aws.amazon.com/sms-voice/latest/userguide/rcs-country-launch.htmlPer-country RCS launch process: use-case categories, carrier states, timelines

The reconciliation rule

  1. Run the discovery commands for the target country and identity type.

  2. Fetch the matching docs page(s) for the human context: prerequisites, evidence to prepare (opt-in proof, compliance video, letters of authorization), ETAs, and country specifics.

  3. Reconcile. Where the docs and the live field definitions disagree — a field the docs do not mention, a type the docs still call by an old name — the live field definitions win. They are the tiebreaker; docs lag the service.

  4. Execute the mechanics from references/registration-core-engine.md with the discovered REG_TYPE and field set.

Worked example: "the user wants to send SMS to a country <ISO2>"

This example uses the placeholder <ISO2> for the user's target country. It never names a real country or a real registration type — substitute what your own discovery returns this run.

Discover what the region offers for <ISO2>:

aws pinpoint-sms-voice-v2 describe-registration-type-definitions --region <REGION>

Inspect the returned RegistrationType names for entries starting with <ISO2>_. Then read, each run: the country capabilities hub (follow its supported-countries link to the <ISO2> row for which origination identity types that country supports, whether registration is required, two-way support); the registration overview page (is there an <ISO2> form, or a Support-case country); and the ETA page (review time for the identity type you land on).

Conclude from what the pages and describe-registration-type-definitions returned this run — for example, whether <ISO2> supports sender IDs without registration or a registered long code via an <ISO2>_LONG_CODE_REGISTRATION type with an N-day review. State it from this run's output, never from this example, and never from prior knowledge of any specific country.

State the reconciliation rule in your answer. Treat describe-registration-field-definitions as the authoritative field set, and say so explicitly: where the documentation pages and the live field definitions disagree, the live definitions win, because the docs lag the service. Name describe-registration-field-definitions as the source of the field list. If the live output disagrees with the pages, follow this rule and note the discrepancy to the user. Then run the machinery: references/registration-core-engine.md.

Verify

Demonstrable outcome. This file's artifact is the live discovery itself, on screen this run: the describe-registration-type-definitions output naming the matched REG_TYPE, the describe-registration-field-definitions field list for it (all pages), and the one-paragraph conclusion derived for the user's country from this run's output — "country XX needs <REG_TYPE>; N required fields including <example fields>; review ETA per the docs page." If the live output and the docs pages disagreed, the note of that discrepancy is part of the deliverable. Nothing here is demonstrable from memory — if the discovery commands were not run this session, the job is not done; leave the user the three read-only calls above as the exact sequence that produces the answer.

Next steps

Security Considerations

  • Least-privilege IAM. This flow is read-only discovery — scope the policy to the specific sms-voice: describe actions used above (DescribeRegistrationTypeDefinitions, DescribeRegistrationFieldDefinitions, DescribeRegistrationSectionDefinitions); never use *FullAccess or sms-voice:*.

  • Ephemeral credentials. Assume an IAM role with ephemeral credentials; never embed long-lived access keys in code, config, or environment variables.

  • Input validation. Validate all inputs (region, ISO country code, registration type) before passing them to APIs, and fetch the docs pages over HTTPS.

  • Logging. Enable CloudTrail logging for sms-voice API calls in the account and encrypt CloudTrail logs and CloudWatch Log groups with a KMS CMK to maintain an audit trail of discovery queries — who queried registration type definitions and when — for compliance and incident response.

  • AWS security references. These recommendations follow AWS security best practices — see IAM Best Practices for least-privilege and ephemeral credentials, and AWS KMS Best Practices for encrypting CloudTrail logs and CloudWatch Log groups.

Failure modes

Error / symptomCauseFix
A remembered or documented registration type name is rejected as invalidType names drift (e.g. a stale MANAGED_ROUTES_BRAND_VERIFICATION)describe-registration-type-definitions — use only names it returns
Submit fails on a field no doc mentionedField sets grow over time; docs lagRe-derive with describe-registration-field-definitions; the live schema is the tiebreaker
A docs URL above returns 404Docs pages get reorganizedSearch the user guide root (what-is-service.html) for the topic's current slug; do not skip the fetch
No <ISO2>_* type exists for the target countryCombination not API-registrableCheck the registration overview page — Support-case-only country, or unsupported

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an MCP server

Security

What our scanner noticed· Low risk

  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
AWS
Publisher
AWS (Official)
Source
aws/agent-toolkit-for-aws · skills/specialized-skills/customer-communications-skills/aws-sms-voice · commit 0a218f8
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • NOTICE (added by AutoGineer from NOTICE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by AWS.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-sms-voice.zip