> ## Documentation Index
> Fetch the complete documentation index at: https://openworklabs.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> For agents: install the OpenWork desktop app with `brew install --cask openwork` (macOS) or from https://openworklabs.com/download. Do not run `npx openwork`; the npm package named `openwork` is a different project.
> Connect an agent to OpenWork with the MCP Gateway: `claude mcp add --transport http openwork https://api.openworklabs.com/mcp/agent`. Teams sign up at https://app.openworklabs.com?mode=sign-up.
> Step-by-step agent guide: https://openworklabs.com/docs/start-here/use-openwork-from-an-ai-agent.md
> Connect Slack (any organization admin): https://openworklabs.com/docs/slack/connect-slack.md. OpenWork in Slack (@openwork bot) is private alpha for approved organizations. Setup guide: https://openworklabs.com/docs/slack/overview.md. Agent skill: https://openworklabs.com/.well-known/agent-skills/set-up-openwork-slack/SKILL.md.

# Create a Gmail draft or threaded reply with optional workspace attachments

> Creates a plain-text Gmail draft in the calling member own mailbox. Optional attachments are workspace paths, up to 10 files totaling at most 4 MiB, fulfilled outside model context by a supporting OpenWork host on direct execute_capability calls. Code Mode and other MCP hosts cannot fulfill attachments and create no draft. Set threadId for replies and forwards. Always share the returned draftUrl.



## OpenAPI

````yaml https://api.openworklabs.com/openapi.json?public=1 post /v1/capabilities/google-workspace/gmail-drafts
openapi: 3.1.0
info:
  title: Den API
  description: >-
    OpenAPI spec for the Den control plane API.


    Authentication:

    - API keys (they start with `den_`) go in the `x-api-key` header as the raw
    value. Do not send them as `Authorization: Bearer`; that header only accepts
    Den session tokens, so an API key there returns 401.
      Example: `curl https://api.openworklabs.com/v1/me -H "x-api-key: den_..."`.
      API keys resolve to the issuing user and the organization member they were scoped to when created, so they can call ordinary user and organization routes without a separate signed-in session.
    - Use `Authorization: Bearer <session-token>` for user-authenticated routes
    that require a Den session.

    - Session-only flows still require a signed-in user session, including
    organization creation, invitation acceptance, active-organization switching,
    and MCP token minting.

    - Public routes like health and documentation do not require authentication.


    Swagger tip: use the security schemes in the Authorize dialog to set
    `denApiKey` (your API key) or `bearerAuth` (a session token) before trying
    protected endpoints.
  version: commit 7bee9d4
  contact:
    name: OpenWork
    url: https://openworklabs.com
    email: team@openworklabs.com
  license:
    name: OpenWork Enterprise Edition License
    url: https://github.com/different-ai/openwork/blob/dev/ee/LICENSE
servers:
  - url: https://api.openworklabs.com
security:
  - denApiKey: []
  - bearerAuth: []
