# Send ClawEmail to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "claw",
    "name": "ClawEmail",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/cto1/claw",
    "canonicalUrl": "https://clawhub.ai/cto1/claw",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/claw",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=claw",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md",
      "scripts/token.sh"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "claw",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-29T10:16:12.492Z",
      "expiresAt": "2026-05-06T10:16:12.492Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=claw",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=claw",
        "contentDisposition": "attachment; filename=\"claw-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "claw"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/claw"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/claw",
    "downloadUrl": "https://openagent3.xyz/downloads/claw",
    "agentUrl": "https://openagent3.xyz/skills/claw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/claw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/claw/agent.md"
  }
}
```
## Documentation

### Claw — Google Workspace for AI Agents

Use claw for Gmail, Drive, Docs, Sheets, Slides, Calendar, and Forms via your @clawemail.com account.

### Setup

Save your ClawEmail credentials JSON to ~/.config/clawemail/credentials.json
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:

TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)

The script caches tokens for 50 minutes. Always assign to TOKEN before making API calls.

### Search emails

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

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:

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

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:

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

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://gmail.googleapis.com/gmail/v1/users/me/labels" | python3 -m json.tool

### Add/remove labels

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"

### List files

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

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

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

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):

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):

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/drive/v3/files/FILE_ID?alt=media" -o output.file

### Share a file

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

curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/drive/v3/files/FILE_ID"

### Create a document

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

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://docs.googleapis.com/v1/documents/DOCUMENT_ID" | python3 -m json.tool

For plain text extraction:

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

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

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

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.

### Create a spreadsheet

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

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:D10" | python3 -m json.tool

### Write cells

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

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 a range

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/Sheet1!A1:D10:clear"

### Get spreadsheet metadata

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?fields=properties.title,sheets.properties" | python3 -m json.tool

### Create a presentation

TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"title":"My Presentation"}' \\
  "https://slides.googleapis.com/v1/presentations" | python3 -m json.tool

### Get presentation info

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://slides.googleapis.com/v1/presentations/PRESENTATION_ID" | python3 -m json.tool

### Add a new slide

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"requests":[{"createSlide":{"slideLayoutReference":{"predefinedLayout":"TITLE_AND_BODY"}}}]}' \\
  "https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate" | python3 -m json.tool

Layouts: BLANK, TITLE, TITLE_AND_BODY, TITLE_AND_TWO_COLUMNS, TITLE_ONLY, SECTION_HEADER, ONE_COLUMN_TEXT, MAIN_POINT, BIG_NUMBER.

### Add text to a slide

First get the slide's page object IDs, then insert text into a placeholder:

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"requests":[{"insertText":{"objectId":"PLACEHOLDER_OBJECT_ID","text":"Hello from ClawEmail!","insertionIndex":0}}]}' \\
  "https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate"

### Add an image to a slide

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"requests":[{"createImage":{"url":"https://example.com/image.png","elementProperties":{"pageObjectId":"SLIDE_ID","size":{"width":{"magnitude":3000000,"unit":"EMU"},"height":{"magnitude":2000000,"unit":"EMU"}},"transform":{"scaleX":1,"scaleY":1,"translateX":1000000,"translateY":1500000,"unit":"EMU"}}}}]}' \\
  "https://slides.googleapis.com/v1/presentations/PRESENTATION_ID:batchUpdate"

### List upcoming events

TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=$(date -u +%Y-%m-%dT%H:%M:%SZ)&maxResults=10&singleEvents=true&orderBy=startTime" | python3 -m json.tool

### Get events in a date range

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/calendar/v3/calendars/primary/events?timeMin=2025-03-01T00:00:00Z&timeMax=2025-03-31T23:59:59Z&singleEvents=true&orderBy=startTime" | python3 -m json.tool

### Create an event

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{
    "summary": "Team Meeting",
    "description": "Weekly standup",
    "start": {"dateTime": "2025-03-15T10:00:00-05:00", "timeZone": "America/New_York"},
    "end": {"dateTime": "2025-03-15T11:00:00-05:00", "timeZone": "America/New_York"},
    "attendees": [{"email": "colleague@example.com"}]
  }' \\
  "https://www.googleapis.com/calendar/v3/calendars/primary/events" | python3 -m json.tool

### Update an event

curl -s -X PATCH -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"summary":"Updated Meeting Title","location":"Conference Room A"}' \\
  "https://www.googleapis.com/calendar/v3/calendars/primary/events/EVENT_ID" | python3 -m json.tool

### Delete an event

curl -s -X DELETE -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/calendar/v3/calendars/primary/events/EVENT_ID"

### List calendars

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://www.googleapis.com/calendar/v3/users/me/calendarList" | python3 -m json.tool

### Create a form

TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"info":{"title":"Feedback Form"}}' \\
  "https://forms.googleapis.com/v1/forms" | python3 -m json.tool

### Add questions

curl -s -X POST -H "Authorization: Bearer $TOKEN" \\
  -H "Content-Type: application/json" \\
  -d '{"requests":[{"createItem":{"item":{"title":"How would you rate this?","questionItem":{"question":{"required":true,"scaleQuestion":{"low":1,"high":5,"lowLabel":"Poor","highLabel":"Excellent"}}}},"location":{"index":0}}}]}' \\
  "https://forms.googleapis.com/v1/forms/FORM_ID:batchUpdate"

### Get form responses

curl -s -H "Authorization: Bearer $TOKEN" \\
  "https://forms.googleapis.com/v1/forms/FORM_ID/responses" | python3 -m json.tool

### Tips

Always refresh token first: Start every sequence with TOKEN=$(~/.openclaw/skills/claw/scripts/token.sh)
JSON output: Pipe through python3 -m json.tool for readable output, or | python3 -c "import json,sys;..." for extraction
Pagination: Most list endpoints return nextPageToken. Pass it as ?pageToken=TOKEN for the next page
Batch operations: Docs, Sheets, and Slides support batchUpdate — send multiple operations in one request
Error 401: Token expired. Re-run token.sh to refresh
Error 403: Scope not authorized. The ClawEmail OAuth includes Gmail, Drive, Docs, Sheets, Slides, Calendar, and Forms scopes
Rate limits: Google APIs have per-user rate limits. Add brief delays between rapid successive calls
File IDs: Google Docs/Sheets/Slides URLs contain the file ID: https://docs.google.com/document/d/FILE_ID/edit

### When to Use

User asks to send, read, or search email
User wants to create or edit documents, spreadsheets, or presentations
User needs to manage files in Google Drive
User wants to schedule or check calendar events
User asks to create forms or review form responses
Any task involving Google Workspace services
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: cto1
- Version: 1.0.1
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-04-29T10:16:12.492Z
- Expires at: 2026-05-06T10:16:12.492Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/claw)
- [Send to Agent page](https://openagent3.xyz/skills/claw/agent)
- [JSON manifest](https://openagent3.xyz/skills/claw/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/claw/agent.md)
- [Download page](https://openagent3.xyz/downloads/claw)