Skip to main content
Glama

reply_message

Send a threaded Markdown reply to an existing Swarmail message; it defaults to the original sender, inherits subject and importance, and returns the stored reply.

Instructions

Reply in a message's thread, returning the stored message with reply_to. message_id selects the original in this project. Omit to to address its sender; cc and bcc are added only when supplied. The original's topic and importance are inherited, with a 'Re:' subject; importance can be overridden. ack_required defaults to false; set it explicitly to request acknowledgement of this reply. For retries within 7 days, reuse a nonempty idempotency_key with identical arguments. To start a new thread, use send_message. Send only when the recipient needs to act or know: a handoff, requested result, blocker or shared-resource change. Make clear to the human and receiver whether the message informs or requests work; for requests, name the action, repository and owner. Distinguish implementing source, installing an update and adding guidance. Write coordination messages in Markdown. Open with the action, decision or changed result. Add up to three short facts the receiver needs, then a Next action line naming the requested action or stating No action requested. Link supporting records on an Evidence line; omit that line when no record exists. Keep the requested action, authority, scope and essential holds inline. Put logs, metrics, hashes, execution details and authorization history in the linked records. When a decision depends on those details, ask the receiver to inspect the record. Preserve exact identifiers, paths and commands. Use spaces between words and numbers. Under T3 Code, refer to another agent by its thread link, title, not its registered name; use the name only if the user asks, no thread id is known or T3 fails. Elsewhere include its verified session title or repository beside its name; use this session for the current receiver only after matching session identity. For relayed authorization, preserve the source, exact selected action and target owner; a relayed bare approval such as "B" or "go" is ambiguous. Contact only still-dependent resource owners, sending release or cancellation before dropping waiting recipients. For resource coordination, name only the resource, finite phase boundary and receiver action; omit unrelated progress and errors. Use resource_notice for typed release/cancellation mail; it generates readable text and derives quiet or actionable delivery. Use one supported transport per recipient and purpose; uncertain delivery is not a reason to resend by another route. Keep routine progress in your own conversation; do not send courtesy acknowledgements or reply to thanks.

Input Schema

NameRequiredDescriptionDefault
ccNoRecipients copied, visible to everyone.
toNoRecipients; default the original sender.
bccNoRecipients the others do not see.
body_mdYesThe reply body, in Markdown.
importanceNolow, normal, high or urgent.
message_idYesThe message to reply to.
project_keyYesAbsolute path of the repository's primary checkout.
sender_nameYesYour registered agent name.
ack_requiredNoAsk recipients to call acknowledge_message.
subject_prefixNoDefault 'Re:'; not added twice.
delivery_policyNochecked (default) or durable. Both currently admit and store mail the same way. Neither bypasses closed T3 or unavailable bound sources. Unqualified standalone state remains unknown and is returned with warnings; storage does not transfer task ownership.
idempotency_keyNoNonempty key for this tool and agent. Identical arguments replay with idempotent_replay:true; different arguments fail with IDEMPOTENCY_KEY_CONFLICT. Cleanup runs at server startup and hourly, removing keys older than 7 days. Retries can replay until removal; afterward a retry may perform the operation again.
notification_policyNowake permits automatic inbox hints. quiet stores normal/low mail for inbox/search without waking the recipient; high/urgent importance or ack_required:true rejects. Omitted policy defaults to quiet only for normal/low, acknowledgement-free mail when every recipient has a valid registered T3 thread ID; otherwise wake. Ping probes keep wake by default. Replies use this same rule, not the original policy. Set wake explicitly for actionable handoffs, requested results and blockers.

Output Schema

