Hermes Google MCP Server
Provides tools to list and retrieve email messages from Gmail, including search filtering and full message content with body.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Hermes Google MCP Serverlist my calendar events for today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Hermes Google MCP Server
Schlanker MCP-Server für Google Workspace (Calendar · Gmail · Drive) — entwickelt für den Hermes Agent im Docker-Setup.
Warum dieses Projekt?
Die in der Hermes-Dokumentation beschriebenen drei Standard-Wege zur Google-Anbindung scheiterten im Docker-Container-Setup:
Weg | Problem |
gws CLI MCP |
|
google_workspace_mcp | asyncio |
Google Remote MCP | OAuth-Flow im Container nicht möglich (kein Browser) |
Dieser Server löst alle drei Probleme: Reines Python (stdlib-only), HTTP-Transport (umgeht den asyncio-Bug), nutzt die funktionierende gws-CLI-Authentifizierung.
Related MCP server: gg-mcp
Architektur
Hermes Gateway (Docker) Host (masoud)
───────────────────────── ─────────────────────────
config.yaml: ┌──────────────────────┐
gws-mcp: │ gws-mcp Container │
url: http://172.17.0.1 ───► │ http_server.py │
:8777/mcp │ :8777 → server.py │
│ → gws CLI │
│ → Google APIs │
└──────────────────────┘
▲ Port 8777 (forwarded)
▼
Google Workspace APIs
(Calendar v3 · Gmail v1 · Drive v3)Container-Resilienz
Der Docker-Container ist gegen Port-Konflikte und unsauberes Herunterfahren abgesichert:
Maßnahme | Ort | Wirkung |
|
| Tini als Init-Prozess — fängt Signale korrekt ab, verhindert Zombie-Prozesse |
|
| 10 Sekunden für sauberes Herunterfahren vor SIGKILL |
|
| Schließt den HTTP-Socket bei Docker-Stop — Port sofort frei |
|
| Container startet nach Crash oder Reboot automatisch neu |
Ablauf bei docker stop / Reboot:
Docker sendet
SIGTERMan den Containerhttp_server.pyfängt das Signal und ruftserver.server_close()aufPort 8777 wird sofort freigegeben — kein Port-Konflikt beim Neustart
Container beendet mit Exit-Code
0(statt 137/SIGKILL)Nach Reboot startet Docker den Container automatisch (
unless-stopped)
Manuelle Fehlerbehebung (falls Container im Status Exited (137) hängt):
docker start gws-mcpAttachments & Pfadübersetzung
gws_gmail_send_message unterstützt Dateianhänge per MIME-Multipart. Da unterschiedliche MCP-Clients
verschiedene Pfadformate übergeben, übersetzt der Server automatisch:
Quelle | Pfadbeispiel | Container-Pfad |
Hermes TUI (Docker) |
|
|
OpenCode (Host) |
|
|
Funktionsweise (server.py Zeile 176–183):
# 1. Hermes Docker-Pfad: /opt/data/workspace/ → /workspace/
p = p.replace("/opt/data/workspace/", "/workspace/")
# 2. Host-Pfad (OpenCode & Co.): Extrahiere alles ab /workspace/
parts = p.split("/workspace/", 1)
if len(parts) == 2:
p = "/workspace/" + parts[1]Voraussetzung: Der Workspace ist als Volume in den Container eingehängt
(docker-compose.yml → ~/Development/HermesProject/hermes-data/workspace:/workspace).
Argument-Größenlimit (E2BIG)
Beim Senden großer Anhänge (>100 KB) würde die base64-kodierte MIME-Nachricht
das Linux-Arg-Limit von 128 KB pro Argument überschreiten ([Errno 7] Argument list too long).
Lösung: Statt --json {"raw":"<base64>"} wird die MIME-Nachricht in eine
Temp-Datei geschrieben und via --upload-Flag an gws übergeben – die
Gmail API verarbeitet sie als multipart/upload (message/rfc822).
# MIME-Nachricht in Temp-Datei im cwd (/app) schreiben
tf = NamedTemporaryFile(suffix=".eml", delete=False, dir=".")
tf.write(mime_bytes)
tf.close()
# Statt --json mit inline-base64 → --upload mit Temp-Datei
run_gws(["gws","gmail","users","messages","send",
"--params", '{"userId":"me"}',
"--upload", os.path.basename(tf.name),
"--upload-content-type", "message/rfc822"])
os.unlink(tf.name)Tools
Tool | Dienst | CRUD | Beschreibung |
| Calendar | READ | Events auflisten (Zeitraum, max. Anzahl) |
| Calendar | CREATE | Termin erstellen mit Teilnehmern |
| Calendar | UPDATE | Termin ändern |
| Calendar | DELETE | Termin löschen |
| Gmail | READ | E-Mail-IDs auflisten (Suchfilter) |
| Gmail | READ | E-Mail-Inhalt + Body (includeBody=true) |
| Gmail | CREATE | E-Mail senden mit Anhängen (MIME) |
| Gmail | DELETE | E-Mail in Papierkorb verschieben |
| Drive | READ | Dateien/Ordner auflisten |
| Drive | READ | Datei-Metadaten abrufen |
| Drive | CREATE | Datei erstellen/hochladen |
| Drive | UPDATE | Datei ändern/ersetzen |
| Drive | DELETE | Datei permanent löschen |
| Drive | READ | Datei herunterladen → workspace/ |
Voraussetzungen
gws CLI (
npm install -g @googleworkspace/cli)OAuth 2.0 Desktop-Client (Google Cloud Console → Credentials)
Authentifizierung via
gws auth login
Deployment
Der Server läuft als Docker-Container mit systemd-Integration für automatischen Start nach Reboot.
Docker Compose
# 1. Projekt klonen
git clone https://github.com/MAghadavoodi/HermesGoogleMCP.git ~/Development/Google_MCP
cd ~/Development/Google_MCP
# 2. Container bauen & starten
docker compose up -d gws-mcp
# 3. Status prüfen
docker ps --filter name=gws-mcpsystemd-Service (automatischer Start)
# Service aktivieren (startet Container bei Login)
systemctl --user enable --now gws-mcp.service
# Service verwalten
systemctl --user status gws-mcp
systemctl --user stop gws-mcp
systemctl --user start gws-mcpDie systemd-Unit delegiert an Docker (docker start/docker stop).
Die restart: unless-stopped-Policy im Container stellt sicher, dass er bei Crash oder Reboot automatisch neu startet.
Hermes-Konfiguration
In hermes-data/config.yaml:
mcp_servers:
gws-mcp:
url: http://172.17.0.1:8777/mcp
enabled: true
platform_toolsets:
cli:
- gws-mcp
matrix:
- gws-mcpTests
python3 tests/test_calendar.py # Calendar CRUD
python3 tests/test_gmail.py # Gmail CRUD
python3 tests/test_drive.py # Drive CRUD
python3 tests/test_all_crud.py # Full CRUD integrationProjektstruktur
Google_MCP/
├── src/
│ ├── server.py # MCP JSON-RPC Engine (CRUD + Attachments)
│ └── http_server.py # HTTP-Wrapper (Port 8777, SIGTERM-Handler)
├── tests/
│ ├── test_calendar.py
│ ├── test_gmail.py
│ ├── test_drive.py
│ └── test_all_crud.py
├── docs/
│ └── ARCHITECTURE.md # Detaillierte Architektur-Doku
├── Dockerfile # Docker-Image (ubuntu:24.04 + gws CLI)
├── docker-compose.yml # Docker Compose (init, stop_grace_period)
├── requirements.txt # stdlib-only, keine pip-Abhängigkeiten
└── .gitignoreLizenz
MIT — siehe LICENSE
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MAghadavoodi/HermesGoogleMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server