Skip to main content
Glama

send_read_receipt

Idempotent

Send a read receipt to a Signal contact so their app shows your messages as Read and mark them read locally; use after reading a DM, not for groups.

Instructions

Send a read receipt to a contact so their Signal app shows your messages as 'Read', and mark those messages read in the local store. Use after reading a DM with get_conversation (which marks read locally but sends no receipt). Not for groups. sender: E.164 number of the contact who sent the messages. timestamps: list of their messages' ms timestamps (the message id in get_conversation), batched in one call. Only shown if the sender has read receipts enabled. Contacts Signal's servers; repeating is harmless. Returns {status: 'read receipt sent'}.

Input Schema

NameRequiredDescriptionDefault
senderYesPhone number (E.164) of the contact whose messages you are acknowledging
timestampsYesMillisecond timestamps of the messages to acknowledge (the message id in get_conversation)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.43.0
    • changedInput schema / properties / timestamps / description
      Previous value: -"Timestamps of the messages to mark as read (from get_conversation sent_at/received_at fields)"New value: +"Millisecond timestamps of the messages to acknowledge (the message id in get_conversation)"
  2. Changed2 schema fields changedv0.1.8
    • changedInput schema / properties / sender / description
      Previous value: -"Phone number of the message sender"New value: +"Phone number (E.164) of the contact whose messages you are acknowledging"
    • changedInput schema / properties / timestamps / description
      Previous value: -"List of message timestamps to mark read"New value: +"Timestamps of the messages to mark as read (from get_conversation sent_at/received_at fields)"
  3. First observedv0.1.0

TDQS

A4.6/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=true, destructive=false, and the description's 'Contacts Signal's servers; repeating is harmless' partly restates those. However it adds genuinely new behavior: it marks messages read in the local store, it is 'Only shown if the sender has read receipts enabled', and it returns {status: 'read receipt sent'}. These side-effect and conditional details go beyond the structured fields.

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 purpose, then usage, params, caveats, and return value in a logical order. Slightly long, and the server/idempotency sentence partially overlaps the annotations, but every sentence carries usable information.

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?

No output schema exists, yet the description supplies the return shape, the side effects, the recipient-side visibility condition, and full usage routing. An agent has everything needed to invoke it correctly.

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 baseline is 3. The description adds real meaning beyond the schema: it clarifies that timestamps are the contact's message timestamps and should be 'batched in one call', and maps them to 'the message id in get_conversation', which the schema does not explain.

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 ('Send a read receipt to a contact') and immediately scopes it ('Not for groups'), distinguishing it from the many send_* siblings. It also names the related tool get_conversation, so the agent can place it precisely.

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?

Gives explicit when-to-use ('Use after reading a DM with get_conversation') including the reasoning (get_conversation marks read locally but sends no receipt), an explicit when-not ('Not for groups'), and the alternative context. Nothing is left to inference.

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