{"access":"mailbox.full","operations":[{"name":"mail.triage_report","description":"Read the current mailbox triage report, with actual scanned/reviewed/unreviewed totals, classification category and priority counts, and concise evidence-backed summaries. Partial reviews are never presented as exhaustive.","inputSchema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false},"mutates":false},{"name":"mail.triage_classify","description":"Classify up to three real email conversations by reading recent message bodies and using the selected AI provider. Returns evidence-backed reply/decision/follow-up categories with one- to two-sentence summaries; uncertain or incomplete threads are explicitly flagged. No email is sent.","inputSchema":{"type":"object","properties":{"threadIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":3}},"required":["threadIds"],"additionalProperties":false},"mutates":false},{"name":"mail.triage","description":"Scan Inbox and Sent across all dates, group messages into candidate conversations and report verified coverage. Use for whole-inbox unanswered-mail requests instead of mail.search. Results are preliminary; inspect threads to confirm whether a human reply is necessary. Request additional offsets until all candidates are reviewed. Never claim complete coverage when complete=false.","inputSchema":{"type":"object","properties":{"offset":{"type":"integer","minimum":0,"description":"Candidate offset, starting at zero."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum candidate conversations to return (default 30)."}},"additionalProperties":false},"mutates":false},{"name":"mail.triage_review","description":"Review up to five candidate inbox threads together, including recent actual message bodies. Decide which require a reply versus no reply, follow-up, waiting, or other action. This returns evidence, not a definitive AI classification; do not infer that a question is unanswered solely because the latest message is inbound.","inputSchema":{"type":"object","properties":{"threadIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":5,"description":"Exact thread IDs from mail.triage; never guessed IDs."}},"required":["threadIds"],"additionalProperties":false},"mutates":false},{"name":"mail.triage_scan_step","description":"Advance a durable whole-inbox scan using short, time-bounded batches of up to 32 pages. Reinvoke while status is scanning. Progress survives server restarts. Call mail.triage for candidate results once finished. Does not classify reply needs.","inputSchema":{"type":"object","properties":{"refresh":{"type":"boolean","description":"Reset the scan and begin again (only if explicitly requested)."}},"additionalProperties":false},"mutates":false},{"name":"mail.list_folders","description":"List existing folders in the selected mailbox, including their IDs and names. Use before creating a folder or moving a message.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"mail.create_folder","description":"Create a custom mail folder requested by the user. Check mail.list_folders first. Starred is a virtual view, not a creatable folder.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"parentId":{"type":"string"}},"required":["name"],"additionalProperties":false},"mutates":true},{"name":"mail.star","description":"Star or unstar a known message in the selected mailbox. Find the message with mail.search first when necessary.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string"},"starred":{"type":"boolean"}},"required":["messageId","starred"],"additionalProperties":false},"mutates":true},{"name":"mail.move","description":"Move a known message to an existing mailbox or folder, including Archive or Trash. Do not use for permanent deletion. Destination must already exist.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string"},"mailbox":{"type":"string"}},"required":["messageId","mailbox"],"additionalProperties":false},"mutates":true},{"name":"mail.activity","description":"Read mailbox activity across Inbox, Sent, Drafts, Outbox, and Trash for an exact time window. Use this for requests like 'what happened in email yesterday', daily email summaries, or activity recaps instead of relying on a keyword search in one folder.","inputSchema":{"type":"object","properties":{"startIso":{"type":"string","description":"Inclusive ISO-8601 start of the requested period, including timezone offset when known."},"endIso":{"type":"string","description":"Exclusive ISO-8601 end of the requested period, including timezone offset when known."},"mailboxes":{"type":"array","items":{"type":"string"},"description":"Optional mailbox names/roles. Defaults to Inbox, Sent, Drafts, Outbox, and Trash."}},"required":["startIso","endIso"],"additionalProperties":false},"mutates":false},{"name":"mail.list_recent","description":"List the newest messages in a mailbox without a keyword query. Use this for 'show my latest emails', 'most recent Inbox messages', unread Inbox previews, and chronological mailbox browsing. Use mail.search only for sender, subject, or keyword matching. Results are newest first; pass nextCursor to continue.","inputSchema":{"type":"object","properties":{"mailbox":{"type":"string","description":"Mailbox name or role; defaults to Inbox."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Maximum number of messages to return; defaults to 10."},"cursor":{"type":"string","description":"Opaque continuation cursor returned as nextCursor by the previous page."},"unreadOnly":{"type":"boolean","description":"Only return unread messages; defaults to false."}},"additionalProperties":false},"mutates":false},{"name":"mail.search","description":"Search the user's currently selected mailbox for messages matching a natural-language query. Use this before reading a message when the message ID is not already known.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search text such as sender name, email address, subject words, or message terms."},"mailbox":{"type":"string","description":"Optional mailbox/folder name such as Inbox, Sent, Archive, or Trash."}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"mail.read","description":"Read one email from the user's currently selected mailbox after its message ID is known.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string","description":"The message ID returned by mail.search."}},"required":["messageId"],"additionalProperties":false},"mutates":false},{"name":"mail.read_thread","description":"Read the full conversation thread for a known thread ID from the user's currently selected mailbox.","inputSchema":{"type":"object","properties":{"threadId":{"type":"string","description":"The thread ID returned by mail.search or mail.read."}},"required":["threadId"],"additionalProperties":false},"mutates":false},{"name":"mail.create_draft","description":"Create a real draft in the user's selected GSW mailbox. Use this when the user explicitly asks to draft or prepare an email in their mailbox. This does not send the email.","inputSchema":{"type":"object","properties":{"to":{"type":"array","items":{"type":"string"},"minItems":1},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"subject":{"type":"string"},"textBody":{"type":"string"},"htmlBody":{"type":"string"},"replyTo":{"type":"string"},"inReplyTo":{"type":"string"},"references":{"type":"string"}},"required":["to"],"additionalProperties":false},"mutates":true},{"name":"mail.update_draft","description":"Update an existing draft in the user's selected GSW mailbox. This does not send the email.","inputSchema":{"type":"object","properties":{"draftId":{"type":"string"},"to":{"type":"array","items":{"type":"string"},"minItems":1},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"subject":{"type":"string"},"textBody":{"type":"string"},"htmlBody":{"type":"string"},"replyTo":{"type":"string"},"inReplyTo":{"type":"string"},"references":{"type":"string"}},"required":["draftId","to"],"additionalProperties":false},"mutates":true},{"name":"mail.trash_draft","description":"Move one existing draft to Trash (recoverable). Only use for a user-requested deletion after finding the draft in Drafts. Requires explicit confirmation before execution.","inputSchema":{"type":"object","properties":{"draftId":{"type":"string","description":"Actual draft message ID from mail.search or mail.read, never a guessed ID."}},"required":["draftId"],"additionalProperties":false},"mutates":true},{"name":"mail.send_draft","description":"Send an existing GSW Mail draft. Use only when the user explicitly asks to send a draft or email. This is an external action and requires confirmation before execution.","inputSchema":{"type":"object","properties":{"draftId":{"type":"string"}},"required":["draftId"],"additionalProperties":false},"mutates":true},{"name":"mail.reply","description":"Prepare a reply draft from an existing message with server-derived recipients and RFC threading headers. Does not send.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string","description":"Original message ID in this authorized mailbox"},"textBody":{"type":"string","description":"User-approved reply text or introduction for the forwarded message"},"to":{"type":"array","items":{"type":"string"},"description":"Required only for forward: explicit destination addresses"}},"required":["messageId","textBody"],"additionalProperties":false},"mutates":true},{"name":"mail.reply_all","description":"Prepare a reply-all draft from an existing message with server-derived recipients and RFC threading headers. Does not send.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string","description":"Original message ID in this authorized mailbox"},"textBody":{"type":"string","description":"User-approved reply text or introduction for the forwarded message"},"to":{"type":"array","items":{"type":"string"},"description":"Required only for forward: explicit destination addresses"}},"required":["messageId","textBody"],"additionalProperties":false},"mutates":true},{"name":"mail.forward","description":"Prepare a forward draft of an existing message to explicitly supplied recipients. Includes the original text, but does not automatically carry over attachments and never sends.","inputSchema":{"type":"object","properties":{"messageId":{"type":"string","description":"Original message ID in this authorized mailbox"},"textBody":{"type":"string","description":"User-approved reply text or introduction for the forwarded message"},"to":{"type":"array","items":{"type":"string"},"description":"Required only for forward: explicit destination addresses"}},"required":["messageId","textBody","to"],"additionalProperties":false},"mutates":true},{"name":"automations.create","description":"Create a durable scheduled GSW Chat task that runs even when the browser is closed. Use it for recurring or one-time briefings such as daily inbox debriefs. Schedules support once, hourly, daily, weekdays, weekends, weekly, and monthly recurrence in an IANA timezone. Background execution supports explicitly authorized research and safe draft preparation. Scheduled email sending and campaign launch are not enabled.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Short human-readable task name."},"instruction":{"type":"string","description":"Open-ended instruction to execute on every run."},"timeZone":{"type":"string","description":"IANA timezone such as America/Detroit. Use the runtime timezone context unless the user specifies another."},"schedule":{"type":"object","properties":{"frequency":{"type":"string","enum":["once","hourly","daily","weekdays","weekends","weekly","monthly"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"daysOfWeek":{"type":"array","items":{"type":"integer","minimum":0,"maximum":6},"description":"0 Sunday through 6 Saturday."},"dayOfMonth":{"type":"integer","minimum":1,"maximum":31},"interval":{"type":"integer","minimum":1,"maximum":365},"startDate":{"type":"string","description":"Optional local YYYY-MM-DD."},"endDate":{"type":"string","description":"Optional local YYYY-MM-DD."}},"required":["frequency","hour","minute"],"additionalProperties":false},"emailSummaryToOwner":{"type":"boolean","description":"Explicitly opt in to emailing each completed scheduled report only to the attached mailbox owner. Never emails other recipients."},"allowedScopes":{"type":"array","items":{"type":"string","enum":["mail.read","mail.write","calendar.read","contacts.read","templates.read","signatures.read","files.read","files.write","campaign.read","campaign.write","research.use","browser.read","tasks.read","settings.read","workspace.read","domain.read","alias.read"]},"description":"Scopes authorized for unattended research and non-sending draft preparation."}},"required":["title","instruction","timeZone","schedule"],"additionalProperties":false},"mutates":true},{"name":"automations.list","description":"List the user's saved scheduled GSW Chat tasks, including their status, next run time, timezone, and schedule.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"automations.update","description":"Change, pause, resume, archive, rename, or reschedule an existing scheduled GSW Chat task. The user must clearly identify the intended task and change.","inputSchema":{"type":"object","properties":{"automationId":{"type":"string"},"title":{"type":"string"},"instruction":{"type":"string"},"status":{"type":"string","enum":["active","paused","archived"]},"timeZone":{"type":"string"},"schedule":{"type":"object","properties":{"frequency":{"type":"string","enum":["once","hourly","daily","weekdays","weekends","weekly","monthly"]},"hour":{"type":"integer","minimum":0,"maximum":23},"minute":{"type":"integer","minimum":0,"maximum":59},"daysOfWeek":{"type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"dayOfMonth":{"type":"integer","minimum":1,"maximum":31},"interval":{"type":"integer","minimum":1,"maximum":365},"startDate":{"type":"string"},"endDate":{"type":"string"}},"required":["frequency","hour","minute"],"additionalProperties":false}},"required":["automationId"],"additionalProperties":false},"mutates":true},{"name":"automations.delete","description":"Permanently delete a scheduled GSW Chat task. Use only when the user explicitly asks to delete the task.","inputSchema":{"type":"object","properties":{"automationId":{"type":"string"}},"required":["automationId"],"additionalProperties":false},"mutates":true},{"name":"automations.approve_sending","description":"Request explicit user confirmation to authorize an existing scheduled task to send only to the exact approved email addresses. This requires an interactive confirmation; never assume approval from the task instruction. No daily volume limit is imposed.","inputSchema":{"type":"object","properties":{"automationId":{"type":"string","description":"Existing automation UUID"},"allowedRecipients":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100,"description":"Exact email addresses allowed for unattended sends, including CC/BCC."}},"required":["automationId","allowedRecipients"],"additionalProperties":false},"mutates":true},{"name":"automations.revoke_sending","description":"Immediately revoke unattended email sending for an existing scheduled task.","inputSchema":{"type":"object","properties":{"automationId":{"type":"string"}},"required":["automationId"],"additionalProperties":false},"mutates":true},{"name":"tasks.create","description":"Create a durable multi-step GSW work task when the user's request is substantial, may span multiple agent actions, may continue after the chat closes, or benefits from visible progress. Do not create tasks for simple one-step requests.","inputSchema":{"type":"object","properties":{"title":{"type":"string"},"instruction":{"type":"string"},"worker":{"type":"string","enum":["coordinator","mail","research","calendar","files","campaign","browser"]},"selectedSkills":{"type":"array","items":{"type":"string"},"maxItems":12},"steps":{"type":"array","maxItems":50,"items":{"type":"object","properties":{"title":{"type":"string"},"worker":{"type":"string","enum":["coordinator","mail","research","calendar","files","campaign","browser"]}},"required":["title"],"additionalProperties":false}}},"required":["title","instruction"],"additionalProperties":false},"mutates":true},{"name":"tasks.list","description":"List the user's recent durable GSW agent tasks and their current status.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","minimum":1,"maximum":100}},"additionalProperties":false},"mutates":false},{"name":"tasks.read","description":"Read one durable GSW agent task including its step plan and progress.","inputSchema":{"type":"object","properties":{"taskId":{"type":"string"}},"required":["taskId"],"additionalProperties":false},"mutates":false},{"name":"tasks.update","description":"Update progress or state for a durable GSW agent task or one of its steps. Use waiting when the task needs user input or approval.","inputSchema":{"type":"object","properties":{"taskId":{"type":"string"},"status":{"type":"string","enum":["planned","running","waiting","completed","failed","cancelled"]},"currentStep":{"type":"number","minimum":0},"progressPercent":{"type":"number","minimum":0,"maximum":100},"stepSequence":{"type":"number","minimum":0},"stepStatus":{"type":"string","enum":["pending","running","waiting","completed","failed","skipped"]}},"required":["taskId"],"additionalProperties":false},"mutates":true},{"name":"workers.delegate","description":"Delegate a bounded investigation to a specialized read-only GSW worker. Use this for substantial subtasks that benefit from focused mailbox, research, file, campaign, calendar, or admin investigation. The worker cannot perform external actions or writes.","inputSchema":{"type":"object","properties":{"worker":{"type":"string","enum":["mail","research","calendar","files","campaign","browser"]},"instruction":{"type":"string","description":"A self-contained subtask with the exact question to investigate."}},"required":["worker","instruction"],"additionalProperties":false},"mutates":false},{"name":"workers.parallel","description":"Run up to four independent read-only specialized investigations in parallel, then return all findings to the coordinator. Use this for substantial work that can be safely split into independent research, mail, file, campaign, calendar, or admin subtasks.","inputSchema":{"type":"object","properties":{"tasks":{"type":"array","minItems":2,"maxItems":4,"items":{"type":"object","properties":{"worker":{"type":"string","enum":["mail","research","calendar","files","campaign","browser"]},"instruction":{"type":"string"}},"required":["worker","instruction"],"additionalProperties":false}}},"required":["tasks"],"additionalProperties":false},"mutates":false},{"name":"workers.review","description":"Ask the bounded GSW Reviewer to quality-check prepared work before it is sent, launched, scheduled, or presented for approval. The reviewer cannot take actions.","inputSchema":{"type":"object","properties":{"workType":{"type":"string","description":"Short label such as email draft, campaign, meeting, research summary, or document."},"content":{"type":"string","description":"The prepared work to review."},"context":{"type":"string","description":"Optional relevant facts or constraints the reviewer should check against."}},"required":["workType","content"],"additionalProperties":false},"mutates":false},{"name":"integrations.list","description":"List the GSW integrations and provider capabilities currently configured for this deployment. Use this when deciding whether a requested workflow can use an external system or specialized service.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"browser.search","description":"Search the public web using the isolated browser worker and return research-oriented results without modifying external systems.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"sessionId":{"type":"string"}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"browser.open","description":"Open a public webpage inside the isolated browser worker. Use only HTTP or HTTPS URLs.","inputSchema":{"type":"object","properties":{"url":{"type":"string"},"sessionId":{"type":"string"}},"required":["url"],"additionalProperties":false},"mutates":false},{"name":"browser.read","description":"Read the current webpage or a specific element from an isolated browser session.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"selector":{"type":"string"}},"required":["sessionId"],"additionalProperties":false},"mutates":false},{"name":"browser.screenshot","description":"Capture the current page in an isolated browser session for visual inspection.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"}},"required":["sessionId"],"additionalProperties":false},"mutates":false},{"name":"browser.click","description":"Click a non-destructive control in an isolated browser session. This tool must not be used to submit purchases, irreversible forms, account deletions, or other consequential actions.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"selector":{"type":"string"},"text":{"type":"string"}},"required":["sessionId"],"additionalProperties":false},"mutates":true},{"name":"browser.type","description":"Type text into a field in an isolated browser session without submitting the form.","inputSchema":{"type":"object","properties":{"sessionId":{"type":"string"},"selector":{"type":"string"},"text":{"type":"string"}},"required":["sessionId","selector","text"],"additionalProperties":false},"mutates":true},{"name":"search.workspace","description":"Search across the user's indexed GSW mailbox and saved GSW Chat history in one query. Use this for broad recall questions, fuzzy topic discovery, or when the user remembers an idea but not an exact sender/subject. Results are retrieval candidates; use mail.read or mail.read_thread before making claims that require full email contents.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Natural search terms or a concise semantic topic phrase."},"limit":{"type":"integer","minimum":1,"maximum":25}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"contacts.tags","description":"List contact tags available to the user with counts. Use this before campaign creation when the requested audience label is uncertain.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"contacts.search","description":"Search the authenticated user's existing contacts by name, organization, or contact details. Returns a bounded preview; do not invent contacts.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"number","minimum":1,"maximum":50}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"contacts.audience.preview","description":"Preview the user's contacts matching ALL supplied tags, including a count and bounded contact sample. Read-only; use before creating or launching a campaign.","inputSchema":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":20},"limit":{"type":"number","minimum":1,"maximum":50}},"required":["tags"],"additionalProperties":false},"mutates":false},{"name":"contacts.tags.assign","description":"Create a tag by assigning it to explicitly selected, owned contact IDs. Existing matching assignments are skipped. This never sends email.","inputSchema":{"type":"object","properties":{"tag":{"type":"string"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50}},"required":["tag","contactIds"],"additionalProperties":false},"mutates":true},{"name":"contacts.create","description":"Create a contact from explicitly provided details; do not invent an address or assume intent to contact them.","inputSchema":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"displayName":{"type":"string"},"organization":{"type":"string"},"jobTitle":{"type":"string"},"notes":{"type":"string"},"emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"label":{"type":"string"},"isPrimary":{"type":"boolean"}},"required":["email"],"additionalProperties":false}},"tags":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"mutates":true},{"name":"contacts.update","description":"Update a selected owned contact with supplied fields. The supplied arrays of tags and emails replace existing values; read the contact first to preserve data.","inputSchema":{"type":"object","properties":{"contactId":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"displayName":{"type":"string"},"organization":{"type":"string"},"jobTitle":{"type":"string"},"notes":{"type":"string"},"emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"label":{"type":"string"},"isPrimary":{"type":"boolean"}},"required":["email"],"additionalProperties":false}},"tags":{"type":"array","items":{"type":"string"}}},"required":["contactId"],"additionalProperties":false},"mutates":true},{"name":"calendar.list","description":"List calendars accessible to the authenticated user in the selected mailbox. Read-only; use before creating an event.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"calendar.events.list","description":"Find scheduled events in an explicit date range for the selected mailbox, including titles, times, locations and attendees. Read-only. Do not invent unavailable meetings.","inputSchema":{"type":"object","properties":{"after":{"type":"string","description":"ISO 8601 range start (inclusive)"},"before":{"type":"string","description":"ISO 8601 range end (exclusive)"},"limit":{"type":"integer","minimum":1,"maximum":100}},"required":["after","before"],"additionalProperties":false},"mutates":false},{"name":"calendar.availability","description":"Read-only estimated free windows and overlapping events on the selected user's calendars. All-day or events lacking end time may not be represented as busy; do not claim confirmed availability of external attendees.","inputSchema":{"type":"object","properties":{"after":{"type":"string","description":"UTC or offset ISO8601 start"},"before":{"type":"string","description":"UTC or offset ISO8601 end"},"durationMinutes":{"type":"integer","minimum":5,"maximum":480},"excludeEventId":{"type":"string"}},"required":["after","before"],"additionalProperties":false},"mutates":false},{"name":"calendar.rsvp.status","description":"Check RSVP responses for a calendar event belonging to the selected authorized mailbox, without exposing RSVP tokens.","inputSchema":{"type":"object","properties":{"eventId":{"type":"string"}},"required":["eventId"],"additionalProperties":false},"mutates":false},{"name":"calendar.events.preview_change","description":"Preview an event reschedule and attendee additions/removals without writing or notifying anyone. This is NOT an external attendee free/busy check; user approval is still required to update.","inputSchema":{"type":"object","properties":{"eventId":{"type":"string"},"currentStart":{"type":"string","description":"Original start ISO8601 with offset, from calendar.events.list"},"proposedStart":{"type":"string","description":"New start ISO8601 with offset"},"durationMinutes":{"type":"integer","minimum":1,"maximum":10080},"attendees":{"type":"array","items":{"type":"string","format":"email"},"maxItems":50},"sendSchedulingMessages":{"type":"boolean"}},"required":["eventId","currentStart","proposedStart","durationMinutes","attendees","sendSchedulingMessages"],"additionalProperties":false},"mutates":false},{"name":"calendar.events.create","description":"Create a calendar event, with optional attendee invitations. Requires user confirmation before execution. Review title, start, timezone, attendees and invitation sending first.","inputSchema":{"type":"object","properties":{"calendarId":{"type":"string","description":"Calendar ID from calendar.list"},"title":{"type":"string"},"description":{"type":"string"},"start":{"type":"string","description":"ISO 8601 time with timezone offset"},"durationMinutes":{"type":"integer","minimum":1,"maximum":10080},"location":{"type":"string"},"meetingLink":{"type":"string"},"attendees":{"type":"array","items":{"type":"string"},"maxItems":50},"sendSchedulingMessages":{"type":"boolean","description":"Whether to notify attendees; explicit approval is required"},"timeZone":{"type":"string"},"allDay":{"type":"boolean"},"emailReminderMinutes":{"type":"array","items":{"type":"integer","minimum":1,"maximum":10080},"maxItems":8,"description":"Owner-only email reminders, minutes before the event. Defaults to 1440 and 30; empty array disables reminders."}},"required":["calendarId","title","start","durationMinutes"],"additionalProperties":false},"mutates":true},{"name":"calendar.events.update","description":"Replace an existing calendar event with specified complete fields. Read the event first, then confirm all attendee and scheduling changes. Requires user confirmation.","inputSchema":{"type":"object","properties":{"calendarId":{"type":"string","description":"Calendar ID from calendar.list"},"title":{"type":"string"},"description":{"type":"string"},"start":{"type":"string","description":"ISO 8601 time with timezone offset"},"durationMinutes":{"type":"integer","minimum":1,"maximum":10080},"location":{"type":"string"},"meetingLink":{"type":"string"},"attendees":{"type":"array","items":{"type":"string"},"maxItems":50},"sendSchedulingMessages":{"type":"boolean","description":"Whether to notify attendees; explicit approval is required"},"timeZone":{"type":"string"},"allDay":{"type":"boolean"},"emailReminderMinutes":{"type":"array","items":{"type":"integer","minimum":1,"maximum":10080},"maxItems":8,"description":"Owner-only email reminders, minutes before the event. Defaults to 1440 and 30; empty array disables reminders."},"eventId":{"type":"string","description":"Existing engine event ID"}},"required":["eventId","calendarId","title","start","durationMinutes"],"additionalProperties":false},"mutates":true},{"name":"calendar.events.invite","description":"Invite additional email addresses to an EXISTING calendar event. First resolve names using contacts.search and locate the event using calendar.events.list. Requires explicit approval before sending invitations; never recreate the event.","inputSchema":{"type":"object","properties":{"eventId":{"type":"string","description":"Exact event ID from calendar.events.list"},"currentStart":{"type":"string","description":"Current event start ISO8601 with offset, from calendar.events.list"},"attendeeEmails":{"type":"array","items":{"type":"string","format":"email"},"minItems":1,"maxItems":50}},"required":["eventId","currentStart","attendeeEmails"],"additionalProperties":false},"mutates":true},{"name":"calendar.events.delete","description":"Delete an existing event. Requires explicit user approval and must not run for ambiguous events.","inputSchema":{"type":"object","properties":{"eventId":{"type":"string","description":"Existing engine event ID"}},"required":["eventId"],"additionalProperties":false},"mutates":true},{"name":"campaign.audience.edit","description":"Replace the draft campaign audience with a reviewed list of owned contact IDs. This does not send mail. Use campaign.preview before launch.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"},"contactIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":100}},"required":["campaignId","contactIds"],"additionalProperties":false},"mutates":true},{"name":"campaign.draft.edit","description":"Edit subject and text content of a draft campaign; never launches it. Review campaign.preview before sending.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"},"subject":{"type":"string"},"textBody":{"type":"string"},"htmlBody":{"type":"string"}},"required":["campaignId"],"additionalProperties":false},"mutates":true},{"name":"campaign.attachments.set","description":"Select up to five existing owned GSW Files assets for a draft campaign. An empty list removes attachments. Changes require draft status; review the campaign preview before launch.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"},"assetIds":{"type":"array","items":{"type":"string"},"maxItems":5}},"required":["campaignId","assetIds"],"additionalProperties":false},"mutates":true},{"name":"campaign.preview","description":"Read the exact saved recipient snapshot and personalized subject/text for a draft campaign prior to approval. Read-only. Does not imply delivery.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"}},"required":["campaignId"],"additionalProperties":false},"mutates":false},{"name":"campaign.report","description":"Summarize persisted recipient queue results for an owned campaign, highlight failed recipients and provide suggested follow-up next steps. Queued does NOT mean delivered, opened or read.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"}},"required":["campaignId"],"additionalProperties":false},"mutates":false},{"name":"campaign.create","description":"Create a real draft campaign for contacts matching ALL supplied contact tags. Use contact tags as the audience segmentation primitive. Creating a campaign does not send it. The body supports {{firstName}} and {{email}} personalization tokens.","inputSchema":{"type":"object","properties":{"title":{"type":"string"},"subject":{"type":"string"},"textBody":{"type":"string"},"htmlBody":{"type":"string"},"audienceTags":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["title","subject","audienceTags"],"additionalProperties":false},"mutates":true},{"name":"campaign.list","description":"List recent GSW Mail campaigns and their audience tags, recipient count, and launch status.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"campaign.read","description":"Read one prepared campaign, including its audience and recipient delivery state.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"}},"required":["campaignId"],"additionalProperties":false},"mutates":false},{"name":"campaign.launch","description":"Launch the EXACT campaign snapshot last seen in campaign.preview. Requires reviewHash from preview and explicit user confirmation. If audience, content, or attachments changed, preview again.","inputSchema":{"type":"object","properties":{"campaignId":{"type":"string"},"reviewHash":{"type":"string","description":"SHA-256 review hash returned from campaign.preview"}},"required":["campaignId","reviewHash"],"additionalProperties":false},"mutates":true},{"name":"templates.list","description":"List available built-in and user-created email templates and identify the currently selected default template.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"mutates":false},{"name":"templates.get","description":"Read one custom email template's name, brand colors, and logo asset reference by template ID or custom key. Does not expose other users' templates.","inputSchema":{"type":"object","properties":{"templateId":{"type":"string","description":"UUID or custom:<uuid> key"}},"required":["templateId"],"additionalProperties":false},"mutates":false},{"name":"templates.create","description":"Create a native branded email template with editable subject, preheader, body text, colors and an optional owned logo.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"subject":{"type":"string","maxLength":300},"preheader":{"type":"string","maxLength":500},"bodyText":{"type":"string","maxLength":50000},"borderColor":{"type":"string"},"fontColor":{"type":"string"},"buttonColor":{"type":"string"},"backgroundColor":{"type":"string"},"logoAssetId":{"type":"string","description":"Optional already-uploaded owned image asset UUID"}},"required":["name","borderColor","fontColor","buttonColor","backgroundColor"],"additionalProperties":false},"mutates":true},{"name":"templates.duplicate","description":"Duplicate a custom GSW Mail template's branding into a new independent template. Copies colors and owned logo asset reference, not arbitrary HTML.","inputSchema":{"type":"object","properties":{"templateId":{"type":"string"},"name":{"type":"string"},"subject":{"type":"string","maxLength":300},"preheader":{"type":"string","maxLength":500},"bodyText":{"type":"string","maxLength":50000},"logoAssetId":{"type":"string","description":"Owned existing logo asset UUID; null to clear"}},"required":["templateId","name"],"additionalProperties":false},"mutates":true},{"name":"templates.update","description":"Edit a native email template subject, preheader, body text, brand colors or owned logo.","inputSchema":{"type":"object","properties":{"templateId":{"type":"string"},"name":{"type":"string"},"borderColor":{"type":"string"},"fontColor":{"type":"string"},"buttonColor":{"type":"string"},"backgroundColor":{"type":"string"}},"required":["templateId"],"additionalProperties":false},"mutates":true},{"name":"templates.select","description":"Set one available email template as the user's default for compose, AI drafts, and campaign sends.","inputSchema":{"type":"object","properties":{"templateKey":{"type":"string"}},"required":["templateKey"],"additionalProperties":false},"mutates":true},{"name":"files.list","description":"List the user's recent files stored in GSW Files. Use this when the user refers to a file they uploaded or saved but does not provide its asset ID.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","minimum":1,"maximum":100}},"additionalProperties":false},"mutates":false},{"name":"files.search","description":"Search the user's GSW Files by filename or display name. Use this to locate an uploaded document, spreadsheet, image, presentation, video, or other asset.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Filename words or file name fragment."},"limit":{"type":"number","minimum":1,"maximum":50}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"files.read","description":"Read a GSW file. Text/code/calendar/email-text files return a bounded text preview; other files use the configured file-intelligence strategy when available. GSW stores and can attach arbitrary file types even when deep analysis is best-effort.","inputSchema":{"type":"object","properties":{"assetId":{"type":"string","description":"Asset ID returned by files.list/files.search or supplied with a chat attachment."}},"required":["assetId"],"additionalProperties":false},"mutates":false},{"name":"files.analyze","description":"Deeply analyze a stored GSW file using the appropriate strategy for its type: direct text, document/PDF analysis, spreadsheet or archive sandbox inspection, image vision, audio transcription, combined video analysis, or best-effort binary inspection.","inputSchema":{"type":"object","properties":{"assetId":{"type":"string","description":"Asset ID returned by files.list/files.search or supplied with a chat attachment."},"instruction":{"type":"string","description":"What to extract, understand, summarize, compare, or answer from the file."}},"required":["assetId"],"additionalProperties":false},"mutates":false},{"name":"files.create_text","description":"Create a new text-based file in the user's My Files library. Supports TXT, Markdown, CSV, JSON, and HTML. Use CSV for simple spreadsheet-style outputs. This does not create native DOCX/XLSX/PPTX yet.","inputSchema":{"type":"object","properties":{"filename":{"type":"string"},"parentId":{"type":["string","null"],"description":"Destination folder UUID; omit for root."},"content":{"type":"string"},"format":{"type":"string","enum":["txt","md","csv","json","html"]}},"required":["filename","content"],"additionalProperties":false},"mutates":true},{"name":"files.create_artifact","description":"Create a finished downloadable artifact in the user's My Files library. Create a genuine finished file. For PDF, produce a complete standalone HTML document with head/style and body in the content field, with the actual report contents (not the design brief). Use a cohesive art-directed layout: a compact branded hero (class gsw-report-hero), three metric cards in gsw-metrics, and balanced columns (gsw-two-col) where appropriate. For a service overview or report, flow the overview and feature content directly after the hero and metrics on the first page; do not insert a cover-only page, min-height:100vh, height:100vh, or page-break-after:always unless the user explicitly requests a standalone cover. Choose a document layout class on the body: gsw-layout-report (default for reports), gsw-layout-brochure (intentional cover), gsw-layout-proposal, or gsw-layout-presentation. Reports should flow naturally and must not use a cover-only page unless explicitly requested. Keep individual feature cards intact but do not force entire sections to the next page. Use consistent heading, bullet, and card typography. Do not claim unverified infrastructure, security compliance, encryption or features as established facts. When GSW:TC branding is requested, put class gsw-tc on the body or page wrapper, use forest green #41865b, warm cream #f4e8cd, charcoal #484640, and border #e8e1d4. Use class gsw-feature-grid with gsw-feature-card elements for capability grids and gsw-page-section to keep short sections together. Prefer text symbols to emoji icons in PDFs. Include the actual logo only when its asset data is available; never invent or approximate the brand logo. High contrast is required; never put light text on a light background. Prefer CSS grid for cards and real list/section markup. The PDF renderer runs locally in Chromium independently of the selected chat provider and does not require OpenAI credits. Keep styling directions in instruction. No external scripts, stylesheets or network assets.","inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Exact output filename including a supported extension such as report.pdf, plan.docx, budget.xlsx, or deck.pptx."},"instruction":{"type":"string","description":"Detailed layout, styling, calculations, tables, charts, or structure instructions."},"content":{"type":"string","description":"Complete final body copy for the artifact. For designed PDFs supply a full HTML document with embedded style. Use the available gsw-report-hero, gsw-metrics, gsw-metric, gsw-metric-value, gsw-metric-label, gsw-two-col, and gsw-report-footer classes; do not simply describe a layout. Markdown produces only a basic PDF. Do not pass the design brief as document content."}},"required":["filename","instruction"],"additionalProperties":false},"mutates":true},{"name":"files.transform","description":"Open one or more existing GSW Files in a sandboxed computational workspace, modify/analyze their real contents, and save a new output file. Use this for revising existing PDFs, restyling documents to match brand templates, or transforming DOCX/XLSX/PPTX and other sources. When a user mentions a saved PDF and a branding template, search for BOTH files first, then pass both source asset IDs so the designer has the actual original content and brand reference. Never merely print the styling instructions as the resulting document.","inputSchema":{"type":"object","properties":{"sourceAssetIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":5,"description":"Asset IDs of the source files to transform."},"filename":{"type":"string","description":"Exact filename for the new output, including extension."},"instruction":{"type":"string","description":"Detailed transformation instructions."}},"required":["sourceAssetIds","filename","instruction"],"additionalProperties":false},"mutates":true},{"name":"files.generate_image","description":"Generate a new image from a text prompt and save it into the user's private My Files library. Use this for illustrations, graphics, concepts, banners, thumbnails, and other generated images.","inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Optional filename. The correct extension is added if missing."},"prompt":{"type":"string","description":"Detailed image-generation prompt."},"model":{"type":"string","enum":["auto","qwen-image-2512","openai-image"],"description":"Image-generation model; auto prefers Modal Qwen Image."},"size":{"type":"string","enum":["1024x1024","1536x1024","1024x1536","auto"]},"quality":{"type":"string","enum":["low","medium","high","auto"]},"background":{"type":"string","enum":["transparent","opaque","auto"]},"format":{"type":"string","enum":["png","jpeg","webp"]}},"required":["prompt"],"additionalProperties":false},"mutates":true},{"name":"files.edit_image","description":"Edit the ORIGINAL uploaded image using its assetId and the user's instruction. Use for background removal, recoloring, adding text, and modifications to an existing attached image. NEVER substitute text-to-image generation. The source image must already be attached or stored in GSW Files. Returns a new saved image and sourceAssetId.","inputSchema":{"type":"object","properties":{"assetId":{"type":"string","description":"UUID of the original uploaded image, from message attachments or GSW Files."},"instruction":{"type":"string","description":"Specific changes to make to the original image."}},"required":["assetId","instruction"],"additionalProperties":false},"mutates":true},{"name":"mail.attach_file","description":"Attach one or more existing GSW Files assets to an existing email draft. Use files.search or files.list first when the user refers to a saved file by name. If there is no draft yet, create it with mail.create_draft, then attach the file(s). This changes the draft but never sends it.","inputSchema":{"type":"object","properties":{"draftId":{"type":"string","description":"Existing draft ID returned by mail.create_draft or mail.update_draft."},"assetId":{"type":"string","description":"Single GSW Files asset ID returned by files.list/files.search or a chat attachment."},"assetIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":20,"description":"Multiple GSW Files asset IDs to attach in one action."},"contentDisposition":{"type":"string","enum":["attachment","inline"]},"contentId":{"type":"string"}},"required":["draftId"],"additionalProperties":false},"mutates":true},{"name":"files.list_folder","description":"List files and subfolders in a GSW Files folder; omit parentId for root.","inputSchema":{"type":"object","properties":{"parentId":{"type":["string","null"],"description":"Folder UUID, or null for root."}},"required":[],"additionalProperties":false},"mutates":false},{"name":"files.search_nodes","description":"Search GSW Files folder names and filenames across all folders, returning node IDs and parent folder IDs.","inputSchema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"number","minimum":1,"maximum":100}},"required":["query"],"additionalProperties":false},"mutates":false},{"name":"files.create_folder","description":"Create a real GSW Files folder or subfolder, returning its ID. Use parentId to nest it.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"File or folder name."},"parentId":{"type":["string","null"],"description":"Folder UUID, or null for root."}},"required":["name"],"additionalProperties":false},"mutates":true},{"name":"files.rename_node","description":"Rename a file or folder in GSW Files.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"File or folder node UUID from files.list_folder or files.search_nodes."},"name":{"type":"string","description":"File or folder name."}},"required":["nodeId","name"],"additionalProperties":false},"mutates":true},{"name":"files.move_node","description":"Move a file or whole folder into another GSW Files folder; cannot move folders into their descendants.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"File or folder node UUID from files.list_folder or files.search_nodes."},"parentId":{"type":["string","null"],"description":"Destination parent folder UUID, or null for root."}},"required":["nodeId","parentId"],"additionalProperties":false},"mutates":true},{"name":"files.trash_node","description":"Move a file or folder to trash. This is destructive and requires user approval.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"File or folder node UUID from files.list_folder or files.search_nodes."}},"required":["nodeId"],"additionalProperties":false},"mutates":true},{"name":"files.restore_node","description":"Restore a previously trashed file or folder.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"File or folder node UUID from files.list_folder or files.search_nodes."}},"required":["nodeId"],"additionalProperties":false},"mutates":true},{"name":"files.delete_node","description":"Permanently delete a GSW Files node. Requires user approval. Folders must be empty.","inputSchema":{"type":"object","properties":{"nodeId":{"type":"string","description":"File or folder node UUID from files.list_folder or files.search_nodes."}},"required":["nodeId"],"additionalProperties":false},"mutates":true},{"name":"files.organize_preview","description":"Preview existing GSW Files grouped into UTC day folders and file-type subfolders. Does not modify anything. Show preview and request user approval before files.organize_apply.","inputSchema":{"type":"object","properties":{"dateBasis":{"type":"string","enum":["created","uploaded"],"description":"created = GSW file entry creation date; uploaded = original asset upload date. Dates are grouped by UTC."},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of files moved in this one approved batch; default 50."}},"required":[],"additionalProperties":false},"mutates":false},{"name":"files.organize_apply","description":"After explicit user approval, safely move a bounded batch of existing files into UTC YYYY-MM-DD/type folders. Preserves files and contents; reruns are idempotent. Call preview again after a batch to continue.","inputSchema":{"type":"object","properties":{"dateBasis":{"type":"string","enum":["created","uploaded"],"description":"created = GSW file entry creation date; uploaded = original asset upload date. Dates are grouped by UTC."},"limit":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of files moved in this one approved batch; default 50."},"planHash":{"type":"string","description":"Exact SHA256 planHash returned by files.organize_preview; rejects stale plans."}},"required":["planHash"],"additionalProperties":false},"mutates":true},{"name":"files.organize_start","description":"After the user has approved a files.organize_preview result, enqueue the entire approved plan as a durable background organization job. This is the only tool needed to organize all files; do not call files.organize_apply repeatedly.","inputSchema":{"type":"object","properties":{"planHash":{"type":"string"},"dateBasis":{"type":"string","enum":["created","uploaded"]}},"required":["planHash"],"additionalProperties":false},"mutates":true},{"name":"files.organize_status","description":"Check progress, counts and failures of a durable file organization job.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string"}},"required":["jobId"],"additionalProperties":false},"mutates":false},{"name":"files.organize_control","description":"Pause or resume a durable file organization job. Pausing is cooperative and may finish one in-flight file first.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string"},"command":{"type":"string","enum":["pause","resume"]}},"required":["jobId","command"],"additionalProperties":false},"mutates":true},{"name":"videos.generate","description":"Generate a new video from a text prompt through Modal (LTX, Wan or Hunyuan). Runs asynchronously in GSW Tasks and saves an MP4 in GSW Files. IMPORTANT: Source-image-to-video animation is not supported by this tool yet: it cannot accept an image asset ID or preserve the exact characters in an existing image. For requests to animate an existing image, explain that limitation; do not silently substitute an unrelated text-to-video result. Use tasks.get to check progress.","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"Detailed text-to-video prompt (4,000 characters maximum)."},"model":{"type":"string","enum":["ltx-2.5","wan-2.2","hunyuan-video-1.5"]}},"required":["prompt"],"additionalProperties":false},"mutates":true},{"name":"proposal.submit","description":"Report an observed GSW bug, new connection opportunity, improvement, security issue, or open question to the owner for review. The proposal is saved; it does not execute changes or guarantee email delivery.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["bug","connection","improvement","security","question"]},"priority":{"type":"string","enum":["low","normal","high","critical"]},"title":{"type":"string","maxLength":180},"summary":{"type":"string","maxLength":10000},"evidence":{"type":"string","maxLength":16000},"suggestedAction":{"type":"string","maxLength":10000},"relatedTool":{"type":"string","maxLength":180}},"required":["kind","priority","title","summary"],"additionalProperties":false},"mutates":true},{"name":"proposal.list","description":"List current GSW AI proposals for your selected account.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false},"mutates":false},{"name":"proposal.get","description":"Read a GSW AI proposal and its discussion history.","inputSchema":{"type":"object","properties":{"proposalId":{"type":"string","format":"uuid"}},"required":["proposalId"],"additionalProperties":false},"mutates":false},{"name":"proposal.comment","description":"Add a comment, follow-up evidence, or implementation suggestion to a GSW proposal. Does not approve execution.","inputSchema":{"type":"object","properties":{"proposalId":{"type":"string","format":"uuid"},"body":{"type":"string","minLength":1,"maxLength":10000}},"required":["proposalId","body"],"additionalProperties":false},"mutates":true},{"name":"capabilities.search","description":"Discover available GSW agent tools for a user request. ALWAYS use this when you need calendar events, appointments, or reminders and no calendar tool is currently exposed; search for calendar. Also use for campaign, files, contacts, research, or email capabilities.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Capability or action to find."},"limit":{"type":"number","minimum":1,"maximum":20}},"required":["query"],"additionalProperties":false},"mutates":false}]}