Skip to main content
Glama

send_message

Send an end-to-end encrypted text message to one Signal contact by phone number or username.

Instructions

Send a text message to one Signal contact (end-to-end encrypted). Use send_group_message for groups, send_attachment for files, send_note_to_self for your own Note to Self, schedule_message to send later. Address the contact by recipient (E.164, e.g. +4915112345678) or username (alice.42 or a username link) — exactly one, otherwise an error. message is the text; formatting=true turns bold, italic, strikethrough, monospace and ||spoiler|| into real Signal formatting (markers removed; leave off for literal asterisks/backticks). Reply/quote: quote_author (E.164) + quote_timestamp (ms) of the original; quote_message (quoted text; default: looked up in the local store), quote_mentions ({start, length, author}), quote_text_styles ('start:length:STYLE') and quote_attachments ('contentType[:filename[:previewFile]]') only shape the quote bubble. Link preview card: preview_url (must also appear in the text), preview_title (needed for the card to render), preview_description, preview_image (local file). Story reply: story_author (E.164, required with story_timestamp) + story_timestamp (ms). no_urgent=true sends without a push notification; notify_self=true delivers a normal notifying message if you are among the recipients. end_session=true instead resets the encrypted session (message ignored; troubleshooting only). Contacts Signal's servers; not idempotent (repeating sends a duplicate); sends share a 20-per-minute rate limit (calls wait rather than fail). The sent message is saved to the local store. Returns {status, timestamp, recipient}; timestamp is the target_timestamp for edit_message, react_to_message or delete_message.

Input Schema

