Skip to main content
Glama

ofw_save_draft

Save a message as a draft in OurFamilyWizard, with conflict detection that refuses to overwrite drafts changed on the server.

Instructions

Save a message as a draft in OurFamilyWizard. RECIPIENTS: OurFamilyWizard does NOT persist recipients on drafts — recipientIds are accepted but the saved draft comes back with none (documented OFW behavior, noted once in the response, not warned about; supply recipientIds at send time instead). IDENTITY: the response leads with draftKey, the stable identity that survives editing — key off it, because the id changes on EVERY edit (replacing a draft creates a NEW draft and deletes the old one; OFW's update-in-place endpoint silently no-ops, so we never use it). Pass messageId to replace an existing draft; the response.id will be the NEW id, and a transparency NOTE documents the swap and which fields were carried over. THREADING: if replyToId is provided, the cache may rewrite it to the latest reply in the thread (note included). The threading verdict is read from OFW's full echo (replyToId/inReplyTo/showContext) — a warning appears ONLY when the reply linkage was genuinely dropped or re-targeted, and the response's top-level replyToId/inReplyTo always agree with its listData. Attach files via myFileIDs (from ofw_upload_attachment). After saving, the tool re-fetches the draft from OFW, and the returned revision reflects that authoritative state (so it will match on your next edit). SAFETY: because replacing DESTROYS the old draft rather than merging, passing messageId first re-reads that draft from OFW and REFUSES the write if its subject/body/recipients changed since you read it (drafts edited in the OFW web app do not bump any timestamp, so the local cache can be silently behind). A pure replyToId normalization by OFW is NOT treated as a conflict. The refusal returns the current server body under serverBody — merge your edit into it and retry with expectedRevision.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYesMessage body text
forceNoDefault false. Overwrite even when the draft changed on OurFamilyWizard since you read it. The discarded server version is echoed back in the response. Only use after showing the user the conflict.
subjectYesMessage subject
messageIdNoID of an existing draft to replace (the new draft will have a new id; the old is deleted)
myFileIDsNoAttachment file ids (from ofw_upload_attachment)
replyToIdNoID of the message this draft replies to
recipientIdsNoArray of recipient user IDs (optional for drafts)
expectedRevisionNoWith messageId: the `revision` you got from ofw_list_drafts/ofw_get_message for that draft. Asserts you are replacing THAT version. If the draft changed on OFW since, the write is refused and the current server body is returned. Omit and the tool compares the server against the local cache instead — omitting never means "overwrite anyway".

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv2.19.4

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only indicate readOnlyHint=false and destructiveHint=false, but the description goes far beyond: it warns that replacing a draft DESTROYS the old one, explains that the id changes on every edit while draftKey is stable, describes the conflict-check refusal, and details the re-fetch behavior returning authoritative revision. It also covers threading normalization and the fact that recipientIds are not persisted. All of this is behavioral context not derivable from annotations.

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

Conciseness5/5

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

The description is long but every sentence earns its place. It is structured into labeled sections (RECIPIENTS, IDENTITY, THREADING, SAFETY) that are easy to scan. The core purpose is front-loaded, and each paragraph covers a distinct behavior with concrete examples. There is no filler or redundancy.

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 tool with 8 parameters, destructive side effects, identity quirks, and conflict safety, this description is exhaustive. It covers the return values (revision, serverBody, draftKey, response.id), edge cases (thread re-targeting, silent cache lag), and the exact workflow for safe replacement. No output schema exists, so the description must carry that burden, and it does completely.

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 each parameter is already described. However, the description adds substantial semantic depth: it explains that recipientIds are accepted but not persisted, that messageId triggers a delete-and-replace rather than an in-place update, that expectedRevision asserts a specific version and the fallback to local cache, and that force overrides the conflict check with the server body echoed. This goes well beyond the schema's basic type/description.

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 description opens with a precise verb+resource statement: 'Save a message as a draft in OurFamilyWizard.' It immediately clarifies the core action and contrasts with siblings like ofw_send_message and ofw_delete_draft. The subsequent paragraphs detail the identity and safety nuances, leaving no ambiguity about what this tool does versus others.

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 explicitly states when to use this tool and when not to: 'supply recipientIds at send time instead' for recipients, 'Pass messageId to replace an existing draft' with an explanation of how to replace, and it even notes that OFW's update-in-place endpoint is never used. It provides clear guidance on expectedRevision and force parameters, including the condition 'Only use after showing the user the conflict.'

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