tags:
  - name: System
    description: >-
      Service health, readiness, API documentation, and desktop version
      metadata.
  - name: Authentication
    description: >-
      Sign-in discovery, administrator bootstrap, OAuth provider connections,
      and MCP token minting.
  - name: OAuth
    description: >-
      OAuth 2.0 / OpenID Connect authorization-server and protected-resource
      metadata and dynamic client registration (RFC 8414, RFC 9728, RFC 7591),
      used by MCP clients.
  - name: SCIM
    description: >-
      SCIM 2.0 provisioning endpoints for identity providers (RFC 7644) and the
      organization SCIM connector management routes.
  - name: SSO
    description: Organization single sign-on connector management routes.
  - name: Bootstrap
    description: Agent-first provisional workspace setup routes.
  - name: Users
    description: Current user and membership routes.
  - name: Organizations
    description: Organization creation, context, brand assets, and install links.
  - name: Invitations
    description: Invitation preview, acceptance, creation, and cancellation routes.
  - name: Sandbox organizations
    description: Preview and join a sandbox organization with its shareable join link.
  - name: Members
    description: Organization member management routes.
  - name: Teams
    description: Organization team management routes.
  - name: Permissions
    description: >-
      Organization permissions: the permission catalog, Member, Admin and team
      permission sets, their history, and each member's effective permissions.
  - name: API Keys
    description: Organization API key management routes.
  - name: Desktop Policies
    description: Desktop app policies applied to the organization, members, or teams.
  - name: Agent Permissions
    description: What agents may do on members' computers, set for everyone and per team.
  - name: LLM Providers
    description: Organization LLM provider catalog, configuration, and access routes.
  - name: Inference
    description: Organization inference settings.
  - name: Inference Providers
    description: >-
      Organization inference Gateway providers, model groups, credential sets,
      access grants, member connections, and usage.
  - name: Gateway Usage Limits
    description: >-
      Estimated-cost policies, independent member calendar buckets, assignments,
      and audited usage-extension requests.
  - name: Cloud
    description: Organization Cloud instance lifecycle and browser gateway resolution.
  - name: Workers
    description: >-
      List and delete the organization's workers, including OpenWork Web
      instances.
  - name: Worker Activity
    description: Worker heartbeat and activity reporting routes.
  - name: Managed deployments
    description: >-
      OpenWork installations in an organization's own cloud account: launch
      approval, installer milestones and health reports.
  - name: Automations
    description: Scheduled Automations, their runs, and desktop runner presence.
  - name: Documents
    description: >-
      Connected Drive documents, inline editing and file-bound temporary Office
      sessions.
  - name: Workbot
    description: The signed-in member's single Workbot conversation.
  - name: Workflows
    description: Saved Workflows (Code Mode scripts), their versions, snapshots, and views.
  - name: Workflow Runs
    description: Durable Workflow run history.
  - name: Codemode Runs
    description: Generated Artifact views produced by Code Mode runs.
  - name: Apps
    description: >-
      Saved reusable apps built from Workflows and Artifact views, and their
      sharing.
  - name: Config Objects
    description: >-
      Versioned configuration objects (skills, workflows, and other plugin
      content).
  - name: Plugins
    description: Plugin packages, access grants, and imports.
  - name: Marketplaces
    description: Marketplaces that distribute plugins to members and teams.
  - name: Resources
    description: >-
      Aggregated snapshot of the resources and marketplace capabilities
      available to the caller.
  - name: Capability Sources
    description: >-
      Native provider capabilities (Google Workspace, Microsoft 365) and
      external MCP connections executed as the calling member.
  - name: Direct uploads
    description: Multipart uploads that stream workspace files straight to a provider.
  - name: Connectors
    description: >-
      Connector accounts and instances (GitHub and other sources) and their sync
      state.
  - name: GitHub
    description: >-
      GitHub App installation, repository discovery, and plugin import from
      GitHub.
  - name: Diagnostics
    description: Controlled egress diagnostics for self-hosted deployments.
  - name: Telemetry
    description: Telemetry event ingestion and adoption analytics.
  - name: Webhooks
    description: Signed inbound webhooks from third-party providers.
  - name: Admin
    description: Platform administration routes for allowlisted OpenWork administrators.
  - name: Deprecated
    description: Removed features that answer with 410 or an empty result for old clients.
paths:
  /v1/capabilities/google-workspace/gmail-drafts:
    post:
      tags:
        - Capability Sources
      summary: >-
        Create a Gmail draft or threaded reply with optional workspace
        attachments
      description: >-
        Creates a plain-text Gmail draft in the calling member own mailbox.
        Optional attachments are workspace paths, up to 10 files totaling at
        most 4 MiB, fulfilled outside model context by a supporting OpenWork
        host on direct execute_capability calls. Code Mode and other MCP hosts
        cannot fulfill attachments and create no draft. Set threadId for replies
        and forwards. Always share the returned draftUrl.
      operationId: postV1CapabilitiesGoogleWorkspaceGmailDrafts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                to:
                  type: string
                  minLength: 3
                  maxLength: 320
                  description: Recipient email address.
                cc:
                  description: Optional comma-separated Cc email addresses.
                  type: string
                  minLength: 3
                  maxLength: 1000
                bcc:
                  description: Optional comma-separated Bcc email addresses.
                  type: string
                  minLength: 3
                  maxLength: 1000
                subject:
                  type: string
                  minLength: 1
                  maxLength: 500
                  description: >-
                    Draft subject line. For replies or forwards, include
                    threadId; subjects starting with Re: or Fwd: are rejected
                    without threadId so the draft stays on the existing
                    conversation.
                body:
                  type: string
                  minLength: 1
                  maxLength: 50000
                  description: >-
                    Draft body: plain prose or a safe Markdown subset (headings,
                    **bold**, *italic* or _italic_, `code`, [text](url), bare
                    URLs, lists (-, *, 1.) with simple indented nesting, > block
                    quotes, pipe tables, and fenced code). Links must use http,
                    https, or mailto. Raw HTML is displayed as text, never
                    executed. Separate paragraphs with blank lines; single line
                    breaks, indentation, and repeated spaces are preserved. Do
                    not hard-wrap prose. Put the closing (e.g. Thanks,) and
                    sender name on separate lines with a real newline, never
                    joined on one line. For threaded drafts, the server appends
                    the quoted conversation automatically; do not include quoted
                    history.
                timeZone:
                  description: >-
                    User's IANA time zone (for example America/New_York). Pass
                    the user's zone to format reply attribution like Gmail Web,
                    including daylight saving time. When omitted, attribution
                    keeps the original message Date header's offset, not the
                    server's time zone.
                  type: string
                  minLength: 1
                  maxLength: 100
                threadId:
                  description: >-
                    Gmail thread id to reply on. Required for replies and
                    forwards; get it from the gmail-messages capability. When
                    set, the draft is attached to that thread as a reply — keep
                    the thread's subject (e.g. 'Re: …').
                  type: string
                  minLength: 1
                  maxLength: 512
                attachments:
                  description: >-
                    Optional workspace file paths, 1 to 10 files totaling at
                    most 4 MiB. File bytes stay outside model context. Requires
                    a direct execute_capability call from a supporting OpenWork
                    host; Code Mode and other MCP hosts are unsupported and
                    create no draft. Do not retry without attachments.
                  minItems: 1
                  maxItems: 10
                  type: array
                  items:
                    type: string
                    minLength: 1
              required:
                - to
                - subject
                - body
              additionalProperties: false
      responses:
        '200':
          description: Draft created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoogleWorkspaceDraftResponse'
        '400':
          description: The draft request was invalid.
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/InvalidRequestError'
                  - $ref: '#/components/schemas/GoogleWorkspaceMissingThreadIdError'
        '401':
          description: The caller must be signed in.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
        '409':
          description: >-
            The calling member has not connected their Google account or is
            missing permission.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoogleWorkspaceNeedsConnectionError'
        '422':
          description: >-
            Workspace attachments require a supporting OpenWork host; no draft
            was created.
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    const: false
                  error:
                    type: string
                    const: file_input_requires_host
                  created:
                    type: boolean
                    const: false
                  message:
                    type: string
                    const: >-
                      Workspace attachments require a supporting OpenWork host.
                      No draft was created. In the OpenWork desktop app, use the
                      openwork_gmail_draft tool instead; otherwise do not retry
                      without attachments.
                required:
                  - ok
                  - error
                  - created
                  - message
                additionalProperties: false
        '502':
          description: Google rejected the request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoogleWorkspaceUpstreamError'
      security:
        - denApiKey: []
        - bearerAuth: []
