Skip to main content
Glama
dipseth

google-workspace-unlimited

🚀 GoogleUnlimited Google Workspace Plattform

docs pypi license privacy terms

google_workspace_fastmcp2 MCP server

GoogleUnlimited ist ein umfassendes MCP-Framework, das eine nahtlose Google Workspace-Integration durch eine fortschrittliche Middleware-Architektur bietet. Es ermöglicht KI-Assistenten und MCP-Clients, mit Gmail, Google Drive, Docs, Sheets, Slides, Calendar, Forms, Chat, Photos und Contacts (People API) über eine einheitliche, sichere API zu interagieren.

Was es auszeichnet:

  • ⚡ Code Mode standardmäßig – statt Ihren Client mit über 90 Tool-Schemas zu überfluten, stellt der Server 7 schlanke Meta-Tools bereit; die KI entdeckt Tools bei Bedarf und verkettet echte API-Aufrufe in einem einzigen Sandbox-execute-Block.

  • 🚀 Start ohne Konfiguration – der Server läuft sofort ohne .env-Datei; OAuth erfolgt erst bei der ersten Nutzung.

  • 🔧 Tool-Steuerung pro Sitzung – URL-basierte Dienstfilterung und sitzungsbezogenes Aktivieren/Deaktivieren, sodass jeder verbundene Client genau die Tools sieht, die er benötigt.

  • 🎨 Template- und Karten-DSL-System – Jinja2-Makros und eine kompakte Kartenschreibweise verwandeln rohe API-Daten in reichhaltige E-Mails, Dashboards und Google-Chat-Karten.

  • 🧠 Semantisches Gedächtnis – jede Tool-Antwort wird in Qdrant eingebettet und später mit natürlicher Sprache durchsuchbar.

📋 Inhaltsverzeichnis

Related MCP server: mcp-google-workspace

⚡ Schnellinstallationsanleitung

Was ist GoogleUnlimited?

GoogleUnlimited bietet KI-Assistenten Zugriff auf Google Workspace-Dienste über das Model Context Protocol (MCP). Es unterstützt 92+ Tools in 9 Google-Diensten und ermöglicht eine nahtlose Integration zwischen KI-Workflows und Google Workspace-Anwendungen mit revolutionären Leistungsverbesserungen.

🛠️ Installationsmethoden

Methode 1: Schnellinstallation über uvx (Empfohlen)

Der schnellste Weg, um loszulegen – direkt von PyPI installieren:

{
  "mcpServers": {
    "google-workspace-unlimited": {
      "command": "uvx",
      "args": ["google-workspace-unlimited"],
      "disabled": false,
      "timeout": 300
    }
  }
}

⚡ Das war's! Der Server läuft standardmäßig im Stdio-Modus, perfekt für MCP-Clients wie Claude Desktop, Cursor, Roo usw. Code-Modus ist standardmäßig aktiviert, sodass Ihr Client 7 schlanke Meta-Tools anstelle von über 90 Schemas sieht.

Methode 1b: Claude Code Plugin (Server + Fähigkeiten)

Claude Code-Benutzer können den Server und die Fähigkeiten installieren, die Claude seine Karten-/E-Mail-DSL, den Code-Modus und die Qdrant-Suche in zwei Befehlen beibringen:

/plugin marketplace add dipseth/google_workspace_fastmcp2
/plugin install google-workspace-unlimited@riversunlimited

Siehe plugins/google-workspace-unlimited für Details.

Methode 2: Klonen und Entwicklungseinrichtung

Für Entwicklung oder Anpassung:

  1. Klonen und einrichten:

    git clone https://github.com/dipseth/google_workspace_fastmcp2.git
    cd google_workspace_fastmcp2
    uv sync
  2. Server starten:

    uv run python server.py

    Der Server startet sofort mit keiner erforderlichen Konfiguration. OAuth-Anmeldeinformationen werden beim Start nicht benötigt – die Authentifizierung erfolgt erst, wenn Sie zum ersten Mal mit einem Google-Dienst interagieren.

  3. Authentifizieren, wenn bereit:

    Wenn Sie ein Google Workspace-Tool aufrufen, fordert der Server Sie auf, sich über das Tool start_google_auth zu authentifizieren. Dadurch wird ein browserbasierter OAuth-Ablauf geöffnet. Nach Abschluss werden die Anmeldeinformationen lokal gespeichert und über Sitzungen hinweg wiederverwendet.

    Um OAuth-Anmeldeinformationen vorzukonfigurieren (optional), erstellen Sie eine .env-Datei:

    cp .env.example .env

    Fügen Sie dann Ihre Google Cloud Console-Anmeldeinformationen hinzu:

    # Option A: Client ID + Secret
    GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
    GOOGLE_CLIENT_SECRET=your-client-secret
    
    # Option B: Downloaded JSON credentials file
    GOOGLE_CLIENT_SECRETS_FILE=credentials.json

    Siehe die Google Cloud Console-Einrichtungsschritte zum Erstellen von OAuth-Anmeldeinformationen und Aktivieren von APIs.

📚 Konfigurationsressourcen:

📋 Referenz der Umgebungsvariablen

Alle Umgebungsvariablen sind optional – der Server startet mit sinnvollen Standardwerten und ohne erforderliche .env-Datei. OAuth-Anmeldeinformationen werden nur benötigt, wenn Sie einen neuen Authentifizierungsablauf über start_google_auth starten.

Google OAuth (für die erstmalige Authentifizierung erforderlich):

Variable

Default

Description

GOOGLE_CLIENT_ID

(empty)

OAuth-2.0-Client-ID aus der Google Cloud Console

GOOGLE_CLIENT_SECRET

(empty)

OAuth-2.0-Client-Geheimnis

GOOGLE_CLIENT_SECRETS_FILE

(empty)

Alternative: Pfad zur heruntergeladenen OAuth-JSON-Datei

OAUTH_REDIRECT_URI

http://localhost:8002/oauth2callback

Muss mit der Weiterleitungs-URI der Google Console übereinstimmen

Geben Sie entweder GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET oder GOOGLE_CLIENT_SECRETS_FILE vor Ihrem ersten OAuth-Ablauf an. Nach der Authentifizierung werden die Anmeldeinformationen lokal gespeichert und diese Variablen werden nicht mehr benötigt.

Server:

Variable

Default

Description

SERVER_HOST

localhost

Server-Bindungsadresse

SERVER_PORT

8002

Server-Port

ENABLE_HTTPS

false

HTTPS/SSL aktivieren

SSL_CERT_FILE

-

Pfad zum SSL-Zertifikat (erforderlich, wenn HTTPS aktiviert ist)

SSL_KEY_FILE

-

Pfad zum SSL-privaten Schlüssel (erforderlich, wenn HTTPS aktiviert ist)

LOG_LEVEL

INFO

DEBUG, INFO, WARNING, ERROR

Sicherheit & Sitzungen:

Variable

Default

Description

CREDENTIAL_STORAGE_MODE

FILE_ENCRYPTED

FILE_ENCRYPTED, FILE_PLAINTEXT, MEMORY_ONLY

CREDENTIALS_DIR

./credentials

Verzeichnis für gespeicherte Anmeldeinformationen

MCP_API_KEY

(empty)

Server-API-Schlüssel – wird auch für kryptografisch gebundene Anmeldeinformationsverschlüsselung (HKDF-SHA256) und die Generierung benutzerspezifischer Schlüssel verwendet

