apple-notes
Manage Apple Notes via the memo CLI on macOS (create, view, search, edit).
Google OAuth2 client credentials (downloaded from Google Cloud Console)
$ npx -y skills add redwoodog/hermes-desktop --skill google-workspace --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/google-workspaceContext preview
The summary Claude sees to decide when to auto-load this skill.
Google OAuth2 client credentials (downloaded from Google Cloud Console)
name: google-workspace
description: Gmail, Calendar, Drive, Contacts, Sheets, and Docs integration via Python. Uses OAuth2 with automatic token refresh. No external binaries needed — runs entirely with Google's Python client libraries in the Hermes venv.
version: 1.0.0
author: Nous Research
license: MIT
required_credential_files:
- path: google_token.json
description: Google OAuth2 token (created by setup script)
- path: google_client_secret.json
description: Google OAuth2 client credentials (downloaded from Google Cloud Console)
metadata:
hermes:
tags: [Google, Gmail, Calendar, Drive, Sheets, Docs, Contacts, Email, OAuth]
homepage: https://github.com/NousResearch/hermes-agent
related_skills: [himalaya]Gmail, Calendar, Drive, Contacts, Sheets, and Docs — all through Python scripts in this skill. No external binaries to install.
The setup is fully non-interactive — you drive it step by step so it works on CLI, Telegram, Discord, or any platform.
Define a shorthand first:
GSETUP="python ~/.hermes/skills/productivity/google-workspace/scripts/setup.py"
$GSETUP --check
If it prints `AUTHENTICATED`, skip to Usage — setup is already done.
Before starting OAuth setup, ask the user TWO questions:
**Question 1: "What Google services do you need? Just email, or also Calendar/Drive/Sheets/Docs?"**
instead — it works with a Gmail App Password (Settings → Security → App Passwords) and takes 2 minutes to set up. No Google Cloud project needed. Load the himalaya skill and follow its setup instructions.
skill's OAuth setup below.
**Question 2: "Does your Google account use Advanced Protection (hardware security keys required to sign in)? If you're not sure, you probably don't — it's something you would have explicitly enrolled in."**
allowed apps list before Step 4 will work. Let them know upfront.
Tell the user:
> You need a Google Cloud OAuth client. This is a one-time setup: > > 1. Go to https://console.cloud.google.com/apis/credentials > 2. Create a project (or use an existing one) > 3. Click "Enable APIs" and enable: Gmail API, Google Calendar API, > Google Drive API, Google Sheets API, Google Docs API, People API > 4. Go to Credentials → Create Credentials → OAuth 2.0 Client ID > 5. Application type: "Desktop app" → Create > 6. Click "Download JSON" and tell me the file path
Once they provide the path:
$GSETUP --client-secret /path/to/client_secret.json
$GSETUP --auth-url
This prints a URL. **Send the URL to the user** and tell them:
> Open this link in your browser, sign in with your Google account, and > authorize access. After authorizing, you'll be redirected to a page that > may show an error — that's expected. Copy the ENTIRE URL from your > browser's address bar and paste it back to me.
The user will paste back either a URL like `http://localhost:1/?code=4/0A...&scope=...` or just the code string. Either works. The `--auth-url` step stores a temporary pending OAuth session locally so `--auth-code` can complete the PKCE exchange later, even on headless systems:
$GSETUP --auth-code "THE_URL_OR_CODE_THE_USER_PASTED"
$GSETUP --check
Should print `AUTHENTICATED`. Setup is complete — token refreshes automatically from now on.
All commands go through the API script. Set `GAPI` as a shorthand:
GAPI="python ~/.hermes/skills/productivity/google-workspace/scripts/google_api.py"
# Search (returns JSON array with id, from, subject, date, snippet) $GAPI gmail search "is:unread" --max 10 $GAPI gmail search "from:boss@company.com newer_than:1d" $GAPI gmail search "has:attachment filename:pdf newer_than:7d" # Read full message (returns JSON with body text) $GAPI gmail get MESSAGE_ID # Send $GAPI gmail send --to user@example.com --subject "Hello" --body "Message text" $GAPI gmail send --to user@example.com --subject "Report" --body "<h1>Q4</h1><p>Details...</p>" --html # Reply (automatically threads and sets In-Reply-To) $GAPI gmail reply MESSAGE_ID --body "Thanks, that works for me." # Labels $GAPI gmail labels $GAPI gmail modify MESSAGE_ID --add-labels LABEL_ID $GAPI gmail modify MESSAGE_ID --remove-labels UNREAD
# List events (defaults to next 7 days) $GAPI calendar list $GAPI calendar list --start 2026-03-01T00:00:00Z --end 2026-03-07T23:59:59Z # Create event (ISO 8601 with timezone required) $GAPI calendar create --summary "Team Standup" --start 2026-03-01T10:00:00-06:00 --end 2026-03-01T10:30:00-06:00 $GAPI calendar create --summary "Lunch" --start 2026-03-01T12:00:00Z --end 2026-03-01T13:00:00Z --location "Cafe" $GAPI calendar create --summary "Review" --start 2026-03-01T14:00:00Z --end 2026-03-01T15:00:00Z --attendees "alice@co.com,bob@co.com" # Delete event $GAPI calendar delete EVENT_ID
$GAPI drive search "q
A Windows-native AI agent that lives on your desktop. Chat with it, give it tools, let it learn who you are. Built with WinUI 3 and .NET 10.
Manage Apple Notes via the memo CLI on macOS (create, view, search, edit).
Manage Apple Reminders via remindctl CLI (list, add, complete, delete).
Track Apple devices and AirTags via FindMy.app on macOS using AppleScript and screen capture.
Delegate coding tasks to Claude Code (Anthropic's CLI agent). Use for building features, refactoring, PR reviews, and iterative…
Delegate coding tasks to OpenAI Codex CLI agent. Use for building features, refactoring, PR reviews, and batch issue fixing.…