Skip to main content
Glama
signal-tools

signal-tools

by craft-agent

Send a message

signal_message_send

Send a text message to a Signal chat, group, or Note to Self using a chat ID, with optional quoting of a message. Use it to deliver exact text via a linked account.

Instructions

Sends one text to a chat: a person, a group or Note to Self (the user's own account id as the chat). chat is a chat id from signal_chat_read or signal_contact_read check, never a name or a number. text is sent exactly as given, surrounding blank space trimmed, at most 4000 characters. reply_to quotes a message of that chat by its id; one that was deleted or has disappeared cannot be quoted. A group the user left is refused. The chat's disappearing timer applies by itself. The result means Signal accepted it, not that it was delivered or read; for a group it says how many members it reached and lists those it did not. A failure uncertain means the message may have gone out: check the chat on the phone, never send it again blindly. A send is recorded in the local mirror; errors.record says when that failed although the message was sent.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "chat": "<chat>",
      "text": "<text>"
    },
    "name": "signal_message_send"
  }
}

Input Schema

NameRequiredDescriptionDefault
chatYesThe chat id, from signal_chat_read or signal_contact_read check: a person's account id, or `group:<id>`. The user's own account id is Note to Self.
textYesThe text exactly as it should arrive; surrounding blank space is trimmed, and what is left is 1 to 4000 characters.
accountNoThe account label; absent picks the only linked label.
reply_toNoThe id of a message of that chat to quote, `<account id>:<sent time in ms>` as a read gives it.

Output Schema

NameRequiredDescriptionDefault
idYesThe sent message's id, `<account id>:<sent time in ms>`.
chatYes
timeYesWhen it was sent, in local time with offset.
errorsNoSet when the message was sent but could not be written to the mirror.
reachedNoA group (or a send with a failure entry): how many recipients Signal accepted it for.
not_reachedNoThe recipients it did not reach, by account id, with the reason in plain words.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.3.0

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the annotations (openWorldHint, non-idempotent, non-destructive) by disclosing delivery semantics (accepted, not delivered), per-group reach counts with unreached members, automatic disappearing-timer behavior, the `uncertain` failure meaning with a do-not-resend instruction, and local-mirror recording failures under `errors.record`.

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-loaded with the core action, then constraints, then result semantics; nearly every clause carries operational value. Slightly bloated by restating schema details (blank-space trimming, 4000 characters) and by the long final clause about the local mirror.

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 non-idempotent, open-world send with an output schema, it covers everything an agent needs to call it correctly and interpret the result, including uncertainty handling and partial group delivery. Nothing material is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: `reply_to` must reference a message of that same chat and cannot quote a deleted or disappeared one, and `chat` cannot be a name or number. It does repeat the schema's trimming and 4000-character limit, which adds nothing new.

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?

Opens with a specific verb and resource: sends one text to a chat, and enumerates the three chat kinds (person, group, Note to Self). It also distinguishes itself from the read siblings by stating that `chat` must come from signal_chat_read or signal_contact_read.

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

Usage Guidelines4/5

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

Gives a concrete prerequisite (chat id from signal_chat_read or signal_contact_read check, never a name or number) plus refusal conditions: a group the user left, and a deleted or vanished message for `reply_to`. It lacks explicit guidance on how to recover from failures or which tool to use instead when a send is refused.

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