SESSION_TIMEOUT_MINUTES

60

Sitzungs-Timeout bei Inaktivität

GMAIL_ALLOW_LIST

(empty)

Durch Kommas getrennte vertrauenswürdige E-Mail-Adressen

Tool-Verwaltung:

Variable

Default

Description

MINIMAL_TOOLS_STARTUP

true

Nur mit 5 geschützten aktivierten Tools starten

MINIMAL_STARTUP_SERVICES

(empty)

Durch Kommas getrennte Dienste, die beim Start aktiviert werden sollen (z. B. drive,gmail)

ENABLE_CODE_MODE

true

Code-Modus (Standard) – ersetzt den vollständigen Tool-Katalog durch 7 Meta-Tools + Sandbox-execute; setzen Sie false für den klassischen Katalog

ENABLE_SKILLS_PROVIDER

false

FastMCP SkillsDirectoryProvider für dynamische Fähigkeitengenerierung aktivieren

SKILLS_DIRECTORY

~/.claude/skills

Verzeichnis für generierte Fähigkeitendokumente

RESPONSE_LIMIT_MAX_SIZE

500000

Maximale Tool-Antwortgröße in Bytes (0 = deaktiviert)

RESPONSE_LIMIT_TOOLS

(empty)

Durch Kommas getrennte Tool-Namen, die begrenzt werden sollen (leer = alle)

Qdrant-Vektordatenbank:

Variable

Default

Description

QDRANT_URL

http://localhost:6333

Qdrant-Vektordatenbank-URL

QDRANT_KEY

NONE

Qdrant-API-Schlüssel (verwenden Sie NONE für keine Authentifizierung)

QDRANT_AUTO_LAUNCH

true

Qdrant automatisch über Docker starten, wenn nicht erreichbar

QDRANT_DOCKER_IMAGE

qdrant/qdrant:latest

Docker-Image für den automatischen Start

QDRANT_DOCKER_CONTAINER_NAME

mcp-qdrant

Container-Name für automatisch gestartetes Qdrant

Sonstiges:

Variable

Default

Description

MCP_CHAT_WEBHOOK

(empty)

Standard-Webhook-URL für Google-Chat-Karten-Tools

FASTMCP_CLOUD

false

Cloud-Bereitstellungsmodus aktivieren (wechselt automatisch zu MEMORY_WITH_BACKUP-Speicher)

🔗 Client-Verbindungen

GoogleUnlimited unterstützt mehrere Verbindungsmethoden. Hier sind die zwei beliebtesten Möglichkeiten, um loszulegen:

🎯 Schnellstart-Optionen

Option 1: Cursor IDE (STDIO - Community-verifiziert ✅):

{
  "mcpServers": {
    "google-workspace": {
      "command": "uv",
      "args": [
        "--directory", "/path/to/google_workspace_fastmcp2",
        "run", "python", "server.py"
      ],
      "env": {
        "GOOGLE_CLIENT_SECRETS_FILE": "/path/to/client_secrets.json",
        "MCP_TRANSPORT": "stdio"
      }
    }
  }
}

Option 2: HTTP Streamable (VS Code Roo, Claude Code, Claude Desktop, etc.):

# Start server in HTTP mode
uv run python server.py --transport http --port 8002

Einfache Einzelverbindungskonfiguration:

{
  "google-workspace": {
    "type": "streamable-http",
    "url": "https://localhost:8002/mcp",
    "disabled": false
  }
}

Multi-Verbindungs-Setup – verbinden Sie denselben Client (oder mehrere Clients) mit demselben Server und verschiedenen Tool-Sets mithilfe von URL-Abfrageparametern:

{
  "google-email": {
    "type": "streamable-http",
    "url": "https://localhost:8002/mcp?service=gmail"
  },
  "google-chat": {
    "type": "streamable-http",
    "url": "https://localhost:8002/mcp?service=chat"
  },
  "google-productivity": {
    "type": "streamable-http",
    "url": "https://localhost:8002/mcp?service=drive,docs,sheets,slides"
  }
}

Jede Verbindung erhält ihre eigene isolierte Sitzung, in der nur die angeforderten Service-Tools aktiviert sind. Sie können eine Sitzungs-ID außerdem mit ?uuid= festlegen, um denselben Sitzungszustand über Wiederverbindungen hinweg fortzusetzen:

{
  "google-workspace": {
    "type": "streamable-http",
    "url": "https://localhost:8002/mcp?uuid=my-workspace&service=gmail,drive,calendar"
  }
}

Siehe URL-basierte Service-Filterung für die vollständige Liste der Abfrageparameter.

🤖 Claude Code & Claude Desktop

Claude Code (CLI) – ein einziger Befehl, mit dem veröffentlichten PyPI-Paket:

# Local stdio (recommended): uvx fetches and runs the server on demand
claude mcp add google-workspace -- uvx google-workspace-unlimited

# Or connect to an already-running HTTP server
claude mcp add --transport http google-workspace https://localhost:8002/mcp

Claude Desktop (lokaler Entwicklungspfad) – fügen Sie Folgendes zu claude_desktop_config.json hinzu (Einstellungen → Entwickler → Konfiguration bearbeiten):

{
  "mcpServers": {
    "google-workspace-unlimited": {
      "command": "uvx",
      "args": ["google-workspace-unlimited"]
    }
  }
}

Claude.ai / Claude Desktop (gehosteter Connector) – führen Sie den Server hinter einem öffentlichen HTTPS-Endpunkt aus (z. B. einem Cloudflare- oder ngrok-Tunnel) und fügen Sie ihn dann unter Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen mit Ihrer https://your-domain/mcp-URL hinzu. Der OAuth-2.1- und PKCE-Ablauf des Servers übernimmt die Authentifizierung, einschließlich der Weiterleitung an https://claude.ai/api/mcp/auth_callback. Siehe die Claude.ai-Integrationsanleitung für die vollständige Schritt-für-Schritt-Anleitung.

📚 Vollständiger Verbindungsleitfaden

Detaillierte Einrichtungsanleitungen, Fehlerbehebung und Konfigurationen für alle unterstützten Clients, einschließlich:

  • Claude Code CLI (HTTP & STDIO)

  • Claude Desktop

  • VS Code / Roo / GitHub Copilot

  • Claude.ai mit Cloudflare-Tunnel

  • Und weitere ...

🔗 Vollständiger Client-Verbindungsleitfaden – Umfassende Einrichtungsanleitungen, Fehlerbehebung und erweiterte Konfigurationen für alle unterstützten KI-Clients und Entwicklungsumgebungen

⚡ Code-Modus (Standard)

Der Code-Modus ist das Flaggschiff-Feature von GoogleUnlimited – und er ist standardmäßig aktiviert. Statt 90+ Tool-Schemas im Voraus zu laden (teuer in Bezug auf Tokens), sieht Ihr MCP-Client nur 7 Meta-Tools. Die KI entdeckt Tools bei Bedarf und verknüpft dann beliebig viele echte API-Aufrufe innerhalb eines einzigen isolierten Python-execute-Blocks.

Meta-Tool

Zweck

tags

Tools nach Servicekategorie durchsuchen (Gmail, Drive, Kalender usw.)

search

BM25-gestützte Schlüsselwortsuche über Tool-Namen und -Beschreibungen

get_schema

Vollständige Parameterschemas für ausgewählte Tools abrufen

semantic_search

