Back to Skills
    🦞

    clawemail

    Google Workspace via ClawEmail — Gmail, Drive, Docs, Sheets, Slides

    By @cto1
    View on GitHub
    SKILL.md
    ---
    name: claw
    description: "Google Workspace via ClawEmail — Gmail, Drive, Docs, Sheets, Slides, Calendar, Forms. Use PROACTIVELY when the user asks to send email, create documents, manage files, schedule events, or work with any Google service."
    metadata: {"openclaw":{"emoji":"🦞","requires":{"env":["CLAWEMAIL_CREDENTIALS"]},"primaryEnv":"CLAWEMAIL_CREDENTIALS"}}
    ---
    
    # Claw — Google Workspace for AI Agents
    
    Use `claw` for Gmail, Drive, Docs, Sheets, Slides, Calendar, and Forms via your @clawemail.com account.
    
    ## Setup
    
    1. Save your ClawEmail credentials JSON to `~/.config/clawemail/credentials.json`
    2. Set the environment variable: `export CLAWEMAIL_CREDENTIALS=~/.config/clawemail/credentials.json`
    
    Get credentials at https://clawemail.com — sign up, then visit `/connect/YOUR_PREFIX` to authorize OAuth.
    
    ## Getting an Access Token
    
    All API calls need a Bearer token. Use the helper script to refresh and cache it:
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    ```
    
    The script caches tokens for 50 minutes. Always assign to `TOKEN` before making API calls.
    
    ---
    
    ## Gmail
    
    ### Search emails
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages?q=newer_than:7d&maxResults=10" | python3 -m json.tool
    ```
    
    Common query operators: `from:`, `to:`, `subject:`, `newer_than:`, `older_than:`, `is:unread`, `has:attachment`, `label:`, `in:inbox`.
    
    ### Read a message
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages/MESSAGE_ID?format=full" | python3 -m json.tool
    ```
    
    For plain text body only, use `format=minimal` and decode the payload. For readable output:
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages/MESSAGE_ID?format=full" \
      | python3 -c "
    import json,sys,base64
    m=json.load(sys.stdin)
    hdrs={h['name']:h['value'] for h in m['payload']['headers']}
    print(f\"From: {hdrs.get('From','')}\nTo: {hdrs.get('To','')}\nSubject: {hdrs.get('Subject','')}\nDate: {hdrs.get('Date','')}\n\")
    def get_body(part):
        if part.get('body',{}).get('data'):
            return base64.urlsafe_b64decode(part['body']['data']).decode('utf-8','replace')
        for p in part.get('parts',[]):
            if p['mimeType']=='text/plain': return get_body(p)
        for p in part.get('parts',[]):
            b=get_body(p)
            if b: return b
        return ''
    print(get_body(m['payload']))
    "
    ```
    
    ### Send an email
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    python3 -c "
    import base64,json
    raw = base64.urlsafe_b64encode(
        b'To: recipient@example.com\r\nSubject: Hello\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nMessage body here'
    ).decode()
    print(json.dumps({'raw': raw}))
    " | curl -s -X POST \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d @- \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages/send"
    ```
    
    For HTML emails, replace `Content-Type: text/plain` with `Content-Type: text/html` and use HTML in the body.
    
    ### Reply to a message
    
    Same as send, but add `In-Reply-To:` and `References:` headers from the original message, and include `threadId` in the JSON body:
    
    ```bash
    python3 -c "
    import base64,json
    raw = base64.urlsafe_b64encode(
        b'To: recipient@example.com\r\nSubject: Re: Original Subject\r\nIn-Reply-To: <original-message-id>\r\nReferences: <original-message-id>\r\nContent-Type: text/plain; charset=utf-8\r\n\r\nReply body'
    ).decode()
    print(json.dumps({'raw': raw, 'threadId': 'THREAD_ID'}))
    " | curl -s -X POST \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d @- \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages/send"
    ```
    
    ### List labels
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://gmail.googleapis.com/gmail/v1/users/me/labels" | python3 -m json.tool
    ```
    
    ### Add/remove labels
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"addLabelIds":["LABEL_ID"],"removeLabelIds":["INBOX"]}' \
      "https://gmail.googleapis.com/gmail/v1/users/me/messages/MESSAGE_ID/modify"
    ```
    
    ---
    
    ## Google Drive
    
    ### List files
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://www.googleapis.com/drive/v3/files?pageSize=20&fields=files(id,name,mimeType,modifiedTime,size)&orderBy=modifiedTime desc" | python3 -m json.tool
    ```
    
    ### Search files
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://www.googleapis.com/drive/v3/files?q=name+contains+'report'&fields=files(id,name,mimeType,modifiedTime)" | python3 -m json.tool
    ```
    
    Query operators: `name contains 'term'`, `mimeType='application/vnd.google-apps.document'`, `'FOLDER_ID' in parents`, `trashed=false`, `modifiedTime > '2025-01-01'`.
    
    Common MIME types:
    - Document: `application/vnd.google-apps.document`
    - Spreadsheet: `application/vnd.google-apps.spreadsheet`
    - Presentation: `application/vnd.google-apps.presentation`
    - Folder: `application/vnd.google-apps.folder`
    - Form: `application/vnd.google-apps.form`
    
    ### Create a folder
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"name":"My Folder","mimeType":"application/vnd.google-apps.folder"}' \
      "https://www.googleapis.com/drive/v3/files?fields=id,name" | python3 -m json.tool
    ```
    
    ### Upload a file
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -F "metadata={\"name\":\"report.pdf\"};type=application/json" \
      -F "file=@/path/to/report.pdf;type=application/pdf" \
      "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id,name" | python3 -m json.tool
    ```
    
    ### Download a file
    
    For Google Docs/Sheets/Slides (export):
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://www.googleapis.com/drive/v3/files/FILE_ID/export?mimeType=application/pdf" -o output.pdf
    ```
    
    Export formats: `text/plain`, `text/html`, `application/pdf`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document` (docx), `text/csv` (sheets).
    
    For binary files (download):
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://www.googleapis.com/drive/v3/files/FILE_ID?alt=media" -o output.file
    ```
    
    ### Share a file
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"role":"writer","type":"user","emailAddress":"user@example.com"}' \
      "https://www.googleapis.com/drive/v3/files/FILE_ID/permissions"
    ```
    
    Roles: `reader`, `commenter`, `writer`, `owner`. Types: `user`, `group`, `domain`, `anyone`.
    
    ### Delete a file
    
    ```bash
    curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \
      "https://www.googleapis.com/drive/v3/files/FILE_ID"
    ```
    
    ---
    
    ## Google Docs
    
    ### Create a document
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"title":"My Document"}' \
      "https://docs.googleapis.com/v1/documents" | python3 -m json.tool
    ```
    
    ### Read a document
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://docs.googleapis.com/v1/documents/DOCUMENT_ID" | python3 -m json.tool
    ```
    
    For plain text extraction:
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://docs.googleapis.com/v1/documents/DOCUMENT_ID" \
      | python3 -c "
    import json,sys
    doc=json.load(sys.stdin)
    text=''
    for el in doc.get('body',{}).get('content',[]):
        for p in el.get('paragraph',{}).get('elements',[]):
            text+=p.get('textRun',{}).get('content','')
    print(text)
    "
    ```
    
    ### Append text to a document
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"requests":[{"insertText":{"location":{"index":1},"text":"Hello, world!\n"}}]}' \
      "https://docs.googleapis.com/v1/documents/DOCUMENT_ID:batchUpdate"
    ```
    
    ### Replace text in a document
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"requests":[{"replaceAllText":{"containsText":{"text":"OLD_TEXT","matchCase":true},"replaceText":"NEW_TEXT"}}]}' \
      "https://docs.googleapis.com/v1/documents/DOCUMENT_ID:batchUpdate"
    ```
    
    ### Insert a heading
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"requests":[{"insertText":{"location":{"index":1},"text":"My Heading\n"}},{"updateParagraphStyle":{"range":{"startIndex":1,"endIndex":12},"paragraphStyle":{"namedStyleType":"HEADING_1"},"fields":"namedStyleType"}}]}' \
      "https://docs.googleapis.com/v1/documents/DOCUMENT_ID:batchUpdate"
    ```
    
    Heading styles: `HEADING_1` through `HEADING_6`, `TITLE`, `SUBTITLE`, `NORMAL_TEXT`.
    
    ---
    
    ## Google Sheets
    
    ### Create a spreadsheet
    
    ```bash
    TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"properties":{"title":"My Spreadsheet"}}' \
      "https://sheets.googleapis.com/v4/spreadsheets" | python3 -m json.tool
    ```
    
    ### Read cells
    
    ```bash
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:D10" | python3 -m json.tool
    ```
    
    ### Write cells
    
    ```bash
    curl -s -X PUT -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"values":[["Name","Age","City"],["Alice","30","NYC"],["Bob","25","LA"]]}' \
      "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:C3?valueInputOption=USER_ENTERED" | python3 -m json.tool
    ```
    
    ### Append rows
    
    ```bash
    curl -s -X POST -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"values":[["Charlie","35","Chicago"]]}' \
      "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A:C:append?valueInputOption=USER_ENTERED&insertDataOption=INSERT_ROWS" | python3 -m json.tool
    ```
    
    ### Clear 
    
    ... (truncated)