NameRequiredDescriptionDefault
ccYes
idYes
toYes
bccYes
fromYes
topicYes
body_mdYes
subjectYes
deliveryNo
reply_toYes
revisionNo
sender_idYes
thread_idYes
created_tsYes
importanceYes
project_idYes
ack_requiredYes
sender_locationYes
idempotent_replayNo
notification_policyNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv0.3.1
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Nonempty key for this tool and agent. Identical arguments replay with idempotent_replay:true; different arguments fail with IDEMPOTENCY_KEY_CONFLICT. Hourly cleanup removes keys older than 7 days. Retries can replay until removal; afterward a retry may perform the operation again."New value: +"Nonempty key for this tool and agent. Identical arguments replay with idempotent_replay:true; different arguments fail with IDEMPOTENCY_KEY_CONFLICT. Cleanup runs at server startup and hourly, removing keys older than 7 days. Retries can replay until removal; afterward a retry may perform the operation again."
    • addedInput schema / properties / notification_policy
      Added value: +{
      +  "description": "wake permits automatic inbox hints. quiet stores normal/low mail for inbox/search without waking the recipient; high/urgent importance or ack_required:true rejects. Omitted policy defaults to quiet only for normal/low, acknowledgement-free mail when every recipient has a valid registered T3 thread ID; otherwise wake. Ping probes keep wake by default. Replies use this same rule, not the original policy. Set wake explicitly for actionable handoffs, requested results and blockers.",
      +  "enum": [
      +    "wake",
      +    "quiet"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "anyOf": [
      +    {
      +      "required": [
      +        "delivery",
      +        "revision",
      +        "notification_policy"
      +      ]
      +    },
      +    {
      +      "properties": {
      +        "idempotent_replay": {
      +          "const": true
      +        }
      +      },
      +      "required": [
      +        "idempotent_replay"
      +      ]
      +    }
      +  ],
      +  "properties": {
      +    "ack_required": {
      +      "type": "boolean"
      +    },
      +    "bcc": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "body_md": {
      +      "type": "string"
      +    },
      +    "cc": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "created_ts": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "delivery": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "admission_checked_at": {
      +          "type": "string"
      +        },
      +        "historical": {
      +          "type": "boolean"
      +        },
      +        "persisted": {
      +          "type": "boolean"
      +        },
      +        "recipients": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "availability": {
      +                "enum": [
      +                  "eligible",
      +                  "unavailable",
      +                  "unknown"
      +                ]
      +              },
      +              "historical": {
      +                "type": "boolean"
      +              },
      +              "lifecycle": {
      +                "type": "string"
      +              },
      +              "observed_at": {
      +                "type": "string"
      +              },
      +              "process": {
      +                "enum": [
      +                  "present",
      +                  "unknown"
      +                ]
      +              },
      +              "reason": {
      +                "type": "string"
      +              },
      +              "recipient": {
      +                "type": "string"
      +              },
      +              "reported_end_at": {
      +                "type": "string"
      +              },
      +              "source": {
      +                "enum": [
      +                  "t3",
      +                  "registry",
      +                  "registration"
      +                ]
      +              },
      +              "wake": {
      +                "const": "unknown"
      +              }
      +            },
      +            "required": [
      +              "recipient",
      +              "availability",
      +              "lifecycle",
      +              "process",
      +              "wake",
      +              "source",
      +              "reason",
      +              "observed_at"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "warnings": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "persisted",
      +        "admission_checked_at",
      +        "historical",
      +        "recipients",
      +        "warnings"
      +      ],
      +      "type": "object"
      +    },
      +    "from": {
      +      "type": "string"
      +    },
      +    "id": {
      +      "type": "integer"
      +    },
      +    "idempotent_replay": {
      +      "type": "boolean"
      +    },
      +    "importance": {
      +      "type": "string"
      +    },
      +    "notification_policy": {
      +      "enum": [
      +        "wake",
      +        "quiet"
      +      ]
      +    },
      +    "project_id": {
      +      "type": "integer"
      +    },
      +    "reply_to": {
      +      "type": "integer"
      +    },
      +    "revision": {
      +      "type": "integer"
      +    },
      +    "sender_id": {
      +      "type": "integer"
      +    },
      +    "sender_location": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "branch": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "repo": {
      +          "type": "string"
      +        },
      +        "title": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "worktree": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "repo",
      +        "worktree",
      +        "branch",
      +        "title"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "subject": {
      +      "type": "string"
      +    },
      +    "thread_id": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "to": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "topic": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "project_id",
      +    "sender_id",
      +    "thread_id",
      +    "topic",
      +    "subject",
      +    "body_md",
      +    "importance",
      +    "ack_required",
      +    "created_ts",
      +    "from",
      +    "sender_location",
      +    "to",
      +    "cc",
      +    "bcc",
      +    "reply_to"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changedv0.3.0
    • addedInput schema / properties / delivery_policy
      Added value: +{
      +  "description": "checked (default) or durable. Both currently admit and store mail the same way. Neither bypasses closed T3 or unavailable bound sources. Unqualified standalone state remains unknown and is returned with warnings; storage does not transfer task ownership.",
      +  "enum": [
      +    "checked",
      +    "durable"
      +  ],
      +  "type": "string"
      +}
  3. Changed1 schema field changedv0.2.5
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Any string. A retry with the same key and arguments returns the first result."New value: +"Nonempty key for this tool and agent. Identical arguments replay with idempotent_replay:true; different arguments fail with IDEMPOTENCY_KEY_CONFLICT. Hourly cleanup removes keys older than 7 days. Retries can replay until removal; afterward a retry may perform the operation again."
  4. Changed9 schema fields changedv0.2.2
    • addedInput schema / properties / ack_required / description
      Added value: +"Ask recipients to call acknowledge_message."
    • addedInput schema / properties / bcc / description
      Added value: +"Recipients the others do not see."
    • addedInput schema / properties / body_md / description
      Added value: +"The reply body, in Markdown."
    • addedInput schema / properties / cc / description
      Added value: +"Recipients copied, visible to everyone."
    • addedInput schema / properties / idempotency_key / description
      Added value: +"Any string. A retry with the same key and arguments returns the first result."
    • addedInput schema / properties / importance / description
      Added value: +"low, normal, high or urgent."
    • changedInput schema / properties / message_id / description
      Previous value: -"Message id."New value: +"The message to reply to."
    • addedInput schema / properties / subject_prefix / description
      Added value: +"Default 'Re:'; not added twice."
    • addedInput schema / properties / to / description
      Added value: +"Recipients; default the original sender."
  5. First observedv0.2.1

TDQS

A4.4/5.0
Behavior4/5

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

With annotations present (readOnly false, idempotent false, destructive false), the description adds real behavioral context: subject/topic/importance inheritance with a 'Re:' prefix, importance override, ack_required defaulting to false, and 7-day idempotency_key replay semantics. Some of this (idempotency, notification_policy, delivery_policy detail) duplicates the schema rather than extending it, which keeps it short of a 5.

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

Conciseness2/5

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

The core purpose is correctly front-loaded in the first two sentences, but the remaining ~400 words are largely prescriptive prose style rules (Markdown formatting, action-first openings, Evidence/Next action lines, T3 thread-link conventions, agent naming) that are tangential to invoking a reply tool. The volume buries the operational parameters and makes the definition hard to scan.

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 13-parameter mutation tool with an output schema, the definition covers selection, defaults, inheritance behavior, idempotency/retry, delivery and notification policy, and conflict error naming (IDEMPOTENCY_KEY_CONFLICT). Nothing an agent needs to call it correctly is missing; return-value detail is rightly delegated to the output schema.

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 description coverage is 100%, so the baseline is 3 and the schema already documents each parameter. The description nonetheless adds defaults not obvious from the schema itself: 'to' omitted addresses the sender, cc/bcc added only when supplied, importance inherited unless overridden, and ack_required defaulting to false.

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?

The opening sentence gives a specific verb and resource ('Reply in a message's thread') plus the return behavior ('returning the stored message with reply_to') and the key selector ('message_id selects the original in this project'). It also explicitly distinguishes itself from send_message ('To start a new thread, use send_message'), so an agent can pick between the two siblings without opening either 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?

The description states when to use this tool versus alternatives in multiple places: send_message for new threads, resource_notice for typed release/cancellation mail, and explicit exclusions ('do not send courtesy acknowledgements or reply to thanks'). It also supplies the trigger conditions ('Send only when the recipient needs to act or know: a handoff, requested result, blocker or shared-resource change'), 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.