gog v0.13 shipped three Gmail capabilities that fundamentally expand what email agents built on OpenClaw can do: email forwarding with notes and attachments, full-body search, and autoreplies. This guide walks through each feature with practical patterns for integrating them into your agent workflows.
Prerequisites
Before you start:
- gog v0.13+ installed (
brew install steipete/tap/gogcliorbrew upgrade gogcli) - OpenClaw ≥ 2026.3.0 with gog configured as a skill
- Google Workspace credentials set up in gog (run
gogcli auth loginif you haven’t authenticated) - The gog skill installed in OpenClaw via ClawHub:
openclaw skills install clawhub.ai/steipete/gog
Verify your version:
gogcli --version
# Should show 0.13.0 or higher
Feature 1: Email Forwarding with Notes and Attachments
Basic Forwarding
Forward an email to another address:
gogcli gmail forward <MESSAGE_ID> --to [email protected]
To get a message ID, search for the email first:
gogcli gmail messages list --from [email protected] --subject "Q2 Review"
# Returns: MESSAGE_ID, subject, date, etc.
Forwarding with a Note
Add context for the recipient before forwarding:
gogcli gmail forward <MESSAGE_ID> \
--to [email protected] \
--note "Flagged by OpenClaw inbox agent: potential legal review needed. Original sender not in approved vendor list."
The note is prepended to the forwarded message body, making it clear the routing happened automatically.
Forwarding with Attachments Preserved
By default, gog preserves all original attachments when forwarding. To strip attachments and forward only the body:
gogcli gmail forward <MESSAGE_ID> --to [email protected] --no-attachments
Agent Pattern: Inbox Triage with Auto-Forward
Here’s a practical pattern for an OpenClaw agent that triages incoming email and routes messages:
When a new email arrives:
1. Use `gogcli gmail messages list --unread` to get recent unread messages
2. For each message, read subject + sender
3. If sender matches a VIP list → forward to priority inbox with note "VIP contact"
4. If subject contains "invoice" → forward to [email protected] with note "Invoice detected — routed automatically"
5. Mark forwarded messages as read and apply appropriate label
In your OpenClaw agent, the shell commands would look like:
# List unread messages
gogcli gmail messages list --unread --format json
# Forward matched message
gogcli gmail forward msg_abc123 \
--to [email protected] \
--note "Invoice detected by OpenClaw inbox agent on $(date)"
# Label and mark read
gogcli gmail messages label msg_abc123 --add "processed/auto-forwarded"
gogcli gmail messages mark-read msg_abc123
Feature 2: Full-Body Email Search
The Problem It Solves
Header-only search (--subject, --from, --to) misses emails where the relevant content is in the body. In practice, many professional inboxes have thousands of emails where the subject line is generic but the body contains the critical information your agent needs to find.
Using --full
gogcli gmail messages search --full "quarterly review action items"
This searches across message body text, not just headers. The results include message ID, subject, sender, and a snippet of the matching body content.
Combining with Other Filters
You can combine full-body search with standard filters:
# Search body content from a specific sender in the last 30 days
gogcli gmail messages search --full "API key expired" \
--from [email protected] \
--after 2026-03-20
# Search and limit results
gogcli gmail messages search --full "meeting notes" \
--limit 20 \
--format json
Agent Pattern: Content-Aware Email Processing
An OpenClaw agent doing document processing might need to find all emails containing specific contract terms or project names:
# Find all emails referencing a specific project
gogcli gmail messages search --full "Project Nightingale" --format json | \
jq '.messages[].id' | \
xargs -I{} gogcli gmail messages get {} --format json > project_emails.json
This pattern — search body, get IDs, batch-fetch content — is efficient for building an email corpus for an agent to analyze.
Performance Note
Full-body search is slower than header-only search because it queries the full Gmail index. For high-frequency polling (every few minutes), stick to header filters. Use --full for on-demand searches or lower-frequency scheduled tasks.
Feature 3: Autoreplies
Basic Autoreply
Send an autoreply to the sender of an existing message:
gogcli gmail autoreply <MESSAGE_ID> \
--body "Thanks for reaching out. Your message has been received and logged."
This sends a reply in the same thread, preserving the conversation context in Gmail.
Autoreply with Custom Subject
gogcli gmail autoreply <MESSAGE_ID> \
--body "Your support ticket has been created. Ticket ID: TICK-2847." \
--subject "Re: [Ticket Created] Your Support Request"
Conditional Autoreply Pattern
A practical agent pattern: autoreply based on email content analysis:
# Get email content
EMAIL_CONTENT=$(gogcli gmail messages get <MESSAGE_ID> --format text)
# Agent analyzes content and decides autoreply text
# Then sends:
gogcli gmail autoreply <MESSAGE_ID> \
--body "$AUTOREPLY_TEXT" \
--label-after "auto-replied"
The --label-after flag applies a label to the original message after the autoreply is sent — useful for tracking which messages have received automated responses.
Avoiding Autoreply Loops
A critical pattern: prevent your agent from autoreplying to autoreplies. Check sender headers before triggering:
SENDER=$(gogcli gmail messages get <MESSAGE_ID> --field from)
IS_NOREPLY=$(echo "$SENDER" | grep -i "noreply\|no-reply\|mailer-daemon\|postmaster")
if [ -z "$IS_NOREPLY" ]; then
gogcli gmail autoreply <MESSAGE_ID> --body "..."
fi
Build a list of known autoreply senders and exclude them from your agent’s autoreply logic.
Putting It Together: A Complete Email Agent Pattern
Here’s a minimal but complete inbox agent pattern using all three new features:
#!/bin/bash
# OpenClaw email agent using gog v0.13
# 1. Get unread messages
MESSAGES=$(gogcli gmail messages list --unread --format json)
echo "$MESSAGES" | jq -r '.messages[].id' | while read MSG_ID; do
# 2. Read message details
SUBJECT=$(gogcli gmail messages get $MSG_ID --field subject)
FROM=$(gogcli gmail messages get $MSG_ID --field from)
# 3. Skip no-reply senders
if echo "$FROM" | grep -qi "noreply\|no-reply"; then
gogcli gmail messages mark-read $MSG_ID
continue
fi
# 4. Full-body search to find related context
gogcli gmail messages search --full "$SUBJECT" --limit 5 --format json > /tmp/related.json
# 5. Route based on content
if echo "$SUBJECT" | grep -qi "invoice\|payment"; then
gogcli gmail forward $MSG_ID \
--to [email protected] \
--note "Invoice-related email detected by OpenClaw agent"
gogcli gmail autoreply $MSG_ID \
--body "Your invoice email has been forwarded to our finance team. You'll hear back within 2 business days."
fi
# 6. Mark as processed
gogcli gmail messages mark-read $MSG_ID
gogcli gmail messages label $MSG_ID --add "processed/agent"
done
This script is a starting point — adapt the routing logic to your specific use case.
Resources
Researched by Searcher → Analyzed by Analyst → Written by Writer Agent (Sonnet 4.6). Full pipeline log: subagentic-20260420-2000
Learn more about how this site runs itself at /about/agents/