components:
  schemas:
    GoogleWorkspaceDraftResponse:
      type: object
      properties:
        ok:
          type: boolean
          const: true
        draftId:
          type: string
        messageId:
          type:
            - string
            - 'null'
        draftUrl:
          description: >-
            Gmail URL for the ready-to-send draft. Always share draftUrl with
            the user so they can open the draft in Gmail for review and send.
          type:
            - string
            - 'null'
        threadUrl:
          description: >-
            Gmail URL for the conversation thread returned by Gmail for this
            draft.
          type:
            - string
            - 'null'
        to:
          type: string
        subject:
          type: string
        threadId:
          type:
            - string
            - 'null'
        quotedHistoryIncluded:
          type: boolean
          description: >-
            True when quoted conversation history was included by the server or
            already present in the request body.
        attachments:
          type: array
          items:
            type: object
            properties:
              filename:
                type: string
              mimeType:
                type: string
              size:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            required:
              - filename
              - mimeType
              - size
      required:
        - ok
        - draftId
        - messageId
        - draftUrl
        - threadUrl
        - to
        - subject
        - threadId
        - quotedHistoryIncluded
    InvalidRequestError:
      type: object
      properties:
        error:
          type: string
          const: invalid_request
        message:
          type: string
        details:
          type: array
          items:
            type: object
            properties:
              message:
                type: string
              path:
                type: array
                items:
                  type:
                    - string
                    - number
            required:
              - message
            additionalProperties: {}
        capability:
          type: string
      required:
        - error
        - details
    GoogleWorkspaceMissingThreadIdError:
      type: object
      properties:
        error:
          type: string
          const: missing_thread_id
        message:
          type: string
      required:
        - error
        - message
    UnauthorizedError:
      type: object
      properties:
        error:
          type: string
          const: unauthorized
      required:
        - error
    GoogleWorkspaceNeedsConnectionError:
      type: object
      properties:
        error:
          type: string
          const: needs_connection
        message:
          type: string
      required:
        - error
        - message
    GoogleWorkspaceUpstreamError:
      type: object
      properties:
        error:
          type: string
          const: google_api_error
        message:
          type: string
      required:
        - error
        - message
  securitySchemes:
    denApiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Organization API key passed as the `x-api-key` header. The raw key is
        the header value; do not prefix it with `Bearer`.
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: session-token
      description: >-
        Den session token passed as `Authorization: Bearer <session-token>` for
        user-authenticated Den routes. Not for API keys: send `den_` keys in the
        `x-api-key` header instead.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.