Natürlichsprachliche Suche über zuvor gespeicherte Tool-Antworten (Qdrant-gestützt)

fetch_document

Eine vollständige gespeicherte Antwort anhand der Point-ID aus den Suchergebnissen abrufen

tool_activity

Aktuelle Tool-Nutzungsmuster und -Aktivitäten zusammenfassen

execute

Einen isolierten Python-Block ausführen, der echte Tool-Aufrufe über await call_tool(name, params) verknüpft

Warum das wichtig ist:

  • 💰 Massive Token-Ersparnis – 7 Schemas statt 90+, wobei vollständige Schemas nur für die tatsächlich verwendeten Tools abgerufen werden

  • 🔗 Ein Round-Trip statt vieler – Suche → Filtern → Handeln erfolgt in einem einzigen execute-Block, nicht in einer Kette von Client-Round-Trips

  • 🧰 Komplett ausgestattete Sandbox – 40+ eingebaute Helfer (now(), days_ago(), to_json(), re_find(), gather_tools(), …) decken Datumsangaben, JSON, URLs, Regex, Mathematik und Batch-Aufrufe ab, ganz ohne Importe

# One execute block: find a Drive file, then email its link
files = await call_tool("search_drive_files", {"query": "Q4 report"})
link = files["files"][0]["webViewLink"]
result = await call_tool("send_gmail_message", {
    "to": "manager@company.com",
    "subject": "Q4 Report",
    "body": "Here's the Q4 report: " + link,
})
return result

Klassischen Katalog bevorzugt? Deaktivieren Sie den Code-Modus, und jedes Tool wird direkt für den Client bereitgestellt:

ENABLE_CODE_MODE=false   # expose the full 90+ tool catalog instead

Code-Modus und klassischer Katalog schließen sich gegenseitig aus – wenn der Code-Modus aktiv ist, werden direkte Tool-Aufrufe durch das Such- + execute-Muster ersetzt. Discovery-Tools sehen immer den vollständigen Katalog, unabhängig von der Filterung auf Sitzungsebene.

🎯 Service-Funktionen

GoogleUnlimited unterstützt 10 Google-Workspace-Dienste mit 90+ spezialisierten Tools:

Service

Icon

Tools

Hauptfunktionen

Dokumentation

Gmail

📧

14

Senden, Antworten, Labels, Filter, Suche, Allowlist

api-reference/gmail/

Drive

📁

9

Hochladen, Herunterladen, Freigabe, Office-Dokumente, Dateiverwaltung

api-reference/drive/

Docs

📄

4

Erstellen, Bearbeiten, Formatieren, Batch-Operationen

api-reference/docs/

Sheets

📊

7

Lesen, Schreiben, Formeln, Formatierung

api-reference/sheets/

Slides

🎯

5

Präsentationen, Vorlagen, Export

api-reference/slides/

Calendar

📅

9

Ereignisse, Terminplanung, Teilnehmer, Zeitzonen

api-reference/calendar/

Forms

📝

8

Erstellung, Antworten, Validierung, Veröffentlichung

api-reference/forms/

Chat

💬

24

Messaging, Karten, Spaces, Webhooks, Unified Cards

api-reference/chat/

Photos

📷

12

Alben, Hochladen, Suche, Metadaten, intelligente Suche

api-reference/photos/

People

👤

4

Name→E-Mail-Suche (Kontakte + Organisationsverzeichnis), Kontaktlabels

people/

📚 Ressourcen zur API-Dokumentation:

🧠 Middleware-Architektur

GoogleUnlimited verwendet eine Middleware-Architektur, die eine nahtlose Service-Integration, intelligente Ressourcenverwaltung und leistungsstarke Templating-Funktionen bietet.

Middleware-Architektur