NameRequiredDescriptionDefault
messageYesMessage text to send
usernameNoSignal username (e.g. alice.42) or username link, instead of recipient
no_urgentNoSend without the urgent flag, so the recipient gets no push notification
recipientNoPhone number in E.164 format (e.g. +1234567890)
formattingNoConvert **bold**, *italic*, ~~strikethrough~~, `monospace`, ||spoiler|| to Signal text formatting. Default false.
end_sessionNoReset the session with this contact instead of sending a message
notify_selfNoIf you are among the recipients, deliver as a normal (notifying) message instead of a silent sync message
preview_urlNoURL for a link preview card; the same URL must also appear in the message text
quote_authorNoPhone number (E.164) of the author of the message being quoted/replied to
story_authorNoPhone number of the story's author, to reply to a story
preview_imageNoLocal image file for the link preview thumbnail
preview_titleNoLink preview title (needed for the card to render)
quote_messageNoText of the quoted message shown in the quote bubble. Default: looked up in the local store by quote_author + quote_timestamp
quote_mentionsNo@mentions inside the quoted text, same shape as mentions: {start, length, author}
quote_timestampNoTimestamp of the message being quoted/replied to (from get_conversation)
story_timestampNoTimestamp of the story being replied to
quote_attachmentsNoAttachments of the quoted message as 'contentType[:filename[:previewFile]]', e.g. 'image/png:photo.png'
quote_text_stylesNoStyles inside the quoted text as 'start:length:STYLE' (BOLD, ITALIC, SPOILER, STRIKETHROUGH, MONOSPACE)
preview_descriptionNoLink preview description

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.43.0
    • addedInput schema / properties / formatting
      Added value: +{
      +  "description": "Convert **bold**, *italic*, ~~strikethrough~~, `monospace`, ||spoiler|| to Signal text formatting. Default false.",
      +  "type": "boolean"
      +}
  2. Changed16 schema fields changedv1.40.1
    • addedInput schema / properties / end_session
      Added value: +{
      +  "default": false,
      +  "description": "Reset the session with this contact instead of sending a message",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / no_urgent
      Added value: +{
      +  "default": false,
      +  "description": "Send without the urgent flag, so the recipient gets no push notification",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / notify_self
      Added value: +{
      +  "default": false,
      +  "description": "If you are among the recipients, deliver as a normal (notifying) message instead of a silent sync message",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / preview_description
      Added value: +{
      +  "description": "Link preview description",
      +  "type": "string"
      +}
    • addedInput schema / properties / preview_image
      Added value: +{
      +  "description": "Local image file for the link preview thumbnail",
      +  "type": "string"
      +}
    • addedInput schema / properties / preview_title
      Added value: +{
      +  "description": "Link preview title (needed for the card to render)",
      +  "type": "string"
      +}
    • addedInput schema / properties / preview_url
      Added value: +{
      +  "description": "URL for a link preview card; the same URL must also appear in the message text",
      +  "type": "string"
      +}
    • addedInput schema / properties / quote_attachments
      Added value: +{
      +  "description": "Attachments of the quoted message as 'contentType[:filename[:previewFile]]', e.g. 'image/png:photo.png'",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / quote_author / description
      Previous value: -"Phone number of the author of the message being quoted/replied to"New value: +"Phone number (E.164) of the author of the message being quoted/replied to"
    • addedInput schema / properties / quote_mentions
      Added value: +{
      +  "description": "@mentions inside the quoted text, same shape as mentions: {start, length, author}",
      +  "items": {
      +    "properties": {
      +      "author": {
      +        "type": "string"
      +      },
      +      "length": {
      +        "type": "integer"
      +      },
      +      "start": {
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / quote_message
      Added value: +{
      +  "description": "Text of the quoted message shown in the quote bubble. Default: looked up in the local store by quote_author + quote_timestamp",
      +  "type": "string"
      +}
    • addedInput schema / properties / quote_text_styles
      Added value: +{
      +  "description": "Styles inside the quoted text as 'start:length:STYLE' (BOLD, ITALIC, SPOILER, STRIKETHROUGH, MONOSPACE)",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / story_author
      Added value: +{
      +  "description": "Phone number of the story's author, to reply to a story",
      +  "type": "string"
      +}
    • addedInput schema / properties / story_timestamp
      Added value: +{
      +  "description": "Timestamp of the story being replied to",
      +  "type": "integer"
      +}
    • addedInput schema / properties / username
      Added value: +{
      +  "description": "Signal username (e.g. alice.42) or username link, instead of recipient",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "recipient",
      -  "message"
      -]New value: +[
      +  "message"
      +]
  3. Changed2 schema fields changedv0.1.2
    • changedInput schema / properties / quote_author / description
      Previous value: -"Phone number of the message being quoted/replied to"New value: +"Phone number of the author of the message being quoted/replied to"
    • changedInput schema / properties / quote_timestamp / description
      Previous value: -"Timestamp of the message being quoted/replied to"New value: +"Timestamp of the message being quoted/replied to (from get_conversation)"
  4. First observedv0.1.0

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, openWorld=true, idempotent=false, destructive=false. The description goes further with operationally critical context the annotations cannot convey: a 20-per-minute shared rate limit where calls wait rather than fail, non-idempotent duplicates, local-store persistence, and the {status, timestamp, recipient} return (valuable since no output schema exists).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Roughly 280 words for a 19-parameter tool, front-loaded with purpose and sibling routing before the parameter detail. Dense and mostly earn-its-place, though the mid-section reads as a run-on catalog of quote/preview fields that could be tightened with structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 19 parameters, no output schema, and an outward-facing side-effecting call, the description covers safety-adjacent behavior (rate limits, duplicates, session reset, server contact), the return shape, and every non-obvious parameter interaction. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds cross-parameter semantics the schema omits: recipient/username mutual exclusivity with an error condition, quote_author+quote_timestamp pairing, story_author+story_timestamp mutual requirement, and 'preview_url must also appear in the text' / 'preview_title needed for the card to render'. This is genuine net-new meaning, not restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+destination ('Send a text message to one Signal contact') and immediately distinguishes itself from send_group_message, send_attachment, send_note_to_self, and schedule_message. An agent can route to the right sibling without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit alternative routing is given for groups, files, Note to Self, and scheduled sends, plus the constraining condition 'exactly one, otherwise an error' for recipient/username. This is textbook when-to-use/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.