MCP server giving Hermes scoped Gmail/Calendar/Drive access via a dedicated Google account
Project description
hermes-google
MCP server giving Hermes (Claude Code running as a personal assistant) scoped access to Gmail, Google Calendar, and Google Drive through a dedicated Hermes Google account — without granting access to your personal Google account.
See docs/superpowers/specs/2026-04-23-hermes-google-design.md
for the full design.
Quick Start
Add hermes-google to your project's .mcp.json:
{
"mcpServers": {
"hermes-google": {
"type": "stdio",
"command": "uvx",
"args": ["hermes-google-mcp@latest"]
}
}
}
Google Account Setup
- Sign up for a plain Gmail account (e.g.,
hermes-yourname@gmail.com) - In Google Cloud Console: create a project, enable the Gmail, Calendar, and Drive APIs
- Create an OAuth 2.0 Client ID (type: Desktop application) and download the client secret JSON
- Save it as
~/.config/hermes-google/oauth_client.json - Run the setup script:
git clone https://github.com/jimmy-larsson/hermes-google.git
cd hermes-google
./scripts/setup.sh
The setup script creates the config, runs the OAuth flow (saving the token to
~/.config/hermes-google/token.json), and prints the remaining manual steps.
Host-Side OAuth
The OAuth flow opens a browser for consent — it must run on your host machine, not inside a headless container.
If your config and credentials live inside a container (e.g. Docker-mounted
~/.config/hermes-google/), you need to:
- Copy
config.tomlandoauth_client.jsonto the host filesystem at~/.config/hermes-google/ - Run the OAuth flow from the host:
uvx hermes-google-mcp@latest auth login
- The resulting
token.jsonis saved on the host — it will be picked up by the container through the volume mount
Gmail Setup
Create filters in your personal Gmail to route emails to the Hermes account:
- For each sender you want Hermes to handle: create a filter that both
labels the email (e.g.
hermes-review) and forwards it tohermes-yourname@gmail.com— in a single filter - For replies from Hermes:
from:hermes-yourname@gmail.com→ apply labelhermes
Gotchas
- Filters don't chain. Gmail evaluates all filters in a single pass against the original message properties. A label applied by filter A will not trigger filter B that matches on that label. You must combine label + forward into one filter per sender/criteria.
- "Apply to existing" skips forwarding. When you click "Also apply filter to matching conversations", Gmail only runs local actions (label, archive, star). Forwarding only fires on new incoming messages.
Calendar & Drive Setup
- Calendar: Share your calendar with the Hermes account at "Make changes to
events" permission level. Set
[user].calendar_idinconfig.toml. - Drive: Share specific files/folders with the Hermes account. Optionally
set
[drive].default_parent_folder_idinconfig.tomlfor a default upload folder.
Usage
Once installed, the following tools are available to Hermes in every session:
mail_list_pending,mail_search,mail_get,mail_send_draft,mail_mark_read,mail_archivecal_list_calendars,cal_list_events,cal_create_event,cal_update_event,cal_delete_eventdrive_search,drive_list,drive_get,drive_upload,drive_update,drive_move,drive_deleteauth_status
All write operations require user confirmation. mail_send_draft is
structurally restricted to your own email; it cannot send to external
recipients.
Debug CLI
Same operations via shell:
hermes-google auth status
hermes-google mail list --limit 10
hermes-google mail get <message_id>
hermes-google cal list --start 2026-04-24T00:00:00+09:00 --end 2026-04-25T00:00:00+09:00
hermes-google drive search "Q1 report"
Revocation
Any one of these fully cuts an integration surface:
- Delete the forwarding filter in your personal Gmail
- Unshare your calendar with the Hermes account
- Unshare a Drive file or folder
hermes-google auth revoke— removes the refresh token locallyclaude mcp remove hermes-google— Hermes loses the tools; Google data untouched- Delete the Hermes Google account entirely
Development
conda activate hermes-google
pytest
ruff check src tests
Releasing
# 1. Bump version in pyproject.toml, commit and push
git commit -am "chore: bump version to X.Y.Z"
git push
# 2. Tag locally and push — triggers the CI pipeline
git tag X.Y.Z
git push origin X.Y.Z
# 3. After CI passes, create the GitHub release
gh release create X.Y.Z --verify-tag --generate-notes
Alternative Install Methods
# User scope — available in all your projects
claude mcp add -s user hermes-google -- uvx hermes-google-mcp
# Local scope — private to you in this project only
claude mcp add hermes-google -- uvx hermes-google-mcp
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hermes_google_mcp-0.3.0.tar.gz.
File metadata
- Download URL: hermes_google_mcp-0.3.0.tar.gz
- Upload date:
- Size: 60.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07ca34ad632f25996dd884ae95213ccfc98d794d95cf5da0b39c2097967ceda6
|
|
| MD5 |
f9946a0fc7f8fc542bbf7a83a91d74c0
|
|
| BLAKE2b-256 |
b8911c069aeb00e34ab1a7373eac2337871037a8ce6b28ee9765822a84492b1e
|
Provenance
The following attestation bundles were made for hermes_google_mcp-0.3.0.tar.gz:
Publisher:
release.yml on jimmy-larsson/hermes-google
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_google_mcp-0.3.0.tar.gz -
Subject digest:
07ca34ad632f25996dd884ae95213ccfc98d794d95cf5da0b39c2097967ceda6 - Sigstore transparency entry: 2112302806
- Sigstore integration time:
-
Permalink:
jimmy-larsson/hermes-google@6c7db4f46bfb9a6b34225e989899942fe9819b17 -
Branch / Tag:
refs/tags/0.3.0 - Owner: https://github.com/jimmy-larsson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6c7db4f46bfb9a6b34225e989899942fe9819b17 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hermes_google_mcp-0.3.0-py3-none-any.whl.
File metadata
- Download URL: hermes_google_mcp-0.3.0-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91b8403903cb0d1824e3f7c4211c09e4ba5d68663b295593150fb04aadcb9478
|
|
| MD5 |
06e2c98196054a098b9b8b6d57094ffc
|
|
| BLAKE2b-256 |
b765ac3029fe23a25b34a3936e176f6f9045101344c325bc0b298a89e2d12e88
|
Provenance
The following attestation bundles were made for hermes_google_mcp-0.3.0-py3-none-any.whl:
Publisher:
release.yml on jimmy-larsson/hermes-google
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hermes_google_mcp-0.3.0-py3-none-any.whl -
Subject digest:
91b8403903cb0d1824e3f7c4211c09e4ba5d68663b295593150fb04aadcb9478 - Sigstore transparency entry: 2112302812
- Sigstore integration time:
-
Permalink:
jimmy-larsson/hermes-google@6c7db4f46bfb9a6b34225e989899942fe9819b17 -
Branch / Tag:
refs/tags/0.3.0 - Owner: https://github.com/jimmy-larsson
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@6c7db4f46bfb9a6b34225e989899942fe9819b17 -
Trigger Event:
push
-
Statement type: