Skip to main content
Glama

RelayLink

Draft a package

draft_package

Creates a RelayLink draft of a package: a briefing or message for another person, which may reach their own AI assistant. Returns a preview for the user. Nothing is sent until confirm_send, the step that runs once the user approves in their own message. The recipient's assistant sees only what the package contains, so it is written for fidelity rather than compression. human_note_draft is a proposed note in the sender's voice, which the user approves or rewrites in their own words. message is everything the sender means to say, in their voice, as long as it needs to be, with their position and its reservations, hedges and tone: "leaning toward X but worried about Y" stays that, rather than becoming "X". It is approved with the package; cancel_draft and a new draft change its wording. A plain message, such as a one-line answer, needs only the note and a response shape. A first message to somebody who is not yet a contact also needs an ask and a brief. stated_by_human=true marks an assumption the user stated, which keeps it apart from one that was inferred. The private conversation itself is not included, and neither is anything the user marked as private or offhand.

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": {
      "humanNoteDraft": "<humanNoteDraft>",
      "responseShape": "<responseShape>",
      "urgency": "<urgency>"
    },
    "name": "draft_package"
  }
}

Input Schema

NameRequiredDescriptionDefault
tagsNoThe user's own tags to apply to the thread when this is confirmed — private, never sent, never seen by the recipient. list_tags shows names already in use.
tldrNoThe quick read — what this is about and the main point, at most 400 characters. Optional: leave it out and the opening of the message (or of the note, when there is no message) stands in.
topicNoShort thread topic, a few words. Required for a new thread.
askTextNoThe one thing the sender wants from the recipient, in a sentence or two. Required unless response_shape is fyi; leave it out then and the package reads "No reply needed".
messageNoEverything the sender means to say to the recipient, in their own voice — as long as it needs to be. Carry their position and its reservations, hedges and tone; do not tidy a maybe into a yes. Approved with the package; leave it out for a one-line message, where the note is the whole of it. How long it may be is set by the sender's plan, and a message past it is refused with the number rather than trimmed — never shorten it yourself.
projectNoA notebook project to file this conversation under, by name — the same projects notebook_save and notebook_find use. Made if it does not exist. Filed when the send is confirmed, so list_threads and search_messages can narrow to it afterwards.
toEmailNoRecipient's email address. Use when the user gives an address, or when toContact reported the name as ambiguous. A new thread needs this, toContact, or toGroup; omit all three when replying (the thread determines it). The user's OWN address is valid: that is how a briefing is handed to another assistant connected to the same RelayLink account (e.g. drafted here, picked up in ChatGPT tonight). It needs no contact pair and sends no email; it waits in the account's inbox for whichever assistant asks next.
toGroupNoAn owned group to start a NEW conversation with, by name — the same names list_groups and create_group use. Cannot be combined with toContact, toEmail, threadId or inReplyToPackageId: a group starts its own conversation. A Separate group sends each member their own private copy and none of them learns of the others; a Shared group is one thread they can all reply to. Only on the user's own explicit request, naming the group.
urgencyYesUrgency hint: none | when_convenient | this_week | today.
excerptsNoAt most 6 exact quotes from the session, each with why it is included — for words the recipient needs verbatim. Never a transcript.
threadIdNoExisting thread_id when replying within a thread.
decisionsNoDecisions reached, with confidence and reversibility.
toContactNoThe recipient as the user names them: the nickname they set with rename_contact, or the name in list_contacts — a first name is enough when only one contact has it. Resolves only to accepted contacts, and reports a tie rather than guessing. A new thread needs this or toEmail; omit both when replying.
referencesNoWhere supporting material already lives — up to 8 https links with a short title and why the recipient would open it. Pointers, never files: the recipient's own access to the document applies, and RelayLink shows the address as text.
assumptionsNoKey assumptions, each tagged whether the user explicitly stated it.
contextBriefNoBackground a reader with no history needs to answer well, and the message does not already carry: situation → thinking so far → where it stands, at most 6000 characters. Keep the reasoning and the qualifications; cut only what the recipient does not need. Optional: omit it for a plain message.
openQuestionsNoOpen questions the sender is still weighing.
responseShapeYesShape of the wanted response: opinion | decision | review | info | fyi. fyi means no reply is expected, and ask_text may be left out.
humanNoteDraftYesThe sender's own words to the recipient — a few sentences, at most 2000 characters; the substance goes in message. A proposal — the user must approve or rewrite it before sending.
optionsConsideredNoOptions weighed, with status: chosen | leaning | open | rejected.
inReplyToPackageIdNopackage_id being replied to, when replying.
attachmentVersionIdsNoThe sender's own Ready documents to attach, by version_id (from attachment_create_text, attachment_list, or attachment_upload_link) — at most 5, 5,242,880 bytes together. Only on the user's own explicit request, naming which document(s). The preview below lists every one with its size and hash, so approving the draft approves attaching them too.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.4/5.0
Behavior5/5

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

The annotations only say this is a non-read-only, non-destructive, non-idempotent write; the description adds far more: the tool returns a preview and persists nothing outward until the user approves, message length is bounded by the sender's plan and over-length input is refused with the number rather than silently trimmed, and a self-addressed package sends no email but waits in the account's inbox. It also states privacy boundaries (the private conversation, and anything marked private or offhand, is excluded) and that the recipient sees only what the package contains. This is exactly the context annotations cannot carry, and it does not contradict them.

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

Conciseness3/5

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

The core purpose and the not-sent-until-confirm_send constraint are front-loaded, which is right. But it is one dense ~230-word paragraph with no breaks, and its final third drifts into field-level guidance (human_note_draft, message, stated_by_human) that duplicates schema properties already documented at 100% coverage. It is informative rather than padded, but a tighter structure would let an agent parse it faster.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 22-parameter drafting tool with no output schema, the description covers the full lifecycle (draft, preview, approve, confirm_send, cancel), recipient-selection modes for new versus reply threads, and the privacy boundary. It sketches the return value only as "a preview for the user" plus a passing reference to the preview listing attachments with size and hash, which is thin but adequate given no output schema is declared. Nothing an agent needs to decide whether and how to call it 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 schema baseline is a 3, but the description adds cross-parameter rules the schema cannot express: a plain message needs only the note and a response shape, a first contact additionally needs ask and brief, and stated_by_human keeps a user-stated assumption distinct from an inferred one. Its explanation of human_note_draft versus message (note in the sender's voice, substance in message, fidelity over compression) meaningfully disambiguates the two fields. Some of this restates schema text, which keeps it from a 5.

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 ("Creates a RelayLink draft of a package") and immediately qualifies what a package is ("a briefing or message for another person, which may reach their own AI assistant"). It is clearly distinguished from confirm_send ("Nothing is sent until confirm_send") and cancel_draft, so an agent can separate the drafting step from the sending step without reading any schema.

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 concrete conditions: a plain one-line answer needs only the note and a response shape, while a first message to a non-contact also needs an ask and a brief; revisions go through cancel_draft plus a new draft. It names the follow-on tool confirm_send explicitly. What it lacks is any explicit exclusion against adjacent siblings such as project_draft, save_handoff, or notebook_handoffs, so the agent must infer that boundary.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources