Conversation Send¶
Send a message in an existing conversation (fire-and-forget, no response expected).
MCP name: conversation_send
Category: conversations
Mutates state (retry policy: manual)
Parameters¶
| Name | Type | Required | Description |
|---|---|---|---|
consumer |
string |
No | Optional persisted conversation consumer identity. Supply together with generation to fence a background driver's write to its live lease. |
consumption_receipt_id |
string |
No | Exact receipt returned by cowork_action_snapshot_get; required while replying to a targeted turn |
conversation_id |
string |
Yes | Conversation ID |
generation |
string |
No | Optional live lease generation. Supply together with consumer; a stale or revoked generation returns lease_lost without sending. |
message |
string |
Yes | Message content |
message_id |
string |
No | Optional caller-stable idempotency key; the first accepted agent message wins on replay |
Details¶
When message_id is supplied, it is scoped to this conversation and the agent
role. The first successful send fixes the stored content; a retry with the same
ID returns that existing message without overwriting it. Reusing the ID for a
different conversation or role is rejected.
consumer and generation form an optional lease fence for long-lived
conversation drivers. They must be supplied together. The send and lease check
share one transaction, so a stopped, rotated, or closed generation cannot emit
a late message.
When the consumer's oldest unacknowledged turn carries an action snapshot,
conversation_send requires the exact generation/message-bound
consumption_receipt_id minted by cowork_action_snapshot_get. The reply is
durably linked to that receipt and carries transcript-visible consumed-target
provenance. Supplying an action snapshot identifier without fetching it cannot
authorize a reply.
If a generation restarts after the deterministic reply committed but before
the user turn was acknowledged, the successor must fetch the exact delivered
turn again and replay the same stable message_id with its new receipt. The
existing reply is reused only when the complete action/discussion context and
exact user message are identical. Both generation-bound receipts are linked to
the one durable reply; a different target or turn is rejected.