🔧 Kernkomponenten der Middleware

  • 🏷️ TagBasedResourceMiddleware: Intelligente Ressourcenermittlung mithilfe von URI-Mustern (service://gmail/messages, user://current/email)

  • 🧠 QdrantUnifiedMiddleware: KI-gestützte semantische Suche über alle Tool-Antworten mit Vektor-Embeddings

  • 🎨 TemplateMiddleware: Fortschrittliches Jinja2-Templatesystem für eine schöne, strukturierte Ausgabeformatierung

✨ Vorteile der Architektur

  • 🔄 Einheitlicher Ressourcenzugriff: URI-basierter Zugriff auf Servicedaten ohne API-Aufrufe

  • 🧠 Semantische Intelligenz: Suche in natürlicher Sprache über alle gespeicherten Antworten

  • 🎨 Visuelle Exzellenz: Konsistente, schöne Ausgabeformatierung für eine optimale KI-Verarbeitung

  • 💰 Token-Effizienz: Vorlagen-Makros reduzieren den Token-Verbrauch um 60–80 % durch strukturierte Datenausgabe

  • ⚡ Leistung: 30-mal schneller als herkömmliche Ansätze durch intelligentes Caching

📚 Ressourcen zur Middleware-Dokumentation:

🚀 Minimaler Tool-Start

Standardmäßig startet GoogleUnlimited mit nur 5 aktivierten geschützten Tools für optimale Leistung und Sicherheit. Clients können so nur die Tools aktivieren, die sie tatsächlich benötigen.

Geschützte Tools (immer verfügbar):

  • manage_tools – Tools global oder pro Sitzung aktivieren/deaktivieren

  • manage_tools_by_analytics – Analytikbasierte Tool-Verwaltung

  • health_check – Serverzustand und Konfigurationsstatus

  • start_google_auth – OAuth-Authentifizierung starten

  • check_drive_auth – Authentifizierungsstatus überprüfen

Konfiguration:

# Default: Start with minimal tools (only 5 protected tools)
MINIMAL_TOOLS_STARTUP=true

# Optional: Pre-enable specific services at startup
MINIMAL_STARTUP_SERVICES=drive,gmail,calendar

# Disable minimal startup (enable all 92+ tools immediately)
MINIMAL_TOOLS_STARTUP=false

Aktivieren von Tools zur Laufzeit:

# Enable all tools globally
manage_tools(action="enable_all")

# Enable specific tools
manage_tools(action="enable", tool_names=["search_drive_files", "list_gmail_labels"])

# List all registered tools (shows enabled/disabled status)
manage_tools(action="list")

🔧 Sitzungsbezogene Tool-Verwaltung

GoogleUnlimited unterstützt die sitzungsweise Aktivierung/Deaktivierung von Tools, sodass verschiedene MCP-Clients unterschiedliche Tool-Verfügbarkeiten haben können, ohne andere verbundene Clients zu beeinträchtigen.

Hauptfunktionen:

  • Sitzungsisolation: Tools für eine Client-Sitzung deaktivieren, ohne andere zu beeinträchtigen

  • Nicht-invasiv: Sitzungsbezogene Operationen ändern niemals die globale Tool-Registrierung

  • Geschützte Tools: Zentrale Verwaltungstools (manage_tools, health_check usw.) bleiben immer verfügbar

  • Middleware-basiert: Verwendet SessionToolFilteringMiddleware für Filterung auf Protokollebene

Nutzungsbeispiele:

# Disable tools for this session only (other clients unaffected)
manage_tools(action="disable", tool_names=["send_gmail_message"], scope="session")

# Disable all except specific tools for this session
manage_tools(action="disable_all_except", tool_names=["search_drive_files", "list_events"], scope="session")

# Re-enable all tools for this session
manage_tools(action="enable_all", scope="session")

# Global operations (original behavior, affects all clients)
manage_tools(action="disable", tool_names=["send_gmail_message"], scope="global")

Antwortstruktur:

{
  "success": true,
  "action": "disable_all_except",
  "scope": "session",
  "enabledCount": 94,
  "disabledCount": 0,
  "toolsAffected": ["tool1", "tool2", "..."],
  "sessionState": {
    "sessionId": "f725be09...",
    "sessionAvailable": true,
    "sessionDisabledTools": ["tool1", "tool2"],
    "sessionDisabledCount": 89
  },
  "message": "Kept 5 tools, disabled 89 tools for this session"
}

📚 Skills-Anbieter

Wenn dies über ENABLE_SKILLS_PROVIDER=true aktiviert wird, generiert GoogleUnlimited Skill-Dokumente aus ModuleWrapper-Instanzen und stellt sie über FastMCPs SkillsDirectoryProvider bereit. Skills bieten strukturiertes Wissen, auf das LLMs bei komplexen mehrstufigen Aufgaben zurückgreifen können.

Derzeit unterstützte Module:

  • card_framework → gchat-cards-Skill (Google-Chat-Karten-DSL-Referenz, Komponentenhierarchie, Beispiele)

Konfiguration:

ENABLE_SKILLS_PROVIDER=true     # Enable skill generation
SKILLS_DIRECTORY=~/.claude/skills  # Output directory (default)

Skills werden bei jedem Start automatisch neu generiert und sind über das FastMCP-Skillsystem sofort verfügbar.

🖥️ Tool-Verwaltungs-Dashboard

GoogleUnlimited enthält ein integriertes Tool-Verwaltungs-Dashboard, das über das ui://-Ressourcenschema der MCP-Apps bereitgestellt wird. Es bietet eine visuelle Oberfläche zur Überwachung und Verwaltung der Tool-Verfügbarkeit über Sitzungen hinweg.

Tool-Verwaltungs-Dashboard

Funktionen:

  • Nach Diensten gruppierte Tool-Ansicht – Tools, organisiert nach Google-Dienst (Gmail, Drive, Sheets usw.), mit Zählern

  • Sitzungsstatus auf einen Blick – Erkennen Sie auf einen Blick, welche Tools aktiviert, deaktiviert oder sitzungsbezogen deaktiviert sind

  • Filter-Chips – Schnelles Filtern nach Dienst, um sich auf relevante Tools zu konzentrieren

  • Live-Daten – Unterstützt durch DashboardCacheMiddleware, die List-Tool-Ergebnisse zwischenspeichert, um sofortigen Zugriff auf die Ressource ui://data-dashboard zu ermöglichen

Das Dashboard wird automatisch über wire_dashboard_to_list_tools() mit allen List-Tools verbunden – keine Konfiguration pro Tool erforderlich.

🔗 URL-basierte Service-Filterung (HTTP-Transport)

Wenn Sie den HTTP/SSE-Transport verwenden, können Sie Tools direkt über URL-Abfrageparameter nach Dienst filtern – ganz ohne Code:

# Enable only Gmail tools
http://localhost:8002/mcp?service=gmail

# Enable Gmail + Drive + Calendar
http://localhost:8002/mcp?service=gmail,drive,calendar

# Resume a previous session
http://localhost:8002/mcp?uuid=your-session-id

# Resume session with specific services
http://localhost:8002/mcp?uuid=abc123&service=gmail,drive

# Disable minimal startup (enable all tools)
http://localhost:8002/mcp?minimal=false

Verfügbare URL-Parameter:

Parameter

Beispiel

Beschreibung

service oder services

?service=gmail,drive

Kommagetrennte Liste der zu aktivierenden Dienste

uuid

?uuid=abc123

Vorherige Sitzung per ID fortsetzen

minimal

?minimal=false

Minimalen Startmodus überschreiben

Verfügbare Dienste: gmail, drive, calendar, docs, sheets, slides, photos, chat, forms, people

📚 Ressourcen zur Sitzungs-Tool-Verwaltung:

🎨 Vorlagensystem

GoogleUnlimited verfügt über leistungsstarke Jinja2-Vorlagenmakros, die rohe Google-Workspace-Daten in optisch ansprechende, KI-optimierte Formate umwandeln.

🎯 Verfügbare Vorlagenmakros

Vorlagendatei

Makro

Zweck

Hauptfunktionen

email_card.j2

render_gmail_labels_chips()

Gmail-Label-Visualisierung

Interaktive Chips, ungelesene Zähler, direkte Gmail-Links

calendar_dashboard.j2

render_calendar_dashboard()

Kalender- & Ereignis-Dashboard

Primäre/freigegebene Kalender, anstehende Ereignisse, dunkles Theme

dynamic_macro.j2

render_calendar_events_dashboard()

Kalenderereignis-Dashboard

Ereigniskarten, Zeit-/Ortsdetails, klickbare Links, dunkles Theme

document_templates.j2

generate_report_doc()

Professionelle Berichte

Metriken, Tabellen, Diagramme, Unternehmensbranding

colorfuL_email.j2

render_beautiful_email3()

Rich-HTML-E-Mails

Mehrere Signaturen, Verläufe, responsives Design

💡 Beispiele für Vorlagenmakros

Gmail-Label-Visualisierung - Listen von Labels in wunderschöne interaktive Chips verwandeln:

{{ render_gmail_labels_chips( service://gmail/labels , 'Label summary for: ' + user://current/email ) }}

Kalender-Dashboard - Umfassende Kalenderübersichten erstellen:

{{ render_calendar_dashboard( service://calendar/calendars, service://calendar/events, 'My Calendar Overview' ) }}

Kalenderereignis-Dashboard - Kalenderereignisse in wunderschöne, interaktive Ereigniskarten verwandeln:

{{ render_calendar_events_dashboard( service://calendar/events , 'Upcoming Events for: ' + user://current/email.email ) }}

Beispiel für das Kalenderereignis-Dashboard

Dieses Makro erstellt ein beeindruckendes dunkel gestaltetes Dashboard mit folgenden Funktionen:

  • 📅 Interaktive Ereigniskarten: Jedes Ereignis wird als klickbare Karte dargestellt, die sich in Google Kalender öffnet

  • 🕐 Intelligente Zeitanzeige: Formatiert automatisch ganztägige Ereignisse vs. terminierte Ereignisse mit Zeitzonenunterstützung

  • 📍 Standortintegration: Zeigt Besprechungsorte und Links zu virtuellen Besprechungen an

  • 👥 Teilnehmerinformationen: Zeigt Teilnehmerzahlen und Details zu Teilnehmenden an

  • ✅ Statusindikatoren: Farbcodierter Status (bestätigt, vorläufig, abgesagt) mit visuellem Feedback

  • 📱 Responsives Design: Für Mobilgeräte optimiertes Layout mit touch-freundlichen Interaktionen

  • 🎨 Dunkles Theme-Styling: Professionelles Erscheinungsbild mit Verlaufs-Hintergründen und Hover-Effekten

Professionelle Dokumente - Berichte mit Metriken und Diagrammen generieren:

{{ generate_report_doc(
    report_title='Q4 Performance Report',
    metrics=[{'value': '$1.2M', 'label': 'Revenue', 'change': 15}],
    company_name='Your Company'
) }}

🔍 Makro-Erkennung & dynamische Erstellung

Alle verfügbaren Makros über das Vorlagenressourcen-System erkunden:

# Access the template://macros resource to discover all available macros
macros = await access_resource("template://macros")
# Returns comprehensive macro information with usage examples

# Access specific macro details
macro_details = await access_resource("template://macros/render_gmail_labels_chips")

🎯 Dynamische Makro-Erstellung

Zur Laufzeit benutzerdefinierte Makros mit dem Tool create_template_macro erstellen:

# Create a new macro dynamically
await create_template_macro(
    macro_name="render_task_status_badge",
    macro_content='''
    {% macro render_task_status_badge(status, size='small') %}
    {% if status == 'completed' %}
    <span class="status-badge status-completed {{ size }}">✅ Complete</span>
    {% elif status == 'in_progress' %}
    <span class="status-badge status-in-progress {{ size }}">🔄 In Progress</span>
    {% else %}
    <span class="status-badge status-pending {{ size }}">⏳ {{ status|title }}</span>
    {% endif %}
    {% endmacro %}
    ''',
    description="Renders visual status badges for task states with appropriate icons",
    usage_example="{{ render_task_status_badge('completed', 'large') }}",
    persist_to_file=True
)

# Immediately use the newly created macro
await send_gmail_message(
    html_body="Task Status: {{ render_task_status_badge('completed', 'large') }}"
)

DSL-gestützte Makros — dynamische Makros können auch die Google-Chat-Karten-DSL-Notation einbetten, um umfangreiche, strukturierte Karten zu generieren. Die DSL-Symbole definieren das Kartenlayout, während Jinja2 die dynamischen Inhalte übernimmt:

{# workspace_dashboard.j2 — a dynamic macro that outputs a Google Chat card #}
{% macro workspace_dashboard(user_email, stats=None, quick_actions=None) %}
{% set username = user_email.split('@')[0] if user_email else 'User' %}
{% set default_stats = stats or [
    {'label': 'Emails', 'value': '12 unread'},
    {'label': 'Calendar', 'value': '3 meetings today'},
    {'label': 'Tasks', 'value': '5 pending'}
] %}

§[δ×3, ℊ[ǵ×4], §[δ×2, Ƀ[ᵬ×3]]]

Welcome back, {{ username | title }}!

Your Workspace Overview:
{% for stat in default_stats %}
- {{ stat.label }}: {{ stat.value }}
{% endfor %}

Actions:
- Button: Open Gmail → https://mail.google.com
- Button: Open Calendar → https://calendar.google.com
- Button: Open Drive → https://drive.google.com
{% endmacro %}

Die DSL-Zeile §[δ×3, ℊ[ǵ×4], §[δ×2, Ƀ[ᵬ×3]]] definiert die Kartenstruktur: ein Abschnitt mit 3 DecoratedText-Widgets, ein Grid mit 4 Elementen und ein verschachtelter Abschnitt mit 2 DecoratedText-Widgets und einer ButtonList mit 3 Schaltflächen. Die Jinja2-Vorlage füllt die Inhalte dynamisch aus – und da sie in templates/dynamic/ gespeichert wird, ist sie sofort für send_dynamic_card und andere Tools verfügbar.

Hauptfunktionen:

  • ⚡ Sofortige Verfügbarkeit: Makros sind direkt nach der Erstellung verfügbar

  • 🎯 Ressourcenintegration: Automatisch über template://macros/macro_name verfügbar

  • 💾 Optionale Speicherung: Makros zur dauerhaften Verfügbarkeit auf der Festplatte speichern

  • 🔄 Vorlagenverarbeitung: Vollständige Jinja2-Syntaxvalidierung und Fehlerbehandlung

  • 💬 DSL-Integration: Makros können Karten-DSL-Notation für umfangreiche Google-Chat-Karten ausgeben

🚀 Praxisnahe Verwendung

Vorlagen können direkt in Tool-Aufrufen verwendet werden, um eine schöne, strukturierte Ausgabe zu erzielen:

# Send a beautiful email with calendar dashboard
await send_gmail_message(
    to="manager@company.com",
    subject="Weekly Schedule Update",
    html_body="{{ render_calendar_events_dashboard( service://calendar/events, 'My upcoming events') }}",
    content_type="mixed"
)

# Generate and send a professional report
await create_doc(
    title="Q4 Performance Report",
    content="{{ generate_report_doc( report_title='Quarterly Results', company_name='GoogleUnlimited' ) }}"
)

📚 Ressourcen zum Vorlagensystem:

🗂️ Ressourcen-Erkennung

GoogleUnlimited bietet ein leistungsstarkes MCP-Ressourcensystem, das blitzschnellen Datenzugriff ohne API-Aufrufe durch intelligente URI-Muster ermöglicht.

Ressourcen-Erkennung

🎯 Ressourcen-URI-Muster

Muster

Zweck

Beispiel

Rückgabe

user://profile/{email}

Benutzer-Authentifizierungsstatus

user://profile/john@gmail.com

Profil + Auth-Status

service://{service}/lists

Verfügbare Dienstlisten

service://gmail/lists

[Filter, Labels]

service://{service}/{list_type}

Alle Elemente in der Liste

service://gmail/labels

Alle Gmail-Labels

service://{service}/{list_type}/{id}

Details zu bestimmten Elementen

service://gmail/labels/INBOX

INBOX-Label-Details

recent://{service}

Aktuelle Elemente

recent://drive

Aktuelle Drive-Dateien

qdrant://search/{query}

Semantische Suche

qdrant://search/gmail errors

Relevante Antworten

🏗️ Zentrale Ressourcendateien

⚡ Blitzschneller Zugriff

# Instant Gmail labels (no API call needed)
labels = await access_resource("service://gmail/labels")

# Current user info from session
user = await access_resource("user://current/email")

# Semantic search across all tool responses
results = await access_resource("qdrant://search/gmail errors today")

# Recent calendar events
events = await access_resource("recent://calendar")

📚 Dokumentation zum Ressourcensystem:

🧪 Test-Framework

GoogleUnlimited enthält umfassende Tests mit Client-Tests, die die MCP-Nutzung exakt so validieren, wie ein LLM sie erleben würde, sowie zusätzliche Test-Suiten. 559 Tests bestehen mit einer Erfolgsquote von 100 %.

🎯 Fokus der Client-Tests

Test-Framework

Die Client-Tests sind die wichtigste Komponente – sie bieten deterministische Tests von MCP-Operationen mit echter Ressourcenintegration und standardisierten Mustern über alle 92+ Tools und 9 Google-Dienste. Diese Tests validieren sowohl die explizite E-Mail-Authentifizierung als auch die Middleware-Injektionsmuster.

🚀 Schnelle Testbefehle

# 🧪 Run all client tests (primary test suite)
uv run pytest tests/client/ -v

# 📧 Test specific service
uv run pytest tests/client/ -k "gmail" -v

# 🔐 Authentication required tests
uv run pytest tests/client/ -m "auth_required" -v

🔬 Integration echter Ressourcen-IDs

Das Test-Framework ruft echte IDs aus Dienstressourcen für realistische Tests ab:

# Available fixtures for real resource testing
real_gmail_message_id      # From service://gmail/messages
real_drive_document_id     # From service://drive/items
real_calendar_event_id     # From service://calendar/events
real_photos_album_id       # From service://photos/albums
real_forms_form_id         # From service://forms/forms
real_chat_space_id         # From service://chat/spaces

🔄 CI/CD-Pipeline

Automatisierte Tests und Veröffentlichung über GitHub Actions:

  • CI-Workflow: Wird bei jedem PR und Push auf main ausgeführt

    • Python 3.11- und 3.12-Matrix-Tests

    • Linting mit ruff check und Formatierung mit ruff format

    • Ausführung der vollständigen Test-Suite

  • TestPyPI-Veröffentlichung: Automatisierte Paketveröffentlichung für Tests

📚 Testressourcen:

🔒 Sicherheit & Authentifizierung

GoogleUnlimited implementiert Sicherheit auf Unternehmensniveau mit OAuth 2.1 + PKCE, erweiterter Sitzungsverwaltung und umfassenden Prüffunktionen.

Sicherheitsarchitektur

🛡️ Authentifizierungsabläufe

  1. 🌐 MCP-Inspector-OAuth: MCP-Spezifikationskonform mit dynamischer Client-Registrierung

  2. 🖥️ Direkter Server-OAuth: Webbasierte Authentifizierung für den direkten Zugriff

  3. 🔧 Entwicklungs-JWT: Testmodus mit generierten Tokens

  4. 📁 Erweiterte Datei-Anmeldedaten: Dauerhafte Speicherung mit Verschlüsselungsoptionen

  5. 🔑 Benutzerdefinierte OAuth-Clients: Eigene OAuth-Anmeldedaten verwenden mit automatischem Fallback

  6. 🪪 Pro-Benutzer-API-Schlüssel: Einzelne Schlüssel, die beim Abschluss der OAuth-Authentifizierung generiert werden, mit Isolierung der Anmeldedaten

✨ Sicherheitsfunktionen

  • 🔐 OAuth 2.1 + PKCE: Moderne Authentifizierung mit Schlüsselnachweis-Austausch (unterstützt öffentliche Clients)

  • 🔑 Pro-Benutzer-API-Schlüssel: Eindeutige, widerrufbare Schlüssel pro Benutzer mit Nur-Hash-Speicherung und timing-sicherer Suche

  • 🛡️ Isolierung der Anmeldedaten: Zugriffskontrolle basierend auf der Authentifizierungsherkunft verhindert die Vererbung von Anmeldedaten zwischen Benutzern

  • 🔗 Kontoverknüpfung: Bidirektionale Kontoverknüpfung für den Mehrkonten-Zugriff mit Pro-Benutzer-Schlüsseln

  • 🔒 Krypto-gebundene Verschlüsselung: Abgeleitete HKDF-SHA256-Verschlüsselungsschlüssel, die an MCP_API_KEY gebunden sind

  • 🔒 Sitzungsisolierung: Multi-Tenant-Unterstützung zur Verhinderung von Datenlecks

  • 🏷️ 27+ API-Umfänge: Granulare Berechtigungsverwaltung über alle Dienste hinweg

  • 📊 Prüfprotokollierung: Vollständige Sicherheitsereignisverfolgung mit Authentifizierungsherkunft

  • 🔐 AES-256-Verschlüsselung: Speicherung von Anmeldedaten mit Unterstützung für die Migration von Legacy-Schlüsseln

  • 🔄 Drei-Ebenen-Fallback: Robuste Persistenz der Anmeldedaten über Server-Neustarts hinweg (State Map → UnifiedSession → Context Storage)

  • 🧹 Entfernung sensibler Daten: Auth-Metadaten werden aus Qdrant-Embeddings vor der Speicherung entfernt

⚙️ Sicherheitskonfiguration

# 🔒 Security settings in .env
CREDENTIAL_STORAGE_MODE=FILE_ENCRYPTED
SESSION_SECRET_KEY=your-secret-key
SESSION_TIMEOUT_MINUTES=30
ENABLE_AUDIT_LOGGING=true
GMAIL_ALLOW_LIST=trusted@example.com

📚 Ressourcen zur Sicherheitsdokumentation:


🚀 Bereit, Ihre Google-Workspace-Integration zu revolutionieren?

📚 Dokumentation • 🔧 Konfiguration • 🎯 API-Referenz • 🧪 Tests

Available Tools

7 tools
executeExecuteA

Run sandboxed Python that calls this server's Google Workspace tools via await call_tool(tool_name, params), chaining calls in one block. Use when: you know which tools to call. To find tool names first use search or tags; for exact parameters use get_schema; to look up past results instead, use semantic_search. Behavior: each call_tool runs the real tool immediately — sends, edits, and deletes take effect; there is no dry-run. Use return to produce output; prefer returning the final answer from a single block. Only call_tool(tool_name: str, params: dict) -> Any is available in scope. Unknown tool names raise NotFoundError; disallowed syntax raises SandboxError.

SANDBOX RESTRICTIONS — these produce SandboxError, avoid them:

  • sorted_(items, key=lambda x: x['k']) → lambda args fail; use builtins like key=len or sort manually

  • import only covers a small stdlib subset (e.g. json); no third-party modules — prefer the built-in helpers listed below

Built-in helpers (import is not available — use these instead):

  • now(tz_offset=0) → current datetime string (UTC by default)

  • today(tz_offset=0) → current date 'YYYY-MM-DD' (UTC by default)

  • days_ago(n, tz_offset=0) → ISO datetime string N days ago

  • hours_ago(n, tz_offset=0) → ISO datetime string N hours ago

  • format_date(iso_str, fmt='%Y-%m-%d %H:%M') → formatted date

  • parse_date(iso_str) → normalized ISO datetime

  • timestamp() → current unix timestamp (int)

  • to_json(obj, indent=None) → JSON string

  • from_json(s) → parsed object

  • url_encode(s) → URL-encoded string

  • url_decode(s) → URL-decoded string

  • url_join(base, *parts) → joined URL path

  • query_string(params) → URL query string from dict

  • re_find(pattern, text) → list of matches

  • re_match(pattern, text) → bool

  • re_sub(pattern, repl, text) → substituted string

  • truncate(text, n=80) → truncated with '...'

  • dedent(text) → remove common leading whitespace

  • wrap_text(text, width=72) → word-wrap to width

  • pad_left(s, width, char=' ') → right-justify / zero-pad

  • pad_right(s, width, char=' ') → left-justify

  • join(items, sep=', ') → joined string

  • html_escape(s) → HTML-safe string

  • sqrt(n), ceil(n), floor(n) → math

  • round_(n, digits=2), abs_(), min_(), max_(), sum_() → math

  • sorted_(items, key=None, reverse=False) → sorted list

  • unique(items) → deduplicated list (preserves order)

  • flatten(lists) → flat list from nested lists

  • counter(items) → dict of {item: count}

  • chunk(items, size) → list of chunks

  • zip_(*iterables) → zipped as list of lists

  • dict_get(d, 'a.b.c', default=None) → nested dict access

  • md5(s), sha256(s) → hash hex digests

  • gather_tools(calls) → run multiple tool calls sequentially; calls is a list of [tool_name, params] pairs, returns list of results (assign to variable, then index: r = await gather_tools([...]); a, b = r[0], r[1])

  • sleep(seconds) → async sleep

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesPython async code to execute tool calls via call_tool(name, arguments)

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden, and it does so thoroughly. It discloses that each call_tool runs the real tool immediately with sends/edits/deletes taking effect and no dry-run, plus sandbox restrictions, error types, and disallowed syntax. This is substantial behavioral context beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections: use-when, behavior, sandbox restrictions, and built-in helpers. Core usage and side effects are front-loaded, and every block provides actionable information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that annotations and an output schema are absent, the description is remarkably complete. It covers selection criteria, invocation syntax, execution environment, side effects, error modes, restrictions, and helper APIs, so an agent can use this tool without needing additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the single `code` parameter at 100% coverage, but the description adds far more semantic value: valid async syntax, `call_tool` signature, use of `return`, restrictions on `import`, sandbox errors, and a full list of available built-in helpers. This gives the agent everything needed to construct valid code.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a precise verb and resource: running sandboxed Python that calls this server's Google Workspace tools via `await call_tool(tool_name, params)` and chaining calls in one block. It also distinguishes itself clearly from discovery/search siblings by framing this as the execution step once tool names are known.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit 'Use when' condition: when you know which tools to call. It also names alternatives for other cases: `search` or `tags` for finding tool names, `get_schema` for exact parameters, and `semantic_search` for past results, providing clear routing to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_documentFetch DocumentA

Preview one stored tool response by its Qdrant point ID.

Use when: inspecting a hit returned by semantic_search. To find point IDs in the first place, use semantic_search; for the full untruncated content, call the fetch tool inside an execute block.

Behavior: read-only. Returns: tool name, service, timestamp, user, argument count, and the first 500 characters of stored content. Errors: 'Document not found' for unknown or expired point IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
point_idYesQdrant point ID (UUID) from a search result
user_google_emailNoUser's Google email (auto-injected by middleware)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral disclosure burden. It states 'Behavior: read-only', describes the exact return fields including the 500-character truncation, and documents the error condition 'Document not found' for unknown or expired IDs. This is unusually transparent for a tool description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-organized with labeled sections, and front-loads the core purpose. Every sentence adds useful content, and there is no redundant repetition of schema or annotation details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description enumerates the return fields and truncation behavior, making the tool's output predictable. It also covers errors, read-only behavior, and usage context, making the description complete for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters clearly. The description adds context around the point_id's role in previewing a stored response, but does not need to add more because the parameter semantics are fully captured in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Preview one stored tool response') and identifies the resource by 'Qdrant point ID', clearly distinguishing this from sibling search and execute tools. It also explicitly indicates what it is not for, such as full untruncated content, which further sharpens purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' section directly instructs to use this tool when inspecting a hit from semantic_search, and explicitly points to alternatives for finding point IDs and retrieving full content. This is exemplary routing guidance that leaves no ambiguity about when to use this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_schemaGet SchemaA

Get parameter schemas for named tools before calling them via execute. Use when: you already have tool names (from search or tags) and need exact parameters. Not for discovery — use search for that. Returns: per-tool parameter markdown ('detailed', default), names + descriptions ('brief'), or full JSON schemas ('full'); unknown names are reported under 'Tools not found'.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolsYesList of tool names to get schemas for
detailNo'brief' for names and descriptions, 'detailed' for parameter schemas as markdown, 'full' for complete JSON schemasdetailed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the output formats for each detail mode and the unknown-name handling behavior ('reported under Tools not found'). It does not explicitly state side effects, but the read-only nature is strongly implied by the verb 'get' and the schema-fetching purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and uses clear logical sections ('Use when', 'Not for discovery', 'Returns'). Every sentence earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with no output schema and no annotations. It covers the main purpose, usage conditions, output formats, defaults, and error handling for unknown tool names. No critical operational gap remains for an agent deciding how to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so the baseline is 3. The description mostly restates what the schema already says about 'detail' and 'tools'; it adds minor value with 'per-tool parameter markdown' and unknown-name behavior, but does not substantially deepen parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get parameter schemas for named tools before calling them via execute.' It clearly differentiates from the sibling search tool by framing this as a pre-execute lookup step, not a discovery mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('when you already have tool names... and need exact parameters'), when not to use it ('Not for discovery'), and names the alternative ('use search for that'). This gives an agent unambiguous routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tagsTagsA

List this server's tool tags (service areas like gmail, drive, docs, photos) with tool counts. Use when: browsing what capability areas exist before a targeted lookup. For keyword lookup use search; for parameters of known tools use get_schema. Returns: '- tag (N tools)' lines at detail='brief' (default), or every tool listed under each tag at detail='full'.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoLevel of detail: 'brief' for tag names and counts, 'full' for tools listed under each tagbrief

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does well: it specifies the exact output shape at default detail ('- tag (N tools)' lines) and the change at detail='full'. It clearly frames the operation as a non-mutating listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences front-load the core action and use case before return details. There is no filler or unnecessary repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional schema-defined parameter and no output schema, the description covers purpose, routing, default behavior, and return format. Nothing material needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the single parameter with its enum, default, and per-value meaning, so the baseline is 3. The description adds the concrete output format for brief detail and confirms what full detail returns, which is a small but meaningful addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise action ('List this server's tool tags...') with resource and scope, plus concrete examples of categories like gmail, drive, docs, and photos. The mention of tool counts and the overview nature distinguishes it from sibling tools such as search and get_schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the intended use case ('browsing what capability areas exist before a targeted lookup') and names alternatives for adjacent cases: 'For keyword lookup use search; for parameters of known tools use get_schema.' This gives an agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tool_activityTool ActivityA

Show usage analytics for this server's tools: call counts, error rates, last-used times.

Use when: answering 'what has been used or failing lately'. To read an individual response, pass a sample point ID to fetch_document; to discover tools to call, use search instead.

Behavior: read-only aggregation over the Qdrant response store. Returns: a text dashboard grouped by tool_name or user_email, with sample point IDs per group. Errors: 'Analytics failed' when the response store is unreachable.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum groups to show
group_byNoGroup results by 'tool_name' or 'user_email'tool_name
user_google_emailNoUser's Google email (auto-injected by middleware)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses read-only behavior ('read-only aggregation over the Qdrant response store'), return format ('text dashboard... with sample point IDs per group'), and an error condition ('Analytics failed' when the response store is unreachable). It does not mention authentication or rate limits, but for this tool the provided behavioral details are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured with labeled segments ('Use when', 'Behavior', 'Returns', 'Errors'), front-loads the core purpose, and every sentence adds distinct value. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema and no annotations, the description provides enough context for correct invocation: what it returns (text dashboard), how it groups, what error to expect, and when to use alternatives. All three optional parameters are already covered by the schema, so nothing needed for this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema. The description mentions grouping by tool_name or user_email, which mirrors the group_by schema description, but does not add new semantic detail beyond that. Baseline 3 is appropriate when the schema handles parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Show usage analytics for this server's tools: call counts, error rates, last-used times'), and later explicitly contrasts with fetch_document and search, distinguishing its purpose. An agent can immediately tell what this tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Contains explicit 'Use when' guidance ('answering what has been used or failing lately'), plus clear redirections: 'pass a sample point ID to fetch_document' and 'use search instead'. This leaves no ambiguity about when to select this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv3.0.0
    • Changedfetch_document1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedget_schema1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedsearch1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedsemantic_search1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedtags1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedtool_activity1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
  2. 103 tool updatesv2.3.2
    • Removedadd_questions_to_form
    • Removedadd_slide
    • Removedbulk_calendar_operations
    • Removedcheck_drive_auth
    • Removedcleanup_qdrant_data
    • Removedcompose_dynamic_email
    • Removedcreate_calendar
    • Removedcreate_doc
    • Removedcreate_drive_file
    • Removedcreate_event
    • Removedcreate_form
    • Removedcreate_gmail_filter
    • Removedcreate_photos_album
    • Removedcreate_presentation
    • Removedcreate_sheet
    • Removedcreate_spreadsheet
    • Removedcreate_template_macro
    • Removeddelete_event
    • Removeddelete_gmail_filter
    • Removeddownload_gmail_attachment
    • Removeddraft_gmail_forward
    • Removeddraft_gmail_message
    • Removeddraft_gmail_reply
    • Addedexecute
    • Removedexport_and_download_presentation
    • Removedfetch
    • Addedfetch_document
    • Removedformat_sheet_range
    • Removedforward_gmail_message
    • Removedget_doc_content
    • Removedget_drive_file_content
    • Removedget_event
    • Removedget_form
    • Removedget_form_response
    • Removedget_gmail_filter
    • Removedget_gmail_message_content
    • Removedget_gmail_messages_content_batch
    • Removedget_gmail_thread_content
    • Removedget_people_contact_group_members
    • Removedget_photo_details
    • Removedget_photos_library_info
    • Removedget_presentation_info
    • Removedget_response_details
    • Addedget_schema
    • Removedget_spreadsheet_info
    • Removedget_tool_analytics
    • Removedhealth_check
    • Removedlist_album_photos
    • Removedlist_calendars
    • Removedlist_docs_in_folder
    • Removedlist_drive_items
    • Removedlist_events
    • Removedlist_form_responses
    • Removedlist_gmail_filters
    • Removedlist_gmail_labels
    • Removedlist_messages
    • Removedlist_people_contact_labels
    • Removedlist_photos_albums
    • Removedlist_spaces
    • Removedlist_spreadsheets
    • Removedmake_drive_files_public
    • Removedmanage_credentials
    • Removedmanage_drive_files
    • Removedmanage_gmail_allow_list
    • Removedmanage_gmail_label
    • Removedmanage_people_contact_labels
    • Removedmanage_space
    • Removedmanage_tools
    • Removedmodify_event
    • Removedmodify_gmail_message_labels
    • Removedmodify_sheet_values
    • Removedmove_events_between_calendars
    • Removedphotos_batch_details
    • Removedphotos_optimized_album_sync
    • Removedphotos_performance_stats
    • Removedphotos_smart_search
    • Removedpublish_form_publicly
    • Removedqdrant_search
    • Removedread_sheet_values
    • Removedreply_to_gmail_message
    • Addedsearch
    • Removedsearch_docs
    • Removedsearch_drive_files
    • Removedsearch_gmail_messages
    • Removedsearch_messages
    • Removedsearch_photos
    • Removedsearch_tool_history
    • Addedsemantic_search
    • Removedsend_dynamic_card
    • Removedsend_gmail_message
    • Removedsend_message
    • Removedset_form_publish_state
    • Removedset_privacy_mode
    • Removedshare_drive_files
    • Removedstart_google_auth
    • Addedtags
    • Addedtool_activity
    • Removedupdate_form_questions
    • Removedupdate_slide_content
    • Removedupload_folder_photos
    • Removedupload_photos
    • Removedupload_to_drive
    • Removedverify_payment
  3. 96 tool updatesv2.2.1
    • First observedadd_questions_to_form
    • First observedadd_slide
    • First observedbulk_calendar_operations
    • First observedcheck_drive_auth
    • First observedcleanup_qdrant_data
    • First observedcompose_dynamic_email
    • First observedcreate_calendar
    • First observedcreate_doc
    • First observedcreate_drive_file
    • First observedcreate_event
    • First observedcreate_form
    • First observedcreate_gmail_filter
    • First observedcreate_photos_album
    • First observedcreate_presentation
    • First observedcreate_sheet
    • First observedcreate_spreadsheet
    • First observedcreate_template_macro
    • First observeddelete_event
    • First observeddelete_gmail_filter
    • First observeddownload_gmail_attachment
    • First observeddraft_gmail_forward
    • First observeddraft_gmail_message
    • First observeddraft_gmail_reply
    • First observedexport_and_download_presentation
    • First observedfetch
    • First observedformat_sheet_range
    • First observedforward_gmail_message
    • First observedget_doc_content
    • First observedget_drive_file_content
    • First observedget_event
    • First observedget_form
    • First observedget_form_response
    • First observedget_gmail_filter
    • First observedget_gmail_message_content
    • First observedget_gmail_messages_content_batch
    • First observedget_gmail_thread_content
    • First observedget_people_contact_group_members
    • First observedget_photo_details
    • First observedget_photos_library_info
    • First observedget_presentation_info
    • First observedget_response_details
    • First observedget_spreadsheet_info
    • First observedget_tool_analytics
    • First observedhealth_check
    • First observedlist_album_photos
    • First observedlist_calendars
    • First observedlist_docs_in_folder
    • First observedlist_drive_items
    • First observedlist_events
    • First observedlist_form_responses
    • First observedlist_gmail_filters
    • First observedlist_gmail_labels
    • First observedlist_messages
    • First observedlist_people_contact_labels
    • First observedlist_photos_albums
    • First observedlist_spaces
    • First observedlist_spreadsheets
    • First observedmake_drive_files_public
    • First observedmanage_credentials
    • First observedmanage_drive_files
    • First observedmanage_gmail_allow_list
    • First observedmanage_gmail_label
    • First observedmanage_people_contact_labels
    • First observedmanage_space
    • First observedmanage_tools
    • First observedmodify_event
    • First observedmodify_gmail_message_labels
    • First observedmodify_sheet_values
    • First observedmove_events_between_calendars
    • First observedphotos_batch_details
    • First observedphotos_optimized_album_sync
    • First observedphotos_performance_stats
    • First observedphotos_smart_search
    • First observedpublish_form_publicly
    • First observedqdrant_search
    • First observedread_sheet_values
    • First observedreply_to_gmail_message
    • First observedsearch_docs
    • First observedsearch_drive_files
    • First observedsearch_gmail_messages
    • First observedsearch_messages
    • First observedsearch_photos
    • First observedsearch_tool_history
    • First observedsend_dynamic_card
    • First observedsend_gmail_message
    • First observedsend_message
    • First observedset_form_publish_state
    • First observedset_privacy_mode
    • First observedshare_drive_files
    • First observedstart_google_auth
    • First observedupdate_form_questions
    • First observedupdate_slide_content
    • First observedupload_folder_photos
    • First observedupload_photos
    • First observedupload_to_drive
    • First observedverify_payment

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation4/5

The tools are mostly separable: tags and search provide different discovery paths, and semantic_search is clearly scoped to past responses. The main ambiguity is that search, semantic_search, and tags all surface tool/response names in slightly different ways, though the descriptions mitigate this by stating when to use each.

Naming Consistency3/5

All names use lowercase with underscores, but the structural conventions are mixed: standalone verbs (search, execute), nouns (tags, tool_activity), and verb_noun compounds (get_schema, fetch_document) coexist. This is readable, but there is no single consistent naming pattern across the tool set.

Tool Count5/5

Seven tools is an appropriate, well-scoped count for a discovery, schema, execution, history, and analytics server. Each tool carries a distinct responsibility, with no obvious redundancy or bloat.

Completeness4/5

The tool surface covers the core lifecycle of discovering tools, fetching schemas, executing calls, and retrieving historical results/analytics. Minor gaps exist, such as no dedicated tool for deleting/cleaning stored history or batch management of point IDs, but these are workable around.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers