Hermes Google Server
БесплатноНе проверенLightweight MCP server for Google Workspace (Calendar, Gmail, Drive) designed for Hermes Agent in Docker, enabling tools to list events, messages, and files via
Описание
Lightweight MCP server for Google Workspace (Calendar, Gmail, Drive) designed for Hermes Agent in Docker, enabling tools to list events, messages, and files via CLI.
README
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 | gws v0.22.5 hat keinen mcp-Subbefehl |
| google_workspace_mcp | asyncio TaskGroup-Fehler beim Gateway-Connect |
| 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.
v2.2.1 (Juli 2026): Gmail Body-Truncation-Limit (body_text[:5000]) entfernt — lange E-Mails (z.B. Medium Daily Digest mit 15+ Artikeln) werden jetzt vollständig gelesen, ohne dass Inhalte abgeschnitten werden. main()-Funktion mit if __name__-Guard ermöglicht Unit-Tests via import server.
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 |
|---|---|---|
init: true |
docker-compose.yml |
Tini als Init-Prozess — fängt Signale korrekt ab, verhindert Zombie-Prozesse |
stop_grace_period: 10s |
docker-compose.yml |
10 Sekunden für sauberes Herunterfahren vor SIGKILL |
signal.signal(SIGTERM, ...) |
http_server.py |
Schließt den HTTP-Socket bei Docker-Stop — Port sofort frei |
restart: unless-stopped |
docker-compose.yml |
Container startet nach Crash oder Reboot automatisch neu |
Ablauf bei docker stop / Reboot:
- Docker sendet
SIGTERMan den Container http_server.pyfängt das Signal und ruftserver.server_close()auf- Port 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-mcp
Attachments & 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) | /opt/data/workspace/report.pdf |
/workspace/report.pdf |
| OpenCode (Host) | /home/masoud/.../workspace/report.pdf |
/workspace/report.pdf |
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 |
|---|---|---|---|
gws_calendar_list_events |
Calendar | READ | Events auflisten (Zeitraum, max. Anzahl) |
gws_calendar_create_event |
Calendar | CREATE | Termin erstellen mit Teilnehmern |
gws_calendar_update_event |
Calendar | UPDATE | Termin ändern |
gws_calendar_delete_event |
Calendar | DELETE | Termin löschen |
gws_gmail_list_messages |
Gmail | READ | E-Mail-IDs auflisten (Suchfilter) |
gws_gmail_get_message |
Gmail | READ | E-Mail-Inhalt + Body (includeBody=true, keine Truncation) |
gws_gmail_send_message |
Gmail | CREATE | E-Mail senden mit Anhängen (MIME) |
gws_gmail_delete_message |
Gmail | DELETE | E-Mail in Papierkorb verschieben |
gws_drive_list_files |
Drive | READ | Dateien/Ordner auflisten |
gws_drive_get_file |
Drive | READ | Datei-Metadaten abrufen |
gws_drive_create_file |
Drive | CREATE | Datei erstellen/hochladen |
gws_drive_update_file |
Drive | UPDATE | Datei ändern/ersetzen |
gws_drive_delete_file |
Drive | DELETE | Datei permanent löschen |
gws_drive_download_file |
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-mcp
systemd-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-mcp
Die 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-mcp
Tests
# Unit-Tests (ohne Auth, kein gws CLI nötig)
python3 -m pytest tests/test_gmail_body_truncation.py -v
# Integration-Tests (benötigen gws auth)
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 integration
Projektstruktur
Google_MCP/
├── src/
│ ├── server.py # MCP JSON-RPC Engine (CRUD + Attachments)
│ └── http_server.py # HTTP-Wrapper (Port 8777, SIGTERM-Handler)
├── tests/
│ ├── test_gmail_body_truncation.py # Unit-Tests: Body-Truncation (kein Limit)
│ ├── 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
└── .gitignore
Lizenz
MIT — siehe LICENSE
Установка Hermes Google Server
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/MAghadavoodi/HermesGoogleMCPFAQ
Hermes Google Server MCP бесплатный?
Да, Hermes Google Server MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Hermes Google Server?
Нет, Hermes Google Server работает без API-ключей и переменных окружения.
Hermes Google Server — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Hermes Google Server в Claude Desktop, Claude Code или Cursor?
Открой Hermes Google Server на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
Gmail
Read, send and search emails from Claude
автор: GoogleSlack
Send, search and summarize Slack messages
автор: SlackRunbear
No-code MCP client for team chat platforms, such as Slack, Microsoft Teams, and Discord.
Discord Server
A community discord server dedicated to MCP by [Frank Fiegel](https://github.com/punkpeye)
Compare Hermes Google Server with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории communication
