Skip to main content
Glama

send_group_message

Send encrypted text messages to a Signal group, including @mentions, formatting, replies, and link previews; use a group ID from list_groups.

Instructions

Send a text message to a Signal group (end-to-end encrypted to all members). Use send_message for a single contact, send_group_attachment for files. group_id comes from list_groups. message is the text. @mentions: put the name in the text and pass mentions [{start, length, author (E.164)}]; start/length are UTF-16 code units, not codepoints — an emoji before the mention shifts the offset by 2, not 1. formatting=true turns bold, italic, strikethrough, monospace and ||spoiler|| into real Signal formatting (markers are removed from the sent text); with it, mention offsets refer to the text as you wrote it, markers included, and are adjusted for you. Leave it off for text with literal asterisks or 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. 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, group_id}; timestamp is the target_timestamp for edit_message, react_to_message or delete_group_message.

Input Schema

NameRequiredDescriptionDefault
messageYesMessage text to send
group_idYesGroup ID (from list_groups)
mentionsNoList of @mentions. Each item: {start: offset of the mention in the message (UTF-16 code units, not codepoints), length: mention length (UTF-16 code units), author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]
no_urgentNoSend without the urgent flag, so the recipient gets no push notification
formattingNoConvert **bold**, *italic*, ~~strikethrough~~, `monospace`, ||spoiler|| to Signal text formatting. Default false.
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.42.0
    • addedInput schema / properties / formatting
      Added value: +{
      +  "description": "Convert **bold**, *italic*, ~~strikethrough~~, `monospace`, ||spoiler|| to Signal text formatting. Default false.",
      +  "type": "boolean"
      +}
  2. Changed14 schema fields changedv1.40.1
    • 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 (E.164) of the author of the message being quoted"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"
      +}
    • changedInput schema / properties / quote_timestamp / description
      Previous value: -"Timestamp of the quoted message (from get_conversation)"New value: +"Timestamp of the message being quoted/replied to (from get_conversation)"
    • 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"
      +}
  3. Changed1 schema field changedv1.36.0
    • changedInput schema / properties / mentions / description
      Previous value: -"List of @mentions. Each item: {start: character offset of the mention in the message, length: character count of the mention, author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]"New value: +"List of @mentions. Each item: {start: offset of the mention in the message (UTF-16 code units, not codepoints), length: mention length (UTF-16 code units), author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]"
  4. Changed7 schema fields changedv0.1.8
    • changedInput schema / properties / group_id / description
      Previous value: -"Group ID (get from list_groups)"New value: +"Group ID (from list_groups)"
    • changedInput schema / properties / mentions / description
      Previous value: -"List of @mentions: each item is {start, length, author} where start/length are character offsets into the message and author is a phone number"New value: +"List of @mentions. Each item: {start: character offset of the mention in the message, length: character count of the mention, author: E.164 phone number of the mentioned member}. Example: message='Hello @Alice', mentions=[{start:6,length:6,author:'+1234567890'}]"
    • addedInput schema / properties / mentions / items / properties / author / description
      Added value: +"E.164 phone number of the mentioned group member"
    • addedInput schema / properties / mentions / items / properties / length / description
      Added value: +"Length of the mention text in characters"
    • addedInput schema / properties / mentions / items / properties / start / description
      Added value: +"Character offset of the mention in the message text"
    • 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"
    • changedInput schema / properties / quote_timestamp / description
      Previous value: -"Timestamp of the message being quoted/replied to (from get_conversation)"New value: +"Timestamp of the quoted message (from get_conversation)"
  5. Changed3 schema fields changedv0.1.2
    • changedInput schema / properties / mentions / description
      Previous value: -"List of @mentions: each item is {start, length, author} where author is a phone number"New value: +"List of @mentions: each item is {start, length, author} where start/length are character offsets into the message and author is a phone number"
    • 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)"
  6. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses end-to-end encryption, that it contacts Signal's servers, that it is not idempotent (repeating sends a duplicate), a concrete 20-per-minute shared rate limit that makes calls wait rather than fail, local-store persistence, and the exact return shape {status, timestamp, group_id} with how timestamp feeds edit/react/delete. This is precisely the kind of destructive/write behavior context the annotations alone (idempotentHint=false, openWorldHint=true) cannot convey.

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?

Front-loads purpose and alternatives, then handles the complex optional behaviors; nearly every sentence carries information. It is, however, a single dense block for 18 parameters and would scan better as grouped bullets, and a few clauses (e.g., restating message/group_id) are slightly redundant with the schema.

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?

For a write tool with no output schema, the description supplies the return shape, side effects (persistence, duplicate-on-retry, rate limiting), and the full set of interaction paths (mentions, formatting, reply/quote, story reply, previews). Nothing needed to call it correctly appears to be 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?

With 100% schema coverage the baseline is 3, but the description adds real meaning: it explains that mention start/length are UTF-16 code units (with the concrete emoji-shifts-by-2 example) and that enabling formatting changes how offsets are interpreted and are auto-adjusted. It also clarifies that quote_* fields only shape the quote bubble and that preview_url must appear in the text, resolving non-obvious interactions the schema cannot express.

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 and resource with scope: 'Send a text message to a Signal group (end-to-end encrypted to all members)'. It immediately differentiates from siblings by naming send_message for single contacts and send_group_attachment for files, so an agent can route correctly 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?

Explicitly names alternatives and the conditions that select them (send_message for a contact, send_group_attachment for files). It also grounds required inputs (group_id from list_groups) and distinguishes the reply/quote path from the story-reply path, leaving little to inference.

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