Ida-Google

Ida-Google

MCP server that integrates with multiple Google services, providing Claude with over 50 tools for managing tasks, contacts, calendar, Gmail, documents, spreadsheets, presentations, chat, and meetings.

Category
访问服务器

README

Ida-Google

Ein eigenständiger MCP-Server (Model Context Protocol) für Google-Dienste -- getrennt von Ida-Untis, Ida-Telegram und Ida-Memory, eigenes Repo, eigener Container. Gibt Claude 54 Werkzeuge für Google Tasks, Kontakte, Kalender, Gmail, Docs, Sheets, Slides, Chat und Meet, mit mehr Diensten in kommenden Ausbaustufen (siehe Fahrplan unten). Ziel ist, ueber die Zeit moeglichst alles abzudecken, was die jeweilige Google-API hergibt -- nicht nur eine kleine Grundauswahl.

Bewusst als ein einziger, einheitlicher Connector gebaut -- auch dort, wo es (z.B. für Kalender, Gmail-Lesen, Drive) schon offizielle claude.ai- Connectors gibt. Eine echte Ergänzung dazu: google_mail_senden kann tatsächlich senden, nicht nur lesen/entwerfen wie der offizielle Gmail-Connector.

Architektur: zwei Ports, zwei Vertrauenszonen

Google-Zugriff läuft über OAuth: einmalig im Browser bei Google anmelden und zustimmen, danach läuft alles automatisiert über einen gespeicherten Refresh-Token. Diese zwei Dinge -- der einmalige Browser-Anmelde-Flow und die laufenden, automatisierten API-Aufrufe -- laufen bewusst auf zwei getrennten Ports/Hostnamen mit unterschiedlichem Schutz:

Browser (nur du)                    Claude / eine Routine
      |                                     |
      v                                     v
auth.deine-domain.de              google.deine-domain.de
  (Cloudflare Zero Trust Access)     (normaler Cloudflare Tunnel)
      |                                     |
      v                                     v
127.0.0.1:4570 (Auth-Port)        127.0.0.1:4569 (MCP-Port)
  /authorize, /oauth/callback        /mcp (Bearer-Token)
      |                                     |
      +----------------+--------------------+
                        v
         Docker-Container "ida-google-mcp"
                        |
                        v
       /data/google_token.json (Docker-Volume)
  • Auth-Port (4570): nur für den (seltenen) Google-Anmelde-Flow. Diese Hostname-Route sollte zusätzlich hinter Cloudflare Zero Trust Access liegen (eigene Cloudflare-Funktion, verlangt einen Login -- z.B. per E-Mail-Code -- bevor die Anfrage überhaupt beim Server ankommt), damit wirklich nur du diesen Flow je starten kannst. Ein zweites, kostenloses Sicherheitsnetz (AUTH_TOKEN als ?token=) ist zusätzlich eingebaut, ersetzt Zero Trust Access aber nicht.
  • MCP-Port (4569): die eigentlichen Google-Werkzeuge, ganz normal per Bearer-Token abgesichert wie bei den anderen drei Ida-*-Projekten -- läuft dauerhaft, keine Browser-Interaktion nötig.

Beide Ports laufen im selben Container/Prozess (app/main.py) und teilen sich denselben gespeicherten Refresh-Token.

Voraussetzungen

  • Docker + Docker Compose auf dem Server
  • Ein bereits eingerichteter und verbundener Cloudflare Tunnel
  • Cloudflare Zero Trust (kostenlos bis 50 Nutzer) für den Auth-Port
  • Ein Google-Cloud-Projekt mit OAuth-Client (Anleitung in .env.example)

1. Google Cloud Console einrichten

Ausführliche Schritt-für-Schritt-Anleitung steht direkt in .env.example (OAuth-Zustimmungsbildschirm, benötigte APIs aktivieren, OAuth-Client anlegen). Kurzfassung: neues Projekt -> Zustimmungsbildschirm (extern, dich selbst als Testnutzer) -> benötigte APIs aktivieren (aktuell: Google Tasks API, People API, Google Calendar API, Gmail API, Google Keep API, Google Docs API, Google Sheets API, Google Slides API, Google Chat API, Google Meet API) -> OAuth-Client vom Typ "Webanwendung" mit der Redirect-URI https://auth.deine-domain.de/oauth/callback.

Nach jedem Update, das neue Google-Dienste oder zusätzliche Berechtigungen für bestehende Dienste hinzufügt: einmal erneut /authorize?token=... aufrufen, damit auch den neuen/erweiterten Scopes zugestimmt wird -- sonst melden betroffene Tools "insufficient authentication scopes". Bereits funktionierende Tools sind davon nicht betroffen.

2. Einrichten, bauen, starten

git clone https://github.com/<dein-user>/Ida-Google.git
cd Ida-Google
cp .env.example .env

.env ausfüllen (siehe Kommentare darin). Image bauen lassen: Bei jedem Push auf main baut .github/workflows/docker-publish.yml automatisch nach ghcr.io/<dein-user>/ida-google:latest. Einmalig auf öffentlich stellen (GitHub -> Profil -> Packages -> ida-google -> Package settings -> Change visibility -> Public).

docker compose pull
docker compose up -d
docker compose logs -f

3. An den bestehenden Cloudflare Tunnel anbinden -- zwei Hostnamen

ingress:
  - hostname: google.deine-domain.de
    service: http://localhost:4569
  - hostname: auth.deine-domain.de
    service: http://localhost:4570
  - service: http_status:404

Danach in Cloudflare Zero Trust (dash.teams.cloudflare.com) -> Access -> Applications -> "Add an application" -> Self-hosted -> Domain auth.deine-domain.de -> eine Policy, die nur deine eigene E-Mail-Adresse zulässt. Ab dann verlangt Cloudflare selbst einen Login, bevor /authorize überhaupt erreichbar ist. google.deine-domain.de (der MCP-Port) braucht diese Policy nicht -- der ist ganz normal per Bearer-Token abgesichert und soll ja von Claude/Routinen erreichbar bleiben.

4. Einmalig mit Google verbinden

Im Browser aufrufen (löst den Login bei Cloudflare Access aus, falls konfiguriert):

https://auth.deine-domain.de/authorize?token=<AUTH_TOKEN>

Google-Consent-Screen bestätigen ("Nicht verifiziert" ist normal für eine private App wie diese). Danach zeigt die Seite "Erfolgreich mit Google verbunden".

5. Als claude.ai Connector hinzufügen

claude.ai -> Einstellungen -> Connectors -> Add custom connector -> als URL:

https://google.deine-domain.de/mcp?token=<MCP_AUTH_TOKEN>

Verfügbare MCP-Tools (55)

Vollständige Parameter/Docstrings direkt im Code (app/services/*.py) -- hier nur eine Übersicht nach Dienst gruppiert.

Dienst Tools Kann u.a.
Verbindung google_verbindung_status Prüft, ob überhaupt mit Google verbunden
Tasks 5 Listen/Aufgaben lesen, anlegen, erledigt markieren, löschen
Kontakte 5 Lesen, anlegen, bearbeiten, löschen
Kalender 4 Termine lesen/anlegen/ändern/löschen, Teilnehmer einladen (echte Google-Einladungsmail)
Gmail 14 Suchen, lesen, senden mit CC/BCC/Anhängen/wählbarem Absender, im Thread antworten, Anhänge herunterladen (Bilder als echtes Bild), Labels lesen/erstellen/anwenden/entfernen, Entwürfe anlegen/lesen/senden, in den Papierkorb verschieben, konfigurierte "Senden als"-Adressen auflisten
Docs 7 Anlegen, lesen, Text anhängen/an Position einfügen/löschen, Suchen & Ersetzen, Fett/Kursiv/Unterstrichen
Sheets 8 Anlegen, Bereich lesen/schreiben/anhängen/leeren, Tabellenblatt anlegen/umbenennen/löschen
Slides 5 Anlegen, lesen, Titel+Text-Folie hinzufügen/löschen/verschieben
Chat 4 Räume auflisten, Raum erstellen, Nachricht senden, Nachrichten lesen
Meet 2 Meeting-Raum anlegen (Beitritts-Link), Details abrufen

Google-Fehler (fehlender Scope, abgelaufene Berechtigung, API nicht aktiviert, ...) kommen 1:1 mit Googles eigener Fehlermeldung zurück, statt geraten zu werden.

Mail über eine andere Absenderadresse schicken

Wer bei Gmail mehrere "Senden als"-Adressen eingerichtet hat (Gmail -> Einstellungen -> Konten -> "Senden als"), kann den optionalen Parameter von bei google_mail_senden/google_mail_antworten/ google_mail_entwurf_erstellen nutzen, um eine dieser Adressen statt der Hauptadresse zu verwenden. google_mail_absender_liste zeigt, welche Adressen konfiguriert und verifiziert sind -- nur verifizierte Adressen funktionieren tatsächlich, alles andere ignoriert Gmail und nimmt automatisch die Hauptadresse. Neue "Senden als"-Adressen selbst einrichten geht weiterhin nur direkt in den Gmail-Einstellungen, nicht über dieses Tool.

Bestätigungspflicht beim Löschen

Jedes Tool, das Daten unwiderruflich entfernt (Name endet auf _loeschen, dazu google_mail_papierkorb und google_sheet_bereich_leeren), hat einen Parameter bestaetigt (Standard False). Ohne bestaetigt=True passiert technisch nichts -- das Tool gibt nur einen Hinweis zurück, was gelöscht würde. Claude ist angewiesen, immer erst im Chat nachzufragen und dann mit bestaetigt=True zu wiederholen. Das ist codeseitig erzwungen, nicht nur eine Anweisung, der die KI folgen könnte oder auch nicht.

Ausnahme: google_termin_loeschen (Kalender-Termine). Der hat gar keinen bestaetigt-Parameter und löscht sofort -- ausdrücklich so gewünscht, damit Terminänderungen schnell gehen.

Mail-/Chat-Versand (google_mail_senden, google_mail_antworten, google_mail_entwurf_senden, google_chat_nachricht_senden) hat keinen codeseitigen Schutz (das würde bedeuten, doppelt aufrufen zu müssen, nur um einmal zu senden) -- dafür weisen die Server-instructions Claude an, den Inhalt vor dem Senden im Chat zu bestätigen.

Fahrplan

Ziel ist moeglichst vollstaendige Abdeckung jeder angebundenen API, nicht nur eine Grundauswahl -- wird schrittweise erweitert, mit jeweils eigener Testrunde. Bekannte, noch offene Lücken:

  • Gmail: Filter/Regeln verwalten, mehrere Anhänge pro Downloadaufruf.
  • Docs: Bilder, Tabellen, Kommentare/Vorschläge, Aufzählungslisten.
  • Sheets: Zellformatierung (Farben/Schrift), Diagramme, Sortieren/Filtern, Pivot-Tabellen.
  • Slides: freies Layout (Bilder, Positionierung, eigene Designs statt nur Titel+Text).
  • Kontakte: Kontaktgruppen, Volltextsuche über searchContacts.
  • Meet: Teilnehmerlisten, Aufzeichnungen/Transkripte (conferenceRecords).
  • Neue Dienste: YouTube, Apps Script.

Google Keep ist deaktiviert (Code liegt in app/services/notes.py, aber nicht in _SERVICE_MODULES eingehängt): Googles eigene Doku beschreibt die Keep API als für Unternehmensumgebungen gedacht, und ein echter Authorize-Versuch mit einem privaten Google-Konto wurde von Google mit invalid_scope abgelehnt. Kommt zurück, falls sich das mal ändert (z.B. mit einem Workspace-Konto).

Danach die weiteren eingeschränkten Dienste, wenn das jeweils zutrifft: Google Ads (braucht einen von Google genehmigten Developer-Token), Workspace Admin SDK (braucht ein bezahltes Workspace-Konto mit Admin-Rechten), Classroom (braucht echte Classroom-Nutzung), Google Photos (seit einer Google-Richtlinienänderung eingeschränkter Lesezugriff für nicht verifizierte Apps).

Ob Chat und Meet mit einem normalen privaten Google-Konto (statt einem bezahlten Workspace-Konto) vollständig funktionieren, ließ sich nicht vorab zweifelsfrei klären -- das zeigt sich beim ersten echten Aufruf über Googles eigene Fehlermeldung, statt hier geraten zu werden.

Lokal testen ohne Cloudflare

docker compose up -d
curl "http://127.0.0.1:4570/healthz"
curl -H "Authorization: Bearer $MCP_AUTH_TOKEN" http://127.0.0.1:4569/healthz

Troubleshooting

  • Container startet nicht: docker compose logs -- meist fehlt eine Pflichtvariable in .env (GOOGLE_CLIENT_ID/_SECRET/GOOGLE_REDIRECT_URI).
  • Tool meldet "Noch nicht mit Google verbunden": Schritt 4 (einmaliger Anmelde-Flow) noch nicht gemacht, oder der Container wurde ohne das /data-Volume neu gestartet (docker compose down -v löscht auch den gespeicherten Token -- ohne -v starten).
  • "Google hat keinen Refresh-Token geliefert": Google gibt nur beim ersten Zustimmen (oder mit prompt=consent, was hier immer gesetzt ist) einen Refresh-Token zurück. Falls es trotzdem passiert: unter myaccount.google.com/permissions den Zugriff dieser App entfernen und /authorize erneut aufrufen.
  • Google-API-Fehler "insufficient authentication scopes" o.ä.: Nach einem Update, das neue/erweiterte Berechtigungen braucht, muss /authorize erneut aufgerufen werden, damit die neuen Scopes mit zugestimmt werden.
  • Google-API-Fehler "invalid_scope" beim Aufrufen von /authorize: einer der angeforderten Scopes lässt sich für diesen Google-Account/dieses Cloud-Projekt nicht vergeben (z.B. Keep, siehe Fahrplan) -- betrifft dann die komplette Anmeldung, da alle Scopes zusammen angefragt werden. In app/server.py das entsprechende Modul aus _SERVICE_MODULES entfernen.
  • Lösch-Tool antwortet nur mit einem Hinweis, löscht aber nichts: so gewollt -- erst mit bestaetigt=True erneut aufrufen (siehe Bestätigungspflicht beim Löschen).
  • Claude/eine KI bekommt 401 auf dem MCP-Port: Token in Client-Konfiguration und .env vergleichen.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选