Skip to main content
Glama
taylorwilsdon

Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive

Google Workspace MCP-Server

Lizenz: MIT Python 3.11+ UV

Verbinden Sie MCP-Clients, KI-Assistenten und mehr über das Model Context Protocol mit Google Workspace-Diensten

Sehen Sie es in Aktion:


📑 Inhaltsverzeichnis


Related MCP server: google-workspace-mcp-advanced

🌐 Übersicht

Der Google Workspace MCP Server integriert Google Workspace-Dienste (Kalender, Drive, Gmail und Docs) mit KI-Assistenten und anderen Anwendungen über das Model Context Protocol (MCP). Dadurch können KI-Systeme sicher und effizient auf Nutzerdaten aus Google Workspace-Anwendungen zugreifen und mit ihnen interagieren.


✨ Funktionen

  • 🔐 OAuth 2.0-Authentifizierung : Stellt eine sichere Verbindung zu Google-APIs mithilfe benutzerautorisierter Anmeldeinformationen mit automatischer Token-Aktualisierung und zentralisiertem Authentifizierungsfluss her

  • 📅 Google Kalender-Integration : Vollständige Kalenderverwaltung – Kalender auflisten, Ereignisse abrufen, Ereignisse erstellen/ändern/löschen mit Unterstützung für ganztägige und zeitgesteuerte Ereignisse

  • 📁 Google Drive-Integration : Dateien suchen, Ordnerinhalte auflisten, Dateiinhalte lesen und neue Dateien erstellen. Unterstützt natives Extrahieren und Abrufen von DOCX-, XLSX- und anderen Microsoft Office-Formaten!

  • 📧 Gmail-Integration : Komplette E-Mail-Verwaltung – Nachrichten suchen, Inhalte abrufen, E-Mails senden und Entwürfe erstellen mit vollständiger Unterstützung für die gesamte Abfragesyntax

  • 📄 Google Docs-Integration : Suchen Sie nach Dokumenten, lesen Sie Dokumentinhalte, listen Sie Dokumente in Ordnern auf und erstellen Sie neue Dokumente direkt aus Ihrem Chat!

  • 🔄 Mehrere Transportoptionen : Streambares HTTP + SSE-Fallback

  • 🔌 mcpo -Kompatibilität : Stellen Sie den Server einfach als OpenAPI-Endpunkt für die Integration mit Tools wie Open WebUI bereit

  • 🧩 Erweiterbares Design : Einfache Struktur zum Hinzufügen von Unterstützung für weitere Google Workspace-APIs und -Tools

  • 🔄 Integrierter OAuth-Rückruf : Behandelt die OAuth-Weiterleitung direkt innerhalb des Servers auf Port 8000

  • ⚡ Thread-sichere Sitzungsverwaltung : Robuste Sitzungsverwaltung mit threadsicherer Architektur für verbesserte Zuverlässigkeit


🚀 Schnellstart

Voraussetzungen

  • Python 3.11+

  • UV- Paketinstallationsprogramm (oder pip)

  • Google Cloud-Projekt mit aktivierten OAuth 2.0-Anmeldeinformationen für erforderliche APIs (Kalender, Drive, Gmail, Docs)

Installation

# Clone the repository (replace with your fork URL if different)
git clone https://github.com/taylorwilsdon/google_workspace_mcp.git
cd google_workspace_mcp

# Create a virtual environment and install dependencies
uv venv
source .venv/bin/activate  # On Windows use `.venv\Scripts\activate`
uv pip install -e .

Konfiguration

  1. Erstellen Sie OAuth 2.0-Anmeldeinformationen (Desktop-Anwendungstyp) in der Google Cloud Console .

  2. Aktivieren Sie die Google Calendar API , Google Drive API , Gmail API und Google Docs API für Ihr Projekt.

  3. Laden Sie die OAuth-Client-Anmeldeinformationen als client_secret.json herunter und platzieren Sie sie im Stammverzeichnis des Projekts.

  4. Fügen Sie Ihrer OAuth-Clientkonfiguration in der Google Cloud Console die folgende Umleitungs-URI hinzu. Beachten Sie, dass http://localhost:8000 die Standard-Basis-URI und der Standard-Port sind. Diese können über Umgebungsvariablen ( WORKSPACE_MCP_BASE_URI und WORKSPACE_MCP_PORT ) angepasst werden. Wenn Sie diese ändern, müssen Sie die Umleitungs-URI in der Google Cloud Console entsprechend aktualisieren.

    http://localhost:8000/oauth2callback
  5. ⚠️ Wichtig : Stellen Sie sicher, dass client_secret.json zu Ihrer .gitignore Datei hinzugefügt und niemals der Versionskontrolle übergeben wird.

Serverkonfiguration

Die Basis-URL und der Port des Servers können mithilfe von Umgebungsvariablen angepasst werden:

  • WORKSPACE_MCP_BASE_URI : Legt die Basis-URI für den Server fest (Standard: http://localhost ). Dies betrifft die server_url die für den Aufruf nativer Gemini-Funktionen verwendet wird, und die OAUTH_REDIRECT_URI .

  • WORKSPACE_MCP_PORT : Legt den Port fest, auf dem der Server lauscht (Standard: 8000 ). Dies betrifft die server_url , port und OAUTH_REDIRECT_URI .

Anwendungsbeispiel:

export WORKSPACE_MCP_BASE_URI="https://my-custom-domain.com"
export WORKSPACE_MCP_PORT="9000"
uv run main.py

Umgebungs-Setup

Der Server verwendet HTTP für Localhost-OAuth-Rückrufe während der Entwicklung. Setzen Sie diese Umgebungsvariable, bevor Sie den Server ausführen:

# Allow HTTP for localhost OAuth callbacks (development only!)
export OAUTHLIB_INSECURE_TRANSPORT=1

Andernfalls kann während des Authentifizierungsflusses der Fehler „OAuth 2 MUSS HTTPS verwenden“ auftreten.

Starten Sie den Server

Wählen Sie eine der folgenden Methoden zum Ausführen des Servers:

python main.py
# or using uv
uv run main.py

Führt den Server mit einer HTTP-Transportschicht auf Port 8000 aus.

Multi-User-MCP ist ein ziemliches Chaos, daher läuft derzeit alles am besten mit 1:1-Mapping zwischen Client und Server. Das wird sich ändern, sobald Claude OAuth 2.1-Flows durchführen kann. Daher wurde dieses MCP mit einem Flag für vereinfachte Einzelbenutzerumgebungen erstellt. Sie können den Server im Einzelbenutzermodus ausführen, wodurch das Session-zu-OAuth-Mapping umgangen und alle verfügbaren Anmeldeinformationen aus dem Verzeichnis .credentials verwendet werden:

python main.py --single-user
# or using uv
uv run main.py --single-user

Im Einzelbenutzermodus:

  • Der Server findet und verwendet automatisch alle gültigen Anmeldeinformationen im Verzeichnis .credentials

  • Es ist keine Sitzungszuordnung erforderlich – der Server verwendet die erste gefundene gültige Anmeldeinformationsdatei

  • Nützlich für Entwicklung, Tests oder Einzelbenutzerbereitstellungen

  • Erfordert weiterhin eine anfängliche OAuth-Authentifizierung zum Erstellen von Anmeldeinformationsdateien

Dieser Modus ist besonders hilfreich, wenn Sie keine Mehrbenutzersitzungsverwaltung benötigen und eine vereinfachte Anmeldeinformationsverwaltung wünschen.

Sie können den Server mit der bereitgestellten Dockerfile erstellen und ausführen.

# Build the Docker image
docker build -t google-workspace-mcp .

# Run the Docker container
# The -p flag maps the container port 8000 to the host port 8000
# The -v flag mounts the current directory to /app inside the container
# This is useful for development to pick up code changes without rebuilding
docker run -p 8000:8000 -v $(pwd):/app google-workspace-mcp

Die Datei smithery.yaml ist so konfiguriert, dass der Server innerhalb des Docker-Containers korrekt gestartet wird.

Wichtige Häfen

Die Standardports sind 8000 , können aber über die Umgebungsvariable WORKSPACE_MCP_PORT geändert werden.

Service

Standardport

Beschreibung

OAuth-Rückruf

8000

Wird intern vom Server über die Route /oauth2callback gehandhabt

HTTP-Modus-Server

8000

Standard bei Verwendung des HTTP-Transports

Herstellen einer Verbindung zum Server

Der Server unterstützt mehrere Verbindungsmethoden:

Claude Desktop:

Kann überall ausgeführt und über mcp-remote verwendet oder lokal aufgerufen werden, entweder mit uv run main.py als Argument oder durch Verwendung von mcp-remote mit localhost.

config.json:

{
  "mcpServers": {
    "Google workspace": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:8000/mcp”
      ]
    }
  }
}
  1. Installieren Sie mcpo : uv pip install mcpo oder pip install mcpo

  2. Erstellen Sie eine config.json (siehe Integration mit Open WebUI )

  3. Führen Sie mcpo aus und zeigen Sie dabei auf Ihre Konfiguration: uvx mcpo --config config.json --port 8001

  4. Die MCP-Server-API ist verfügbar unter: http://localhost:8001/google_workspace (oder dem in config.json definierten Namen)

  5. OpenAPI-Dokumentation (Swagger UI) verfügbar unter: http://localhost:8001/google_workspace/docs

Mit Startbefehl (für Single-MCP-MCPO-Verwendung):

  1. Installieren Sie mcpo : uv pip install mcpo oder pip install mcpo

  2. Beginnen Sie mit uvx mcpo --port 8001 --api-key "top-secret" --server-type "streamablehttp" -- http://localhost:8000/mcp

  3. Die MCP-Server-API ist verfügbar unter: http://localhost:8001/openapi.json (oder dem in config.json definierten Namen)

  4. OpenAPI-Dokumentation (Swagger UI) verfügbar unter: http://localhost:8001/docs

  5. Starten Sie den Server im HTTP-Modus (siehe Starten des Servers )

  6. Senden Sie MCP JSON-Anfragen direkt an http://localhost:8000

  7. Nützlich zum Testen mit Tools wie curl oder benutzerdefinierten HTTP-Clients

  8. Kann verwendet werden, um Claude Desktop und andere MCP-Clients zu bedienen, die den neuen Streamable-HTTP-Transport noch über mcp-remote integrieren müssen:

  9. Sie können bei Bedarf auch im SSE-Fallbackmodus arbeiten.

Integration mit Open WebUI

So verwenden Sie diesen Server als Tool-Anbieter innerhalb von Open WebUI:

  1. mcpo -Konfiguration erstellen : Erstellen Sie eine Datei namens config.json mit der folgenden Struktur, damit mcpo den streambaren HTTP-Endpunkt als OpenAPI-Spezifikationstool verfügbar macht.

      {
       "mcpServers": {
           "google_workspace": {
               "type": "streamablehttp",
               "url": "http://localhost:8000/mcp"
           }
       }
    }
  2. Starten Sie den mcpo -Server :

    mcpo --port 8001 --config config.json --api-key "your-optional-secret-key"

    Dieser Befehl startet den mcpo -Proxy und bedient Ihr aktives (Port 8000 vorausgesetzt) Google Workspace MCP auf Port 8001.

  3. Open WebUI konfigurieren :

    • Navigieren Sie zu Ihren Open WebUI-Einstellungen

    • Gehen Sie zu „Verbindungen“ -> „Extras“

    • Klicken Sie auf „Tool hinzufügen“.

    • Geben Sie die Server-URL ein: http://localhost:8001/google_workspace (entsprechend der mcpo -Basis-URL und dem Servernamen aus config.json )

    • Wenn Sie einen --api-key mit mcpo verwendet haben, geben Sie ihn als API-Schlüssel ein

    • Speichern der Konfiguration

    • Die Google Workspace-Tools sollten jetzt bei der Interaktion mit Modellen in Open WebUI verfügbar sein

Erstmalige Authentifizierung

Wenn ein Tool aufgerufen wird, das Zugriff auf die Google-API erfordert:

  • Wenn user_google_email dem Tool bereitgestellt wird und Anmeldeinformationen fehlen oder ungültig sind : Der Server initiiert automatisch den OAuth 2.0-Flow. Eine Autorisierungs-URL wird in der MCP-Antwort zurückgegeben (oder in der Konsole angezeigt).

  • Wenn user_google_email NICHT angegeben ist und Anmeldeinformationen fehlen oder ungültig sind , gibt das Tool eine Fehlermeldung zurück, die den LLM zur Verwendung des zentralen Tools start_google_auth anweist. Der LLM sollte dann start_google_auth mit der E-Mail-Adresse des Benutzers und dem entsprechenden service_name (z. B. „Google Kalender“, „Google Docs“, „Gmail“, „Google Drive“) aufrufen. Dies gibt auch eine Autorisierungs-URL zurück.

Schritte für den Benutzer (sobald eine Autorisierungs-URL erhalten wurde):

  1. Öffnen Sie die bereitgestellte Autorisierungs-URL in einem Webbrowser.

  2. Melden Sie sich beim Google-Konto an und erteilen Sie die angeforderten Berechtigungen für den angegebenen Dienst.

  3. Nach der Autorisierung leitet Google den Browser zu http://localhost:8000/oauth2callback (oder Ihrer konfigurierten Umleitungs-URI) weiter.

  4. Der MCP-Server verarbeitet diesen Rückruf, tauscht den Autorisierungscode gegen Token aus und speichert die Anmeldeinformationen sicher.

  5. Der LLM kann dann die ursprüngliche Anfrage wiederholen. Nachfolgende Aufrufe für denselben Benutzer und Dienst sollten ohne erneute Authentifizierung funktionieren, bis das Aktualisierungstoken abläuft oder widerrufen wird.


🧰 Verfügbare Tools

Hinweis : Die erstmalige Verwendung eines Tools für einen bestimmten Google-Dienst kann den OAuth-Authentifizierungsablauf auslösen, wenn keine gültigen Anmeldeinformationen gespeichert sind und dem Tool die E-Mail- user_google_email übergeben wurde. Ist eine Authentifizierung erforderlich und wurde dem Tool die E-Mail-Adresse user_google_email nicht übergeben, sollte der LLM das zentralisierte Tool start_google_auth (definiert in core/server.py ) mit der E-Mail-Adresse des Benutzers und dem entsprechenden service_name verwenden.

📅 Google Kalender

Quelle: gcalendar/calendar_tools.py

Werkzeug

Beschreibung

Parameter

start_google_auth

(Zentralisiert in core/server.py ) Startet den OAuth 2.0-Authentifizierungsablauf für ein bestimmtes Google-Konto und einen bestimmten Google-Dienst. Verwenden Sie diese Option, wenn keine gültigen Anmeldeinformationen verfügbar sind oder ein Tool aufgrund fehlender Authentifizierung fehlschlägt und keine E-Mail-Adresse angegeben wurde.

user_google_email (erforderlich): Die Google-E-Mail-Adresse des Benutzers• service_name (erforderlich): Der Name des Google-Dienstes (z. B. „Google Kalender“, „Google Docs“, „Gmail“, „Google Drive“)

list_calendars

Listet alle Kalender auf, auf die der authentifizierte Benutzer zugreifen kann.

user_google_email (optional): Wird verwendet, wenn die Sitzung nicht authentifiziert ist. • mcp_session_id (automatisch eingefügt).

get_events

Ruft bevorstehende Ereignisse aus einem angegebenen Kalender innerhalb eines Zeitbereichs ab.

calendar_id (optional): Kalender-ID (Standard: primary ) • time_min (optional): Startzeit (RFC3339 oder YYYY-MM-DD ) • time_max (optional): Endzeit (RFC3339 oder YYYY-MM-DD ) • max_results (optional): Maximale Anzahl von Ereignissen (Standard: 25) • user_google_email (optional) • mcp_session_id (automatisch eingefügt)

create_event

Erstellt ein neues Kalenderereignis. Unterstützt ganztägige und zeitgesteuerte Ereignisse.

summary (erforderlich): Titel der Veranstaltung• start_time (erforderlich): Startzeit (RFC3339 oder YYYY-MM-DD )• end_time (erforderlich): Endzeit (RFC3339 oder YYYY-MM-DD )• calendar_id ID (optional): Kalender-ID (Standard: primary )• description , location , attendees , timezone (optional)• user_google_email -Mail (optional)• MCP mcp_session_id (automatisch eingefügt)

modify_event

Aktualisiert ein vorhandenes Ereignis anhand der ID. Nur die angegebenen Felder werden geändert.

event_id (erforderlich): ID des zu ändernden Ereignisses• calendar_id (optional): Kalender-ID (Standard: primary )• summary , start_time , end_time , description , location , attendees , timezone (optional)• user_google_email (optional)• mcp_session_id (automatisch eingefügt)

delete_event

Löscht ein Ereignis anhand der ID.

event_id (erforderlich): ID des zu löschenden Ereignisses• calendar_id (optional): Kalender-ID (Standard: primary )• user_google_email (optional)• mcp_session_id (automatisch eingefügt)

ℹ️ Alle Kalendertools unterstützen die Authentifizierung über die aktuelle MCP-Sitzung ( mcp_session_id ) oder über user_google_email . Ist keine der beiden Optionen verfügbar und eine Authentifizierung erforderlich, gibt das Tool einen Fehler zurück und fordert den LLM auf, das zentrale Tool start_google_auth mit der E-Mail-Adresse des Benutzers und service_name="Google Calendar" zu verwenden.

🕒 Datums-/Zeitparameter: Die Tools akzeptieren sowohl vollständige RFC3339-Zeitstempel (z. B. 2024-05-12T10:00:00Z) als auch einfache Datumsangaben (z. B. 2024-05-12). Der Server formatiert sie automatisch nach Bedarf.

📁 Google Drive

Quelle: gdrive/drive_tools.py

Werkzeug

Beschreibung

Parameter

search_drive_files

Sucht nach Dateien und Ordnern im gesamten Laufwerk des Benutzers

query (erforderlich): Suchabfragezeichenfolge (zB name contains 'report' ) • max_results (optional): Maximale Anzahl der zurückzugebenden Dateien

get_drive_file_content

Ruft den Inhalt einer bestimmten Datei ab

file_id (erforderlich): Die ID der Datei• mime_type (optional): Geben Sie das gewünschte Exportformat an

list_drive_items

Listet Dateien und Ordner in einem bestimmten Ordner oder im Stammverzeichnis auf

folder_id (optional): Die ID des aufzulistenden Ordners (standardmäßig root)• max_results (optional): Maximale Anzahl der zurückzugebenden Elemente

create_drive_file

Erstellt eine neue Datei in Google Drive

name (erforderlich): Der gewünschte Name für die neue Datei• content (erforderlich): Der Textinhalt, der in die Datei geschrieben werden soll• folder_id (optional): Die ID des übergeordneten Ordners• mime_type (optional): Der MIME-Typ der Datei (standardmäßig text/plain “)

Abfragesyntax : Informationen zu Google Drive-Suchabfragen finden Sie unter Drive-Suchabfragesyntax

📧 Google Mail

Quelle: gmail/gmail_tools.py

Werkzeug

Beschreibung

Parameter

search_gmail_messages

Durchsuchen Sie E-Mail-Nachrichten mit den standardmäßigen Gmail-Suchoperatoren (Von, Betreff usw.).

query (erforderlich): Suchzeichenfolge (z. B. "from:foo subject:bar is:unread" ) • user_google_email (optional) • page_size (optional, Standard: 10) • mcp_session_id (wird automatisch eingefügt)

get_gmail_message_content

Erhalten Sie Betreff, Absender und Nur-Text- Text einer E-Mail anhand der Nachrichten-ID.

message_id (erforderlich) • user_google_email -E-Mail (optional) • mcp_session_id (automatisch eingefügt)

send_gmail_message

Senden Sie eine E-Mail im Nur-Text-Format über das Gmail-Konto des Benutzers.

to (erforderlich): E-Mail-Adresse des Empfängers • subject (erforderlich) • body (erforderlich) • user_google_email (optional) • mcp_session_id (automatisch eingefügt)

draft_gmail_message

Erstellen Sie einen E-Mail-Entwurf im Gmail-Konto des Benutzers.

subject (erforderlich): E-Mail-Betreff• body (erforderlich): E-Mail-Text (Nur-Text)• to (optional): E-Mail-Adresse des Empfängers• user_google_email -Mail (optional)• mcp_session_id (automatisch eingefügt)

Abfragesyntax : Informationen zu Gmail-Suchabfragen finden Sie unter Gmail-Suchabfragesyntax

📝 Google Docs

Quelle: gdocs/docs_tools.py

Werkzeug

Beschreibung

Parameter

search_docs

Suchen Sie nach Google Docs nach Namen (mithilfe der Drive-API).

query (erforderlich): Text, nach dem in Dokumentnamen gesucht werden soll• user_google_email (optional)• page_size (optional, Standard: 10)• mcp_session_id (automatisch eingefügt)

get_doc_content

Rufen Sie den Nur-Text-Inhalt eines Google-Dokuments anhand seiner Dokument-ID ab.

document_id (erforderlich) • user_google_email -Mail (optional) • mcp_session_id (automatisch eingefügt)

list_docs_in_folder

Listet alle Google Docs in einem bestimmten Drive-Ordner auf (nach Ordner-ID, Standard = root ).

folder_id -ID (optional, Standard: 'root' ) • Benutzer-Google- user_google_email (optional) • page_size (optional, Standard: 100) • mcp_session_id (automatisch eingefügt)

create_doc

Erstellen Sie ein neues Google-Dokument, optional mit anfänglichem Inhalt.

title (erforderlich): Name für das Dokument• content (optional, Standard: leer)• user_google_email (optional)• mcp_session_id (automatisch eingefügt)


🛠️ Entwicklung

Projektstruktur

google_workspace_mcp/
├── .venv/             # Virtual environment (created by uv)
├── auth/              # OAuth handling logic (google_auth.py, oauth_manager.py)
├── core/              # Core MCP server logic (server.py)
├── gcalendar/         # Google Calendar tools (calendar_tools.py)
├── gdocs/             # Google Docs tools (docs_tools.py)
├── gdrive/            # Google Drive tools (drive_tools.py)
├── gmail/             # Gmail tools (gmail_tools.py)
├── .gitignore         # Git ignore file
├── client_secret.json # Google OAuth Credentials (DO NOT COMMIT)
├── config.json        # Example mcpo configuration
├── main.py            # Main server entry point (imports tools)
├── mcp_server_debug.log # Log file for debugging
├── pyproject.toml     # Project metadata and dependencies (for uv/pip)
├── README.md          # This file
├── uv.lock            # uv lock file

Port-Handling für OAuth

Der Server verarbeitet die OAuth 2.0-Umleitungs-URI ( /oauth2callback ) geschickt, ohne dass ein separates Webserver-Framework erforderlich ist:

  • Es nutzt die integrierten HTTP-Serverfunktionen der zugrunde liegenden MCP-Bibliothek, wenn es im HTTP-Modus oder über mcpo ausgeführt wird

  • Eine benutzerdefinierte MCP-Route ist speziell für /oauth2callback auf Port 8000 registriert

  • Wenn Google den Benutzer nach der Autorisierung zurückleitet, fängt der MCP-Server die Anfrage auf dieser Route ab

  • Das auth Modul extrahiert den Autorisierungscode und schließt den Token-Austausch ab

  • Dies erfordert, dass OAUTHLIB_INSECURE_TRANSPORT=1 bei lokaler Ausführung gesetzt wird, da der Rückruf http://localhost verwendet.

Debuggen

Detaillierte Protokolle, einschließlich Authentifizierungsschritten und API-Aufrufen, finden Sie in der Datei mcp_server_debug.log . Aktivieren Sie bei Bedarf die Debug-Protokollierung.

  • Überprüfen Sie, ob client_secret.json korrekt und vorhanden ist

  • Stellen Sie sicher, dass in der Google Cloud Console die richtige Umleitungs-URI ( http://localhost:8000/oauth2callback ) konfiguriert ist

  • Bestätigen Sie, dass die erforderlichen APIs (Kalender, Drive, Gmail) in Ihrem Google Cloud-Projekt aktiviert sind.

  • Überprüfen Sie, ob OAUTHLIB_INSECURE_TRANSPORT=1 in der Umgebung eingestellt ist, in der der Serverprozess ausgeführt wird.

  • Suchen Sie während des browserbasierten OAuth-Flows nach bestimmten Fehlermeldungen

Überprüfen Sie die Serverprotokolle auf Tracebacks oder Fehlermeldungen, die von den Google-APIs zurückgegeben werden.

Neue Tools hinzufügen

  1. Wählen oder erstellen Sie das entsprechende Modul (z. B. gdocs/gdocs_tools.py ).

  2. Importieren Sie die erforderlichen Bibliotheken (Google API-Clientbibliothek usw.).

  3. Definieren Sie eine async Funktion für Ihre Toollogik. Verwenden Sie Typhinweise für Parameter

  4. Dekorieren Sie die Funktion mit @server.tool("your_tool_name")

  5. Erhalten Sie innerhalb der Funktion authentifizierte Anmeldeinformationen:

from auth.google_auth import get_credentials, CONFIG_CLIENT_SECRETS_PATH
# ...
credentials = await asyncio.to_thread(
    get_credentials,
    user_google_email=your_user_email_variable, # Optional, can be None if session_id is primary
    required_scopes=YOUR_SPECIFIC_SCOPES_LIST,  # e.g., [CALENDAR_READONLY_SCOPE]
    client_secrets_path=CONFIG_CLIENT_SECRETS_PATH,
    session_id=your_mcp_session_id_variable    # Usually injected via Header
)
if not credentials or not credentials.valid:
    # Handle missing/invalid credentials, possibly by calling start_auth_flow
    # from auth.google_auth (which is what service-specific start_auth tools do)
    pass
  1. Erstellen Sie den Google API-Dienstclient: service = build('drive', 'v3', credentials=credentials)

  2. Implementieren Sie die Logik zum Aufrufen der Google-API

  3. Gehen Sie mit potenziellen Fehlern elegant um

  4. Geben Sie die Ergebnisse als JSON-serialisierbares Wörterbuch oder als Liste zurück

  5. Importieren Sie die Tool-Funktion in main.py , damit sie beim Server registriert wird

  6. Definieren Sie die erforderlichen servicespezifischen Bereichskonstanten im Modul Ihres Tools

  7. Aktualisieren Sie pyproject.toml wenn neue Abhängigkeiten erforderlich sind

Umfangsverwaltung : Die globale SCOPES -Liste in config/google_config.py wird für den ersten OAuth-Zustimmungsbildschirm verwendet. Einzelne Tools sollten beim Aufruf get_credentials die minimal erforderlichen required_scopes anfordern.


🔒 Sicherheitshinweise

  • client_secret.json : Diese Datei enthält vertrauliche Anmeldeinformationen. Übergeben Sie sie NIEMALS der Versionskontrolle. Stellen Sie sicher, dass sie in Ihrer .gitignore Datei aufgeführt ist. Bewahren Sie sie sicher auf.

  • Benutzertoken : Authentifizierte Benutzeranmeldeinformationen (Aktualisierungstoken) werden lokal in Dateien wie credentials-<user_id_hash>.json gespeichert. Schützen Sie diese Dateien, da sie Zugriff auf die Google-Kontodaten des Benutzers gewähren. Stellen Sie sicher, dass sie auch in .gitignore enthalten sind.

  • OAuth-Rückrufsicherheit : Die Verwendung von http://localhost für den OAuth-Rückruf ist für installierte Anwendungen während der Entwicklung Standard, erfordert jedoch OAUTHLIB_INSECURE_TRANSPORT=1 . Für Produktionsbereitstellungen außerhalb von localhost MÜSSEN Sie HTTPS für die Rückruf-URI verwenden und diese in der Google Cloud Console entsprechend konfigurieren.

  • mcpo -Sicherheit : Wenn Sie mcpo verwenden, um den Server über das Netzwerk verfügbar zu machen, beachten Sie:

    • Verwenden der Option --api-key für die Basisauthentifizierung

    • Ausführen mcpo hinter einem Reverse-Proxy (wie Nginx oder Caddy), um die HTTPS-Terminierung, die ordnungsgemäße Protokollierung und eine robustere Authentifizierung zu handhaben

    • Binden Sie mcpo nur an vertrauenswürdige Netzwerkschnittstellen, wenn es über localhost hinaus verfügbar gemacht wird

  • Umfangsverwaltung : Der Server fordert spezifische OAuth-Umfänge (Berechtigungen) für Kalender, Drive und Gmail an. Benutzer gewähren bei der ersten Authentifizierung Zugriff basierend auf diesen Umfängen. Fordern Sie keine umfassenderen Umfänge an, als für die implementierten Tools erforderlich sind.


Screenshots:

📄 Lizenz

Dieses Projekt ist unter der MIT-Lizenz lizenziert – Einzelheiten finden Sie in der Datei LICENSE .

Available Tools

122 tools
append_table_rowsAppend Table RowsA

Appends rows to a structured table in a Google Sheet. The rows are added to the end of the table body, automatically extending the table range.

Use list_sheet_tables first to find the table ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYes2D array of values to append. Each inner list is one row. Can be a JSON string or Python list. Required.
table_idYesThe ID of the table to append to (get from list_sheet_tables). Required.
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark the tool as non-read-only and non-idempotent. The description adds that rows are added to the end and the table range automatically extends, which is useful behavioral context beyond what annotations provide. No contradiction with annotations.

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?

Two succinct sentences, front-loaded with the primary action, no redundant information. Each sentence earns its place by stating what the tool does and a key prerequisite.

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

Completeness4/5

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

With an output schema present and annotations covering the mutation and side-effect profile, the description is sufficiently complete. It explains the core behavior and the necessary preliminary step, without needing to detail return values or error handling for this level of complexity.

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%, with all four parameters described. The description only reinforces the relationship between table_id and list_sheet_tables, which is already in the schema, and does not add meaningful extra semantics for parameters like values or spreadsheet_id.

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?

Description clearly states the tool 'Appends rows to a structured table in a Google Sheet', specifying the verb and resource. This distinguishes it from sibling tools like create_table_with_data and modify_sheet_values by focusing on appending to existing structured tables, and mentions the automatic extension of the table range.

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

Usage Guidelines4/5

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

The description explicitly advises 'Use list_sheet_tables first to find the table ID', providing a concrete prerequisite. It does not enumerate alternatives or exclusions, but the context within the Sheets toolset makes when-to-use clear enough.

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

batch_modify_gmail_message_labelsBatch Modify Gmail Message LabelsA
Destructive

Adds or removes labels from multiple Gmail messages in a single batch request.

Takes MESSAGE ids, not thread ids. Gmail's batch endpoint returns no per-message result and silently ignores ids it does not recognise, so by default this reads the messages back afterwards and reports which ids actually changed.

ParametersJSON Schema
NameRequiredDescriptionDefault
verifyNoRead the messages back and report per-id outcomes. Costs one extra (batched) read per id. Set False for very large sweeps where that cost matters and an unverified result is acceptable.
message_idsYesA list of message IDs to modify.
add_label_idsNoList of label IDs to add to the messages.
remove_label_idsNoList of label IDs to remove from the messages.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses behavior not visible in annotations: the batch endpoint silently ignores unrecognized ids, returns no per-message result, and defaults to reading messages back to verify which ids changed. This significantly strengthens the agent's understanding of the mutation's real-world behavior.

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 and front-loaded with the main action, then delivers the critical caveats in clear, economical sentences. Every sentence contributes actionable information.

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

Completeness4/5

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

The description covers the most important operational quirks and the verify behavior, and an output schema exists so return values need not be spelled out. Minor gaps remain, such as not explicitly requiring at least one of add_label_ids or remove_label_ids and not naming the singular alternative for redirection.

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?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful value by clarifying that message_ids must be MESSAGE ids rather than thread ids, and by explaining the verify parameter's purpose in relation to the endpoint's silent-id behavior.

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 clearly states the specific action ('adds or removes labels'), the resource ('multiple Gmail messages'), and the batching scope ('single batch request'). This distinguishes it from sibling message-label tools like modify_gmail_message_labels.

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

Usage Guidelines3/5

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

The description implies use for batch label modifications and warns that it takes MESSAGE ids, not thread ids, which is useful guidance. However, it never explicitly names the singular sibling tool or states when to prefer this batch version over alternatives, leaving some selection inference to the agent.

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

batch_update_docBatch Update DocA
Destructive

Executes multiple low-level document operations in a single atomic batch update.

For normal header/footer text, prefer update_doc_headers_footers. Only use create_header_footer here for advanced section-break layouts.

RECOMMENDED WORKFLOW FOR BUILDING DOCUMENTS:

To avoid index calculation errors, build documents in phases:

PHASE 1 - INSERT ALL CONTENT (use end_of_segment=true, no index math): Append text, section breaks, and page breaks sequentially. Each operation appends to the end of the body. No index needed. Example batch: [ {"type": "insert_text", "end_of_segment": true, "text": "Report Title\n"}, {"type": "insert_text", "end_of_segment": true, "text": "\nExecutive Summary\n"}, {"type": "insert_text", "end_of_segment": true, "text": "Revenue grew 15%.\n"}, {"type": "insert_section_break", "end_of_segment": true, "section_type": "NEXT_PAGE"}, {"type": "insert_text", "end_of_segment": true, "text": "Detailed Analysis\n"} ]

PHASE 2 - CREATE HEADERS/FOOTERS (if needed): For normal header/footer text, use update_doc_headers_footers (it auto-creates if missing and writes the content for you). Only include create_header_footer operations in a batch when you are intentionally managing advanced section-break-specific layouts.

ParametersJSON Schema
NameRequiredDescriptionDefault
operationsYesList of operation dicts. Each operation MUST have a 'type' field. All operations accept an optional 'tab_id' to target a specific tab.
document_idYesID of the document to update
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description doesn't need to restate safety. It adds value by disclosing atomicity ('single atomic batch update') and warning about 'index calculation errors' with a phased workflow mitigation. This goes beyond the annotations without contradicting them.

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

Conciseness4/5

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

The description is longer than average but well-structured with a core statement, a clear alternative reference, and a WORKFLOW section with headings. The example batch is illustrative and earned its place given the tool's complexity. It could be slightly tighter, but overall every section contributes to usability.

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

Completeness4/5

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

Given the tool's extensive operation schema and the presence of an output schema (per context signals), the description is reasonably complete. It covers key decision points (when to use this vs. update_doc_headers_footers, how to avoid index pitfalls) without repeating schema details. It doesn't enumerate all operation types, but the schema handles that.

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?

Schema description coverage is 100% for the three top-level parameters, so the baseline is 3. The description adds semantic guidance through concrete examples (e.g., using end_of_segment=true to avoid index math) and clarifies when operation types like create_header_footer should be used. This supplements the schema meaningfully.

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 uses a specific verb+resource: 'Executes multiple low-level document operations in a single atomic batch update.' It clearly distinguishes this from sibling tools by explicitly stating 'For normal header/footer text, prefer update_doc_headers_footers' and scoping create_header_footer to advanced section-break layouts.

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 provides explicit when-to-use guidance with a named alternative: 'prefer update_doc_headers_footers' for normal headers/footers, and 'Only use create_header_footer here for advanced section-break layouts.' The recommended two-phase workflow (insert content with end_of_segment=true, then create headers/footers) gives clear operational context.

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

batch_update_formBatch Update FormA
Destructive

Apply batch updates to a Google Form.

Supports adding, updating, and deleting form items, as well as updating form metadata and settings. This is the primary method for modifying form content after creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesThe ID of the form to update.
requestsYesList of update requests to apply. Supported request types: - createItem: Add a new question or content item - updateItem: Modify an existing item - deleteItem: Remove an item - moveItem: Reorder an item - updateFormInfo: Update form title/description - updateSettings: Modify form settings (e.g., quiz mode)
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds context about the primary use but does not disclose additional behavioral traits such as side effects, error handling, or atomicity. It does not contradict annotations, but adds limited transparency beyond what annotations and schema provide.

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 two sentences, front-loaded with the core action, and every sentence adds value. It avoids verbosity and presents the scope of the tool efficiently.

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

Completeness4/5

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

Given the tool's complexity and rich schema, the description provides sufficient orientation: it names operations, states it is the primary update method, and aligns with annotations. It does not explain atomicity or failure modes, but the output schema and annotations cover much of the necessary context, making it reasonably complete.

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%, with the 'requests' parameter listing supported request types in detail. The description mentions updating metadata and settings, but adds no extra meaning beyond the schema. Baseline 3 applies because the schema does the heavy lifting.

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 clearly states the tool's function: 'Apply batch updates to a Google Form.' It enumerates supported operations (adding, updating, deleting form items, metadata and settings) and explicitly distinguishes it as 'the primary method for modifying form content after creation,' differentiating it from sibling tools like create_form and get_form.

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

Usage Guidelines4/5

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

The description provides clear context by stating this is the primary method for modifying an existing form, implying it should be used after creation. However, it does not explicitly name alternatives or state when not to use it, so it falls short of a 5.

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

batch_update_presentationBatch Update PresentationC
Destructive

Apply batch updates to a Google Slides presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestsYesList of update requests to apply.
presentation_idYesThe ID of the presentation to update.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

The annotations already indicate destructiveHint=true and readOnlyHint=false, and the description adds no additional behavioral context beyond 'apply batch updates.' It does not disclose effects, required permissions, or any implications of the destructive nature.

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 a single, concise sentence that front-loads the core purpose. There is no filler or repetition, making it efficient and appropriately sized.

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

Completeness2/5

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

This is a complex tool with a free-form 'requests' array, yet the description provides no context on what constitutes a valid batch update request or how to construct one. The output schema exists, but the description still needs to explain the input domain sufficiently, which it does not.

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 coverage is 100%, so the baseline is 3. The description adds no parameter-specific meaning beyond what the schema provides. The 'requests' parameter is described generically as 'List of update requests to apply', but no detail is given about valid request types or structure.

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

Purpose4/5

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

The description clearly states the tool applies batch updates to a Google Slides presentation, using a specific verb and resource. It is distinct from sibling tools like get_presentation or create_presentation, though it doesn't explicitly differentiate itself from potential single-update alternatives.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus alternatives. The description merely states what it does, without mentioning prerequisites, exclusions, or contexts where other tools (e.g., batch_update_doc, import_to_google_slides) would be more appropriate.

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

check_drive_file_public_accessCheck Drive File Public AccessA
Read-onlyIdempotent

Searches for a file by name and checks if it has public link sharing enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
drive_idNoID of the shared drive to scope the search to. When set, the underlying files.list call uses corpora='drive' and the given driveId, which is required to reliably find files that live only in that shared drive. When None, behaviour is unchanged (default API corpora applies).
file_nameYesThe name of the file to check.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the non-mutating nature is clear. The description adds the specific check behavior but does not disclose how it handles multiple files with the same name, whether it returns partial matches, or what 'public link sharing' precisely entails (e.g., 'Anyone with link'). This is some added context but not rich behavioral detail.

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 a single concise sentence, front-loading the key action and result. No filler or redundant content. It is appropriately sized for a simple lookup tool.

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

Completeness4/5

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

The tool has an output schema (not shown) and high schema/annotation coverage, so describing return values is not obligatory. The description covers the primary scenario, but leaves minor ambiguities around search behavior (e.g., exact match, case sensitivity, multiple matches). Given the low complexity, this is nearly complete.

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 coverage is 100%: each parameter has a description. The tool description does not add meaning beyond the schema; it simply echoes 'file name'. The drive_id parameter is well-documented in the schema, but the description doesn't clarify how it affects search results. Baseline 3 is appropriate.

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 clearly states the tool's function: it searches for a file by name and checks if public link sharing is enabled. This uses a specific verb ('searches', 'checks') and resource ('Drive file'), and is distinct from sibling tools like get_drive_file_permissions or get_drive_shareable_link.

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

Usage Guidelines3/5

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

The description implies usage: use when you need to verify public link sharing on a named file. However, it does not provide explicit when-to-use vs alternatives, such as noting that get_drive_file_permissions provides broader permission details or that get_drive_shareable_link returns a link. No exclusions are mentioned.

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

copy_drive_fileCopy Drive FileA

Creates a copy of an existing Google Drive file.

This tool copies the template document to a new location with an optional new name. The copy maintains all formatting and content from the original file.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesThe ID of the file to copy. Required.
new_nameNoNew name for the copied file. If not provided, uses "Copy of [original name]".
parent_folder_idNoThe ID of the folder where the copy should be created. Defaults to 'root' (My Drive).root
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate a non-destructive write operation, and the description adds that the copy maintains all formatting and content. This provides useful behavioral context beyond annotations, though it does not discuss permissions or ownership.

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 and front-loaded, with two sentences that state the core function and then add valuable context. No redundant or unnecessary wording.

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

Completeness4/5

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

The description covers the tool's purpose, behavior, and result, complemented by a full schema and output schema. It is sufficient for understanding the tool, though it could mention prerequisites or side effects like permission inheritance.

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 coverage is 100% with detailed parameter descriptions. The description adds no additional parameter semantics beyond what the schema already provides, so it meets the baseline but does not exceed it.

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 clearly states the tool creates a copy of an existing Google Drive file with an optional new name and location, using specific verbs and resources. It distinguishes itself from sibling tools like create_drive_file or update_drive_file by focusing on duplication.

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

Usage Guidelines3/5

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

The description implies usage for copying template documents but does not explicitly contrast with alternatives or state when not to use it. It lacks direct guidance on choosing this tool over siblings like create_drive_file.

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

create_calendarCreate CalendarA

Creates a new secondary Google Calendar.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesThe title/name of the new calendar.
timezoneNoIANA timezone for the calendar (e.g. 'America/New_York').
descriptionNoAn optional description for the calendar.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description adds the 'secondary' scope, which offers some behavioral context. However, it does not disclose potential side effects, auth requirements, or error conditions, so the added value is modest.

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 a single sentence conveying the essential purpose. There is no fluff or redundancy. It is well-structured and front-loaded.

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

Completeness4/5

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

For a simple create operation with a full input schema and an output schema, the description is adequate. It clarifies the calendar type ('secondary'), which is key contextual information. It does not explain the return value, but the output schema covers that.

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 coverage is 100%; every parameter has a clear description in the schema. The tool description adds no additional parameter semantics, so the baseline of 3 applies.

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 clearly states the action ('Creates') and the resource ('a new secondary Google Calendar'). It distinguishes itself from sibling tools like list_calendars or manage_event by specifying 'secondary', making the purpose unmistakable.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or alternative tools. The context is completely absent beyond the basic action.

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

create_docCreate DocA

Creates a new Google Doc and optionally inserts initial content.

After creation, the document body starts at index 1. A new empty doc has total length 2 (one section break at index 0, one newline at index 1).

To build a rich document after creation, use batch_update_doc with insert_text operations using end_of_segment=true to append content sequentially without calculating indices. Then call inspect_doc_structure to get exact positions before applying formatting in a separate batch call.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle of the new document
contentNoOptional initial plain text content to insert
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Although annotations already indicate this is a write operation (readOnlyHint false), the description adds valuable behavioral context about the document body starting at index 1 and total length 2, which helps the agent understand the internal structure. It also mentions the optional content insertion but does not disclose side effects like authentication or rate limits, though these are less critical for a creation tool.

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

Conciseness4/5

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

The description is well-structured with a clear topic sentence followed by technical details and a recommended workflow. It is slightly verbose due to the explicit indices and workflow steps, but every sentence contributes useful information, and the main purpose appears first. No redundant phrasing.

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 highly complete for a creation tool: it states the primary function, optional content insertion, initial document structure, and a robust follow-up workflow (batch_update_doc + inspect_doc_structure). With an output schema present, it does not need to explain return values. The description covers both immediate constraints and recommended next steps, making it self-sufficient.

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?

The input schema covers all parameters with descriptions (100% coverage), so the description does not need to elaborate on them. However, the description adds some context by explaining that content is 'optional initial plain text content' and gives structural details about how the document is initialized, but this is more about behavior than parameter semantics. Thus, a baseline of 3 is appropriate.

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 clearly states 'Creates a new Google Doc and optionally inserts initial content,' which is a specific verb+resource. It distinguishes from sibling tools like batch_update_doc, inspect_doc_structure, and get_doc_content by focusing on the creation action and its unique initial-state details.

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 provides a workflow: use create_doc for creation, then use batch_update_doc with insert_text and end_of_segment=true to append content, and finally inspect_doc_structure before formatting. This clearly guides the agent on when to use this tool versus alternatives and how to chain subsequent steps.

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

create_drive_fileCreate Drive FileA

Creates a new file in Google Drive, supporting creation within shared drives. Accepts direct text content, inline base64 bytes, or a fileUrl to fetch content from. This stores the supplied bytes without converting them to Google Docs, Sheets, or Slides. Use the matching import_to_google_* tool for Google-native conversion.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNoIf provided, the content to write to the file.
fileUrlNoIf provided, fetches the file content from this URL. Supports file://, http://, and https:// protocols.
file_nameYesThe name for the new file.
folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, this must be a folder ID within the shared drive.root
mime_typeNoThe MIME type of the file. Defaults to 'text/plain'.text/plain
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
base64_contentNoStandard base64-encoded file bytes.
content_mime_typeNoMIME type for base64_content uploads.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent operation. The description adds valuable behavior beyond that: it stores the exact bytes without converting formats, and it may fetch content from a URL. It does not discuss failure modes, size limits, or parameter precedence, but the core behavioral traits are well disclosed.

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 efficient sentences, front-loaded with the primary action and scope, followed by input modes and the key non-conversion caveat plus routing to the sibling tool. No wasted words.

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

Completeness4/5

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

Given the rich 100%-covered schema and an output schema, the description provides enough high-level context for an agent to understand the tool's purpose and boundaries. A minor gap is that it does not specify what happens if multiple content sources (content, base64_content, fileUrl) are provided simultaneously.

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 coverage is 100%, so the baseline is 3. The description groups content parameters into three modes ('direct text content, inline base64 bytes, or a fileUrl') but mostly restates what the schema already documents. It adds little parameter-specific detail beyond that conceptual grouping.

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 specific verb ('Creates') and resource ('a new file in Google Drive'), and adds clarifying scope: creation within shared drives and non-conversion to Google-native formats. It clearly distinguishes the tool from sibling import_to_google_* and Google-native creation tools.

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

Usage Guidelines4/5

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

The description explicitly states that for Google-native conversion the agent should use the matching import_to_google_* tool, giving a clear when-not-to-use signal. It does not, however, give guidance on how to choose among the three content input methods (text, base64, fileUrl) for different scenarios.

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

create_drive_folderCreate Drive FolderA

Creates a new folder in Google Drive, supporting creation within shared drives.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_nameYesThe name for the new folder.
parent_folder_idNoThe ID of the parent folder. Defaults to 'root'. For shared drives, use a folder ID within that shared drive.root
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description adds the shared drive support context, which is a useful behavioral nuance not captured by annotations. However, it does not disclose other potential traits such as permission requirements, error behavior, or whether the operation is reversible, so it offers limited additional transparency.

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 a single, concise sentence that immediately conveys the action and object. It avoids redundancy and is appropriately front-loaded.

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

Completeness4/5

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

Given the simple create operation, the schema (which documents all parameters, including the parent_folder_id default and shared drive usage), and the presence of an output schema, the description is fairly complete. It adds the key contextual detail of shared drive support. A slight gap is the lack of explicit mention of default behavior in My Drive, but that is covered by the parent_folder_id default, so a 4 is justified.

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 all three parameters (folder_name, parent_folder_id, user_google_email) are already documented. The tool description does not add any parameter-level detail beyond what the schema provides. Per the baseline for high schema coverage, a score of 3 is appropriate.

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 clearly states the tool's function: 'Creates a new folder in Google Drive.' The verb 'Creates' and resource 'folder' distinguish it from sibling tools like create_drive_file or create_doc. The added detail about supporting shared drives further specifies its scope.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. The description does not mention any exclusions or alternative tools for creating files or documents. The only hint is 'supporting creation within shared drives,' but this does not constitute explicit usage direction.

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

create_formCreate FormB

Create a new form using the title given in the provided form message in the request.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title of the form.
descriptionNoThe description of the form.
document_titleNoThe document title (shown in browser tab).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the tool's mutation profile is known. The description adds that it creates a new form, which is more specific, but does not disclose side effects, required permissions, or any other behavioral nuance.

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 one concise sentence with no unnecessary words, front-loaded with the core action and resource.

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

Completeness4/5

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

For a simple tool with full schema coverage and an output schema, the description is adequately complete. It could mention that the form is created in the user's Google account, but the required user_google_email parameter implies that without needing explicit explanation.

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?

The input schema provides full descriptions for all four parameters, so the baseline is 3. The description adds a small note about the title being sourced from the request message, but does not meaningfully expand on the parameters beyond the schema.

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

Purpose4/5

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

The description clearly states the action ('Create') and resource ('a new form'), making it distinct from sibling tools like get_form or batch_update_form. However, the phrase 'using the title given in the provided form message in the request' is slightly ambiguous about the source of the title.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, nor any prerequisites or context such as authentication or ownership. The description only states what the tool does, not when or why to choose it.

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

create_presentationCreate PresentationB

Create a new Google Slides presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoThe title for the new presentation. Defaults to "Untitled Presentation".Untitled Presentation
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already convey that this is a write operation (readOnlyHint=false, idempotentHint=false). The description adds no extra behavioral context such as where the presentation is created, whether it creates a file in Google Drive, or any side effects. With no additional context, it does not go beyond what annotations already provide.

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 a single, concise sentence that directly states the action and target. There is no unnecessary fluff or repetition. Every word adds value, making it highly efficient.

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

Completeness4/5

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

For a simple tool with just two parameters, a complete schema, and an output schema, the description is largely sufficient. It could mention that created presentations are empty or saved to the user's Drive, but the current information combined with schema and annotations provides enough context for this straightforward operation.

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?

The input schema fully describes both parameters (title and user_google_email) with 100% coverage. The description itself adds no parameter-specific meaning beyond the schema. This aligns with the baseline of 3 when the schema carries the load.

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 clearly states the verb 'Create' and the specific resource 'a new Google Slides presentation.' This distinguishes it from sibling tools like import_to_google_slides (which imports) and create_drive_file (which creates generic files). The purpose is unambiguous.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. It does not mention when not to use it, prerequisites, or how it differs from related tools like import_to_google_slides. The description is purely definitional and offers no context for selection.

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

create_reactionCreate ReactionB

Adds an emoji reaction to a Google Chat message.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message resource name (e.g. spaces/X/messages/Y).
emoji_unicodeYesThe emoji character to react with (e.g. 👍).
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

The description confirms the mutation ('Adds') and matches the readOnlyHint=false annotation. It adds some context by specifying the action's target, but does not disclose behavior such as duplicate handling, authentication requirements, or side-effect scope implied by openWorldHint=true.

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 a single, direct sentence with no redundant words. It is appropriately front-loaded and easy to parse.

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

Completeness3/5

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

The tool is simple with three required parameters and an output schema, but the description lacks usage context and fails to explain user_google_email. This is adequate for basic selection but leaves gaps for correct invocation in all scenarios.

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

Parameters2/5

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

The schema documents message_id and emoji_unicode, but user_google_email has no description. The tool description adds no parameter information and does not compensate for the undocumented parameter, leaving a gap in the 67% schema coverage.

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 uses a specific verb ('Adds') and identifies the exact resource ('emoji reaction to a Google Chat message'). This clearly distinguishes the tool from sibling tools like send_message or search_messages.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, no prerequisites, and no exclusions. The agent must infer usage solely from the name and schema.

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

create_script_projectCreate Script ProjectB

Creates a new Apps Script project.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesProject title
parent_idNoOptional Drive folder ID or bound container ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already indicate a write operation (readOnlyHint=false), and the description adds no new behavioral context beyond that. It does not disclose side effects, permission requirements, or what happens to existing resources, so it carries minimal additional value.

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 a single, clear sentence with no wasted words. It is appropriately front-loaded and serves its purpose without unnecessary detail.

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

Completeness3/5

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

For a simple create operation with well-documented parameters and an output schema, the description is minimally viable. However, it lacks guidance on when to use it and any context about project creation behavior, such as where projects are stored or the significance of parent_id, making it incomplete for richer decision-making.

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?

All three parameters have descriptions in the schema (100% coverage), so the description adds no extra meaning. The baseline of 3 applies because the schema does the heavy lifting, and the description does not introduce any parameter-specific details.

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 'Creates a new Apps Script project' uses a specific verb and resource, clearly distinguishing it from sibling tools like delete_script_project, get_script_project, and list_script_projects. It leaves no ambiguity about the tool's core function.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, nor any mention of prerequisites like authentication or choosing between Drive folder or bound container via parent_id. The description only states what it does, not when or how to use it.

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

create_sheetCreate SheetC

Creates a new sheet or duplicates an existing sheet (user_google_email: str, spreadsheet_id: str, sheet_name: Optional[str] = None, source_sheet_name: Optional[str] = None, insert_sheet_index: Optional[int] = None).

ParametersJSON Schema
NameRequiredDescriptionDefault
sheet_nameNo
spreadsheet_idYes
source_sheet_nameNo
user_google_emailYes
insert_sheet_indexNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

The description does not add significant behavioral context beyond what annotations already convey. It mentions the dual behavior (create vs duplicate) but does not disclose side effects, error conditions, or details about duplication (e.g., whether formatting is copied). The annotations already indicate a non-read-only operation, but the description fails to elaborate on important behavioral nuances.

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

Conciseness2/5

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

The description is a single sentence, but it is cluttered with an inline Python-style signature that disrupts readability. The action is front-loaded, but the parameter list is not well-integrated. It lacks clear structure and could be improved by separating the high-level behavior from parameter details.

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

Completeness2/5

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

Given the tool has 5 parameters and no schema descriptions, the description is insufficiently complete. It does not explain how to use the parameters in practice, what happens when creating versus duplicating, or what the expected outcome is beyond the basic operation. The presence of an output schema does not compensate for the lack of behavioral and parameter context.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the lack of parameter documentation. It only lists parameter names and types inline (e.g., 'user_google_email: str'), without explaining their meaning or relationships. For instance, the roles of 'sheet_name' and 'source_sheet_name' are not explicitly defined, leaving the agent to infer their purposes from the tool description.

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 clearly states the tool's primary function: 'Creates a new sheet or duplicates an existing sheet.' This uses a specific verb and resource, and it distinguishes the tool from siblings like create_spreadsheet (which creates a new spreadsheet) by focusing on sheets within an existing spreadsheet.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives. It does not mention scenarios, prerequisites, or exclusions. The description is purely functional and lacks any contextual direction for an agent deciding between this and similar tools.

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

create_spreadsheetCreate SpreadsheetC

Creates a new Google Spreadsheet.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title of the new spreadsheet. Required.
sheet_namesNoList of sheet names to create. If not provided, creates one sheet with default name.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

The description adds no behavioral information beyond what annotations already provide. It does not disclose any side effects, auth requirements, or details about what the created spreadsheet entails. Annotations indicate a write operation, which the description merely confirms.

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

Conciseness3/5

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

The description is a single concise sentence with no fluff, but it is highly redundant with the tool name and title. It is structurally fine but lacks informative content.

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

Completeness3/5

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

For a simple create operation, the combination of schema, annotations, and output schema covers most needs. However, the description does not clarify how this differs from 'create_sheet' or what happens to the created spreadsheet (e.g., where it is stored).

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?

The input schema provides 100% coverage with clear descriptions for all parameters. The description does not add any parameter-specific meaning, so the baseline of 3 applies.

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

Purpose4/5

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

The description clearly states the action (creates) and the resource (a new Google Spreadsheet). It is specific but does not distinguish from sibling tools like 'create_sheet' or 'import_to_google_sheets', so it lacks sibling differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. Sibling tools like 'create_sheet' and 'import_to_google_sheets' exist, but the description does not mention them or any usage context.

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

create_table_with_dataCreate Table with DataA

Creates a table and populates it with data in one reliable operation.

CRITICAL: YOU MUST CALL inspect_doc_structure FIRST TO GET THE INDEX!

MANDATORY WORKFLOW - DO THESE STEPS IN ORDER:

Step 1: ALWAYS call inspect_doc_structure first Step 2: Use the 'total_length' value from inspect_doc_structure as your index Step 3: Format data as 2D list: [["col1", "col2"], ["row1col1", "row1col2"]] Step 4: Call this function with the correct index and data

EXAMPLE DATA FORMAT: table_data = [ ["Header1", "Header2", "Header3"], # Row 0 - headers ["Data1", "Data2", "Data3"], # Row 1 - first data row ["Data4", "Data5", "Data6"] # Row 2 - second data row ]

CRITICAL INDEX REQUIREMENTS:

  • NEVER use index values like 1, 2, 10 without calling inspect_doc_structure first

  • ALWAYS get index from inspect_doc_structure 'total_length' field

  • Index must be a valid insertion point in the document

DATA FORMAT REQUIREMENTS:

  • Must be 2D list of strings only

  • Each inner list = one table row

  • All rows MUST have same number of columns

  • Use empty strings "" for empty cells, never None

  • Use debug_table_structure after creation to verify results

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYesDocument position (MANDATORY: get from inspect_doc_structure 'total_length')
tab_idNoOptional tab ID to create the table in a specific tab
table_dataYes2D list of strings - EXACT format: [["col1", "col2"], ["row1col1", "row1col2"]]
document_idYesID of the document to update
header_rowsNoNumber of leading rows to mark as a repeating header that reappears after each page break. Must be between 0 and the number of table rows (default: 0 = none)
bold_headersNoWhether to make first row bold (default: true)
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses critical behavioral constraints: index must come from inspect_doc_structure, table_data must be a 2D list of strings with uniform rows, use empty strings not None, and verify with debug_table_structure. These go beyond annotations (readOnlyHint false, etc.) and add context for correct invocation.

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

Conciseness4/5

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

The description is lengthy but structured with sections and headers. It front-loads the purpose and then gives essential steps. However, there is redundancy in repeating the inspect_doc_structure requirement multiple times, so it is not maximally concise, but still efficient for a complex tool.

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 7-parameter tool with a mandatory prerequisite, the description covers the workflow, data format, and verification thoroughly. It does not need to explain return values as an output schema exists. This is essentially complete for a tool of this complexity.

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?

Schema covers all parameters with descriptions, but the description enriches table_data with an explicit example and explains the index requirement in detail. It also clarifies empty cell handling. This adds value beyond the schema, so a 4 is appropriate.

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 'Creates a table and populates it with data in one reliable operation,' which clearly states the action (creates), resource (table), and scope (populates with data). This distinguishes it from sibling tools like append_table_rows or insert_doc_elements by focusing on table creation with data.

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

Usage Guidelines4/5

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

The description provides a mandatory workflow: always call inspect_doc_structure first, use total_length as index, format data as 2D list, then call this function. It also recommends debug_table_structure after creation. However, it does not explicitly state when not to use this tool versus alternatives, so it falls just short of a 5.

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

create_versionCreate VersionA

Creates a new immutable version of a script project.

Versions capture a snapshot of the current script code. Once created, versions cannot be modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
descriptionNoOptional description for this version
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description adds important behavioral nuance beyond the annotations: versions are immutable and cannot be modified after creation. This is disclosed clearly and complements the readOnlyHint=false annotation without contradiction.

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 only two sentences, front-loaded with the primary action, and each sentence adds value. No redundant or filler 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?

With annotations indicating a non-read-only, non-destructive operation and an output schema present, the description fully conveys the core purpose and key immutable-snapshot constraint. It is sufficient 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 coverage is 100% with clear descriptions for script_id and user_google_email, so the baseline is 3. The description adds no parameter-specific meaning 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 action ('Creates a new immutable version') and resource ('script project'), clearly distinguishing it from sibling tools like get_version or list_versions. It also explains what a version is (a snapshot of current script code).

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

Usage Guidelines4/5

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

The description makes the use case clear: create an immutable snapshot of current script code. However, it does not explicitly mention alternatives or when not to use it, though the verb 'creates' naturally differentiates from get_version/list_versions.

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

debug_docs_runtime_infoDebug Docs Runtime InfoA
Read-onlyIdempotent

Return runtime/source information for diagnosing stale MCP server instances.

This is a temporary diagnostic tool intended to verify which code checkout the running MCP server has loaded.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds that it is temporary and diagnostic, but doesn't detail what 'runtime/source information' includes or any constraints beyond that.

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?

Two concise sentences with the verb and purpose front-loaded. Every word adds value, no repetition of schema data, and the structure is efficient.

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

Completeness3/5

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

The tool is simple (one param, output schema exists), and annotations cover safety. However, the unexplained parameter and lack of detail about the returned information make this minimally adequate rather than complete. The description does not fully compensate for the 0% schema coverage.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not mention the 'user_google_email' parameter at all. The agent is given no hint about why this email is needed or how it affects results, leaving a significant gap.

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 clearly states the tool returns runtime/source information with a specific diagnostic purpose (verifying code checkout for stale MCP instances). This distinguishes it from sibling tools, which are mostly about document, Gmail, or Drive operations.

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

Usage Guidelines4/5

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

Provides clear context: use for diagnosing stale MCP server instances. It doesn't mention exclusions or alternatives, but for a temporary diagnostic tool, the intended use case is sufficiently specific.

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

debug_table_structureDebug Table StructureA
Read-onlyIdempotent

ESSENTIAL DEBUGGING TOOL - Use this whenever tables don't work as expected.

USE THIS IMMEDIATELY WHEN:

  • Table population put data in wrong cells

  • You get "table not found" errors

  • Data appears concatenated in first cell

  • Need to understand existing table structure

  • Planning to use populate_existing_table

WHAT THIS SHOWS YOU:

  • Exact table dimensions (rows × columns)

  • Each cell's position coordinates (row,col)

  • Current content in each cell

  • Insertion indices for each cell

  • Table boundaries and ranges

HOW TO READ THE OUTPUT:

  • "dimensions": "2x3" = 2 rows, 3 columns

  • "position": "(0,0)" = first row, first column

  • "current_content": What's actually in each cell right now

  • "insertion_index": Where new text would be inserted in that cell

WORKFLOW INTEGRATION:

  1. After creating table → Use this to verify structure

  2. Before populating → Use this to plan your data format

  3. After population fails → Use this to see what went wrong

  4. When debugging → Compare your data array to actual table structure

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYesID of the document to inspect
table_indexNoWhich table to debug (0 = first table, 1 = second table, etc.)
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds substantial context about what the tool reveals: exact dimensions, cell coordinates, current content, and insertion indices. It also explains how to read the output, going well beyond the structured annotation data.

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

Conciseness4/5

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

The description is long but well-structured with clear sections and bullet lists. It is front-loaded with the 'ESSENTIAL' tag and immediate use cases. While somewhat verbose, every section provides value for debugging scenarios.

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 the tool's moderate complexity, the description covers when to use it, what to expect in the output, and how to interpret that output. It also aligns with the output schema, making it a complete guide for the agent.

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?

The input schema provides complete descriptions for all three parameters (100% coverage), including the meaning of table_index and user_google_email. The tool description does not add new parameter-level semantics beyond the schema, but the schema alone is sufficient.

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 clearly states this is a debugging tool for table structure, with concrete use cases like 'table not found' errors and mispopulated cells. It distinguishes itself from general inspection tools by focusing on table dimensions, positions, and insertion indices.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use scenarios ('USE THIS IMMEDIATELY WHEN:') and workflow integration steps. However, it does not mention when not to use it or explicitly compare against sibling tools like inspect_doc_structure, so it falls short of the highest score.

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

delete_script_projectDelete Script ProjectA
Destructive

Deletes an Apps Script project.

This permanently deletes the script project. The action cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID to delete
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false. The description adds value by stating 'This permanently deletes the script project. The action cannot be undone,' reinforcing the irreversible nature beyond what annotations convey.

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 and front-loaded: two sentences that state the action and add the critical permanence warning. Every word earns its place with no redundancy.

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

Completeness4/5

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

For a destructive tool with an output schema and annotations, the description covers the essential irreversible nature. It lacks usage guidance but is otherwise complete for a simple delete operation; a stronger description might explicitly warn to confirm the script ID.

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%, with both parameters documented. The description adds no extra meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

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 clearly states 'Deletes an Apps Script project' with a specific verb and resource. It is unambiguous and distinguishes from sibling tools like get_script_project or update_script_content, as deletion is unique.

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

Usage Guidelines3/5

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

The description implies this tool is for permanently removing a script project, but provides no explicit guidance on when to use it versus alternatives, nor any caveats or prerequisites. It is adequate but lacks explicit contextual direction.

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

download_chat_attachmentDownload Chat AttachmentA

Downloads an attachment from a Google Chat message and saves it to local disk.

In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe message resource name (e.g. spaces/X/messages/Y).
attachment_indexNoZero-based index of the attachment to download (default 0).
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds valuable behavioral details: it saves to local disk and returns either a file path (stdio) or a temporary URL valid for 1 hour (HTTP). This goes beyond the annotation defaults and clarifies the tool's side effects and result format.

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 two sentences, front-loaded with the main purpose, and then a concise breakdown of mode-specific returns. Every sentence adds value, and there is no extraneous information.

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 the low complexity of the tool and the presence of an output schema, the description is complete: it explains the core action, mode-specific output, and the temporary URL validity. No further context is needed for an agent to invoke it 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 67% (message_id and attachment_index are described, user_google_email is not). The description does not add details about parameter semantics beyond what the schema provides, so it doesn't compensate for the missing description of user_google_email. Baseline 3 is appropriate.

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 clearly states the tool's function: 'Downloads an attachment from a Google Chat message and saves it to local disk.' This is a specific verb+resource+action, and it distinguishes this tool from siblings like get_gmail_attachment_content (Gmail) and get_drive_file_download_url (Drive) by explicitly mentioning Google Chat.

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

Usage Guidelines4/5

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

The description provides clear context for use (Google Chat attachments) and even explains mode-specific behavior (stdio vs HTTP). It doesn't explicitly name alternatives or exclusion criteria, but the context is sufficiently clear given the many sibling workspace tools.

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

draft_gmail_messageDraft Gmail MessageA

Creates a draft email in the user's Gmail account. Supports both new drafts and reply drafts with optional attachments. Supports Gmail's "Send As" feature to draft from configured alias addresses.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional CC email address.
toNoOptional recipient email address.
bccNoOptional BCC email address.
bodyYesEmail body (plain text).
subjectYesEmail subject.
from_nameNoOptional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
thread_idNoOptional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID.
from_emailNoOptional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized.
referencesNoOptional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
attachmentsNoOptional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment.
body_formatNoEmail body format. Use 'plain' for plaintext or 'html' for HTML content.plain
in_reply_toNoOptional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id.
quote_originalNoWhether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false.
include_signatureNoWhether to append the Gmail signature from Settings > Signature when available. Defaults to true.
user_google_emailYesThe user's Google email address. Required for authentication.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, so the mutating nature is known. The description adds useful behavioral context: drafts can be new or replies, attachments are supported, and alias addresses can be used via Send As. No contradiction with annotations.

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 two sentences with no filler. It front-loads the core purpose and then covers the two most important behavioral variants: reply drafts and Send As support.

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

Completeness4/5

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

For a tool with 15 parameters, the description is brief but the schema and output schema carry most of the detail. It could explicitly mention that the message is not sent and that send_gmail_message should be used for sending, but the current description is still sufficient for an agent to understand the tool's role.

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%, and the schema already contains rich detail for parameters like attachments, from_email, thread_id, and in_reply_to. The tool description itself adds little per-parameter meaning, so the baseline score of 3 is appropriate.

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 clearly states the tool creates a draft email in the user's Gmail account, which is a specific verb and resource. It also distinguishes itself from the sibling send_gmail_message by emphasizing 'draft' and explicitly mentions new drafts, reply drafts, and attachments.

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

Usage Guidelines4/5

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

The description gives clear usage context: it is for drafts, supports replies, and supports Send As aliases. It does not explicitly name send_gmail_message as the alternative for sending immediately, but the draft-vs-send distinction is strongly implied.

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

export_doc_to_pdfExport Doc to PDFA

Exports a Google Doc to PDF format and saves it to Google Drive.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idNoDrive folder ID to save PDF in (optional - if not provided, saves in root)
document_idYesID of the Google Doc to export
pdf_filenameNoName for the PDF file (optional - if not provided, uses original name + "_PDF")
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true. The description adds valuable context by specifying that the tool saves the PDF to Google Drive, clarifying the side effect location. It does not mention overwrite behavior or auth limitations, but the core side effect is disclosed.

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 a single, well-structured sentence that immediately conveys the tool's function. No wasted words 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?

The tool is simple, the schema covers all four parameters with descriptions, and an output schema exists. The description adequately explains the core operation without needing to detail optional parameters or return values.

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 fully documents each parameter. The description does not add extra semantics beyond what the schema provides, which is acceptable given the high coverage.

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 clearly states a specific verb and resource: 'Exports a Google Doc to PDF format and saves it to Google Drive.' This distinguishes it from sibling tools that read or create docs, as it uniquely mentions PDF conversion and Drive save.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like get_drive_file_download_url or other export methods. There is no mention of prerequisites, exclusions, or preferred scenarios.

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

find_and_replace_docFind and Replace DocA
Destructive

Finds and replaces text throughout a Google Doc. No index calculation required.

This is the safest way to update specific text in a document because it does not require knowing any indices. Use this tool when you need to:

  • Replace placeholder text (e.g., {{TITLE}}) with real content

  • Update specific words or phrases throughout the document

  • Make targeted text changes without risk of index errors

For building documents from scratch, consider inserting text with unique placeholders via batch_update_doc, then using this tool to replace them.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoOptional ID of the tab to target
find_textYesText to search for
match_caseNoWhether to match case exactly
document_idYesID of the document to update
replace_textYesText to replace with
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutating nature is known. The description adds useful context by explaining that it requires no index calculation, making it the 'safest way' for targeted updates. It also indicates the replacement happens 'throughout' the document, implying all occurrences. It does not explicitly mention side effects like replacement counts, but this is not required given the output schema exists.

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

Conciseness4/5

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

The description is well-structured: a lead sentence states the core function, followed by a bulleted list of use cases, and a closing note about an alternative tool. Every sentence earns its place and the length is appropriate for the tool's clarity. It could be slightly tighter, but it remains concise and scannable.

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

Completeness4/5

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

Given the presence of an output schema and the 100% param coverage, the description provides sufficient context for a Google Doc find-and-replace operation. It covers the core behavior, when to use it, and an alternative for building documents from scratch. It does not mention edge cases like what happens if find_text is absent, but the output schema likely conveys that, making the description reasonably complete.

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?

With 100% schema description coverage, the baseline is 3. The description adds semantic value by providing a concrete example: replacing placeholder text like '{{TITLE}}'. This helps an agent understand that find_text can be a template variable and replace_text its substitution, enriching the parameter meaning beyond the schema's simple 'Text to search for' and 'Text to replace with'.

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 'Finds and replaces text throughout a Google Doc,' which clearly states the verb, resource, and scope. It further distinguishes itself from siblings by highlighting 'No index calculation required' and explicitly contrasts with batch_update_doc for building documents. This makes the purpose unmistakable and differentiated.

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 provides explicit use cases: replacing placeholders, updating specific words/phrases, and making targeted changes without index errors. It also states when not to use it (building documents from scratch) and recommends an alternative approach involving batch_update_doc. This is exactly the kind of when-to-use guidance expected.

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

format_sheet_rangeFormat Sheet RangeA

Applies formatting to a range: colors, number formats, text wrapping, alignment, and text styling.

Colors accept hex strings (#RRGGBB). Number formats follow Sheets types (e.g., NUMBER, CURRENCY, DATE, PERCENT). If no sheet name is provided, the first sheet is used.

ParametersJSON Schema
NameRequiredDescriptionDefault
boldNoWhether to apply bold formatting.
italicNoWhether to apply italic formatting.
font_sizeNoFont size in points.
range_nameYesA1-style range (optionally with sheet name). Required.
text_colorNoHex text color (e.g., "#000000").
wrap_strategyNoText wrap strategy - WRAP (wrap text within cell), CLIP (clip text at cell boundary), or OVERFLOW_CELL (allow text to overflow into adjacent empty cells).
spreadsheet_idYesThe ID of the spreadsheet. Required.
background_colorNoHex background color (e.g., "#FFEECC").
user_google_emailYesThe user's Google email address. Required.
number_format_typeNoSheets number format type (e.g., "DATE").
vertical_alignmentNoVertical text alignment - TOP, MIDDLE, or BOTTOM.
horizontal_alignmentNoHorizontal text alignment - LEFT, CENTER, or RIGHT.
number_format_patternNoCustom pattern for the number format.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

The description adds some behavior details beyond annotations, such as hex color format and Sheets number format types, and the default sheet selection. However, it does not disclose whether formatting merges with existing formatting or replaces it, nor any side effects or error behavior. The annotations already indicate non-readonly and non-destructive, and the description does not contradict them.

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 three concise sentences, front-loaded with the primary purpose, then elaborating with relevant parameter constraints. No redundant content, filler, or unnecessary details. Every sentence earns its place.

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

Completeness4/5

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

For a tool with 13 parameters and annotations, the description covers the main purpose, key value format constraints, and default behavior. It does not need to explain return values due to the presence of an output schema. A minor gap is not stating the effect on existing formatting, but overall it provides adequate context for selection and usage.

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?

With 100% schema coverage, the schema already documents each parameter. The description enriches understanding by clarifying acceptable color formats (#RRGGBB), providing examples of number format types, and explaining the default sheet behavior for ranges without a sheet name. This adds value beyond the schema's brief descriptions.

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 clearly identifies the tool's function with a specific verb ('Applies formatting') and enumerates the types of formatting (colors, number formats, wrapping, alignment, styling), distinguishing it from sibling tools like modify_sheet_values or read_sheet_values. It also adds a useful default behavior note, making the tool's scope unambiguous.

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

Usage Guidelines3/5

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

The description implies usage for formatting ranges but does not explicitly state when to use it over alternatives, mention exclusions, or reference sibling tools. The only contextual note is the default first-sheet behavior, which is more of a parameter detail than usage guidance. It provides some operational context but lacks explicit when/when-not guidance.

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

generate_trigger_codeGenerate Trigger CodeA
Read-onlyIdempotent

Generates Apps Script code for creating triggers.

The Apps Script API cannot create triggers directly - they must be created from within Apps Script itself. This tool generates the code you need.

ParametersJSON Schema
NameRequiredDescriptionDefault
scheduleNoSchedule details (depends on trigger_type): - For time_minutes: "1", "5", "10", "15", or "30" - For time_hours: "1", "2", "4", "6", "8", or "12" - For time_daily: hour as "0"-"23" (e.g., "9" for 9am) - For time_weekly: "MONDAY", "TUESDAY", etc. - For simple triggers (on_open, on_edit): not needed
trigger_typeYesType of trigger. One of: - "time_minutes" (run every N minutes: 1, 5, 10, 15, 30) - "time_hours" (run every N hours: 1, 2, 4, 6, 8, 12) - "time_daily" (run daily at a specific hour: 0-23) - "time_weekly" (run weekly on a specific day) - "on_open" (simple trigger - runs when document opens) - "on_edit" (simple trigger - runs when user edits) - "on_form_submit" (runs when form is submitted) - "on_change" (runs when content changes)
function_nameYesThe function to run when trigger fires (e.g., "sendDailyReport")

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds valuable context about the Apps Script API limitation, enhancing transparency beyond the structured hints. No contradiction with annotations.

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 two concise sentences, front-loaded with the core purpose and no unnecessary words. It efficiently conveys the tool's function and important contextual constraint.

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

Completeness4/5

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

The description covers the key limitation and purpose, and the output schema exists to explain return values. It could be slightly more complete by hinting at next steps or code format, but it is sufficient given the available structured metadata.

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%, with detailed parameter descriptions for trigger_type, schedule, and function_name. The tool description itself adds no parameter-level detail, but the schema fully compensates, so a baseline score of 3 is appropriate.

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 clearly states the tool 'Generates Apps Script code for creating triggers' with a specific verb and resource. It also explains the API limitation, which helps distinguish it from other script management tools.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool (when you need trigger creation code) by explaining that the API cannot create triggers directly. However, it does not explicitly name alternative tools or state when not to use it.

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

get_contactGet ContactA
Read-onlyIdempotent

Get detailed information about a specific contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYesThe contact ID (e.g., "c1234567890" or full resource name "people/c1234567890").
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no extra behavioral context beyond stating it gets information, which aligns with annotations but does not provide additional details like potential errors or required permissions.

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 a single, concise sentence that delivers the core purpose without any filler or redundancy. It is well-structured and front-loaded.

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

Completeness4/5

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

For a simple read-only getter with a full output schema and 100% parameter coverage, the description is sufficiently complete. It might benefit from mentioning that the contact must be retrieved via a prior list/search, but that is not essential given the tool's straightforward nature.

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%, with both parameters (contact_id and user_google_email) having explicit descriptions. The tool description adds no additional parameter meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description 'Get detailed information about a specific contact' clearly states the tool's verb and resource, and distinguishes it from list/search siblings by emphasizing 'specific contact.' However, it does not explicitly mention that the contact is identified by an ID, leaving a minor gap in precision.

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

Usage Guidelines3/5

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

The description implies usage when you have a specific contact in mind, which is a clear context, but it does not provide explicit when-to-use vs. alternatives like search_contacts or list_contacts. No exclusions or alternative suggestions are given.

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

get_contact_groupGet Contact GroupA
Read-onlyIdempotent

Get details of a specific contact group including its members.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_idYesThe contact group ID.
max_membersNoMaximum number of members to return (default: 100, max: 1000).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The description is consistent with the readOnlyHint and idempotentHint annotations, and adds that members are included in the result. However, it does not describe error behavior (e.g., unknown group_id) or any other operational details beyond the annotations and schema, so it offers minimal additional transparency.

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 a single, concise sentence that is front-loaded with the verb and clearly states the tool's scope. There is no redundant or filler content, making it highly efficient.

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

Completeness4/5

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

Given the rich annotations (readOnly, idempotent, non-destructive), a fully described input schema, and the presence of an output schema, the description adequately covers what is needed for a simple read operation. The only missing element is explicit usage differentiation from siblings, but this is a minor gap for such a straightforward 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?

All three parameters are fully described in the input schema with explicit descriptions (e.g., group_id: 'The contact group ID.', max_members: 'Maximum number of members to return (default: 100, max: 1000).', user_google_email: 'The user's Google email address. Required.'). The tool description adds no parameter-specific meaning beyond the schema, so it meets the baseline but does not exceed it.

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 the tool's verb and resource specifically: 'Get details of a specific contact group including its members.' It clearly distinguishes from siblings like list_contact_groups, which likely only lists groups without member details, and manage_contact_group for modifications.

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

Usage Guidelines3/5

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

The description implies usage when you need details of a single contact group, but it does not explicitly contrast with alternatives such as list_contact_groups for enumeration or search_contacts. No when-to-use or when-not-to-use guidance is provided beyond the verb 'Get'.

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

get_doc_as_markdownGet Doc as MarkdownA
Read-onlyIdempotent

Reads a Google Doc and returns it as clean Markdown with optional comment context.

Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown: headings, bold/italic/strikethrough, links, code spans, ordered/unordered lists with nesting, and tables.

When comments are included (the default), each comment's anchor text — the specific text the comment was attached to — is preserved, giving full context for the discussion.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYesID of the Google Doc (or full URL)
comment_modeNoHow to display comments: - "inline": Footnote-style references placed at the anchor text location (default) - "appendix": All comments grouped at the bottom with blockquoted anchor text - "none": No comments includedinline
include_commentsNoWhether to include comments (default: True)
include_resolvedNoWhether to include resolved comments (default: False)
user_google_emailYesUser's Google email address
suggestions_view_modeNoHow to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejectedDEFAULT_FOR_CURRENT_ACCESS

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context about how comments are handled (default included, anchor text preserved, comment_mode options) and which formatting elements are preserved. It does not contradict annotations.

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 into three concise paragraphs: purpose, differentiation, and comment behavior. Each sentence earns its place with no redundancy, making it easy to parse.

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 the read-only nature confirmed by annotations and the presence of an output schema, the description is complete. It covers the tool's core behavior, differentiation from similar tools, and comment handling. There are no significant gaps.

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?

With 100% schema description coverage, the baseline is 3. The description adds meaning by explaining the effect of comment-related parameters, such as the default behavior of including comments and preserving anchor text. This helps the agent understand the purpose of include_comments and comment_mode beyond their schema descriptions.

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 clearly states the tool's function: 'Reads a Google Doc and returns it as clean Markdown with optional comment context.' It uses a specific verb and resource, and explicitly differentiates from sibling get_doc_content by noting it returns plain text while this preserves formatting.

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 provides explicit usage guidance by contrasting with get_doc_content: 'Unlike get_doc_content which returns plain text, this tool preserves document formatting as Markdown.' This tells the agent when to choose this tool over the alternative, and the comment context section clarifies behavior around comments.

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

get_doc_contentGet Doc ContentB
Read-onlyIdempotent

Retrieves content of a Google Doc or a Drive file (like .docx) identified by document_id.

  • Native Google Docs: Fetches content via Docs API.

  • Office files (.docx, etc.) stored in Drive: Downloads via Drive API and extracts text.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYesID of the Google Doc (or full URL)
user_google_emailYesUser's Google email address
suggestions_view_modeNoHow to render suggestions in the returned content: - "DEFAULT_FOR_CURRENT_ACCESS": Default based on user's access level - "SUGGESTIONS_INLINE": Suggested changes appear inline in the document - "PREVIEW_SUGGESTIONS_ACCEPTED": Preview as if all suggestions were accepted - "PREVIEW_WITHOUT_SUGGESTIONS": Preview as if all suggestions were rejectedDEFAULT_FOR_CURRENT_ACCESS

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds limited extra behavioral context. It explains the use of Docs API vs Drive API for different file types, which is useful, but does not disclose other important behaviors like output format or potential limitations.

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 and well-structured, with a clear opening statement followed by two bullet points that efficiently summarize the two retrieval paths. There is no redundant wording or unnecessary detail.

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

Completeness4/5

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

For a read-only tool with output schema and rich annotations, the description is mostly complete. It adequately explains the two file-type scenarios, though it could mention limitations or explicitly guide users to alternatives, which is a minor gap.

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 fully documents all parameters. The description adds minimal meaning beyond the schema, mainly mentioning the document_id role, but does not elaborate on parameter formats or usage nuances.

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

Purpose4/5

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

The description clearly states the tool retrieves content from Google Docs or Drive files, using specific verbs and resources. It distinguishes between native Google Docs and Office files, but does not explicitly differentiate from sibling tools like get_drive_file_content or get_doc_as_markdown.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention exclusions. The handling of different file types is implied by the description, but no direct comparison to sibling tools is given.

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

get_drive_file_contentGet Drive File ContentA
Read-onlyIdempotent

Retrieves the content of a specific Google Drive file by ID, supporting files in shared drives.

• Native Google Docs, Sheets, Slides → exported as text / CSV. • Office files (.docx, .xlsx, .pptx) → unzipped & parsed with std-lib to extract readable text. • PDFs → text extracted with pypdf when possible; scanned/image-only PDFs fall back to a download hint. • Images → returned as base64 with MIME metadata for multimodal clients. • Any other file → downloaded; tries UTF-8 decode, else notes binary.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesDrive file ID.
user_google_emailYesThe user’s Google email address.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses meaningful behavioral traits: native docs are exported as text/CSV, Office files are unzipped, PDFs may fall back to a download hint for scanned images, images return base64 with MIME metadata, and other binaries are handled with UTF-8 detection. This adds significant context.

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 and well-structured: a single purpose sentence followed by bullet points for each file-type behavior. Each bullet contributes unique information with no redundancy or filler, making it easy to scan.

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

Completeness4/5

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

Given the read-only annotations and the presence of an output schema, the description covers the necessary context: shared drives, format-specific extraction, fallbacks, and binary handling. It does not explain errors or auth, but those are already covered by annotations and the user_google_email parameter. The coverage is strong, though not exhaustive.

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?

The input schema already provides clear descriptions for both params (file_id and user_google_email) with 100% coverage. The description adds no additional parameter semantics beyond the phrase 'by ID', which duplicates schema information. Baseline 3 is appropriate.

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 clearly states 'Retrieves the content of a specific Google Drive file by ID' and then details format-specific behaviors, making the purpose unambiguous. It distinguishes itself from download-URL or search siblings by focusing on content extraction.

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

Usage Guidelines3/5

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

Usage is implied by the description (i.e., use when you need file content), but no explicit alternatives or when-not-to-use guidance is provided. For example, it does not mention get_drive_file_download_url as the alternative for when a URL is sufficient. This falls into 'implied usage' rather than clear, explicit guidance.

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

get_drive_file_download_urlGet Drive File Download URLA
Read-onlyIdempotent

Downloads a Google Drive file and saves it to local disk.

In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour).

For Google native files (Docs, Sheets, Slides), exports to a useful format:

  • Google Docs -> PDF (default) or DOCX if export_format='docx'

  • Google Sheets -> XLSX (default), PDF if export_format='pdf', or CSV if export_format='csv'

  • Google Slides -> PDF (default) or PPTX if export_format='pptx'

For other files, downloads the original file format.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesThe Google Drive file ID to download.
export_formatNoOptional export format for Google native files. Options: 'pdf', 'docx', 'xlsx', 'csv', 'pptx'. If not specified, uses sensible defaults (PDF for Docs/Slides, XLSX for Sheets). For Sheets: supports 'csv', 'pdf', or 'xlsx' (default).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations (readOnly, idempotent, non-destructive), the description discloses key behaviors: saving to local disk, temporary URL validity in HTTP mode, and format conversion rules for Google native files. This exceeds what annotations provide and sets clear expectations for side effects and return values.

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 a clear main statement, mode-specific details, and a bulleted list for format conversions. Every sentence serves a purpose without redundancy, making it concise yet informative.

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 fully covers the tool's behavior across modes, file types, and export formats. It explains return values (local path vs URL) and edge cases like native file conversion, making it complete for an agent to select and invoke the tool correctly without needing additional context.

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?

Schema coverage is 100%, but the description adds value by explaining export format mappings per file type (e.g., Docs to PDF/DOCX, Sheets to XLSX/PDF/CSV). This enriches the parameter semantics beyond the schema's plain option list.

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 clearly states it downloads a Google Drive file and saves it to local disk, using a specific verb and resource. It distinguishes from siblings like get_drive_file_content or get_drive_shareable_link by focusing on the download behavior and local file access.

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

Usage Guidelines4/5

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

The description provides clear usage context, explaining mode-specific behavior (stdio vs HTTP) and export format options. It does not explicitly name alternatives or exclusions, but the context makes it obvious when to use this tool for downloading files rather than just reading or sharing them.

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

get_drive_file_permissionsGet Drive File PermissionsA
Read-onlyIdempotent

Gets detailed metadata about a Google Drive file including sharing permissions, parent folder IDs, ownership, and lifecycle timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesThe ID of the file to check permissions for.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds value by specifying exactly what metadata categories are returned (permissions, parent folder IDs, ownership, lifecycle timestamps), which goes beyond the annotation flags.

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 a single, information-dense sentence that lists the key metadata categories without any filler. It is efficiently front-loaded with the action and resource.

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

Completeness4/5

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

For a read-only metadata lookup with a rich output schema and comprehensive annotations, the description sufficiently communicates the tool's purpose and return scope. It could mention error conditions or permission requirements, but these are not critical given the output schema and safety annotations.

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?

Both parameters are fully described in the input schema with clear purposes (file_id and user_google_email). The description itself does not add any parameter-specific details, so it relies on the schema's complete coverage.

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 uses a specific verb ('Gets') and resource ('Google Drive file'), and enumerates concrete metadata categories: sharing permissions, parent folder IDs, ownership, and lifecycle timestamps. This clearly differentiates it from sibling tools like get_drive_file_content or get_drive_file_download_url.

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

Usage Guidelines3/5

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

The description implies usage when a caller needs comprehensive file metadata, but it does not explicitly state when to prefer this tool over related siblings such as check_drive_file_public_access or get_drive_shareable_link. No exclusions or alternative guidance is provided.

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

get_eventsGet EventsA
Read-onlyIdempotent

Retrieves events from a specified Google Calendar. Can retrieve a single event by ID or multiple events within a time range. You can also search for events by keyword by supplying the optional "query" param.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoA keyword to search for within event fields (summary, description, location). Ignored if event_id is provided.
detailedNoWhether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False.
event_idNoThe ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters.
time_maxNoThe end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided.
time_minNoThe start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided.
calendar_idNoThe ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`.primary
max_resultsNoThe maximum number of events to return. Defaults to 25. Ignored if event_id is provided.
single_eventsNoWhether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances.
user_google_emailYesThe user's Google email address. Required.
include_attachmentsNoWhether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate those. The description adds useful behavioral context about the three major retrieval modes. It does not disclose details like rate limits or default response shape, but those gaps are minor given the strong annotations and output schema.

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 short sentences with no filler. The main purpose is front-loaded, and each sentence adds a distinct retrieval mode. It is concise without sacrificing the key decision points for an agent.

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

Completeness4/5

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

For a tool with 10 parameters, the description is appropriately high-level, with the heavy detail carried by the input schema and output schema. It covers all major entry points: ID lookup, time range, and keyword search. It does not explicitly mention defaults like 'primary' calendar or the detailed flag, but those are fully documented in the schema, so no critical context 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 the baseline is 3. The description mentions the optional query parameter and the ID/time-range distinction, but all parameter-level meaning is already thoroughly documented in the input schema. The description adds little beyond a high-level framing of the parameters.

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 specific verb and resource: 'Retrieves events from a specified Google Calendar.' It then clearly enumerates the three retrieval modes—by ID, by time range, and by keyword—which distinguishes this read tool from siblings like manage_event or list_calendars. An agent can understand what the tool does without opening the schema.

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

Usage Guidelines4/5

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

Provides clear context by describing the supported use cases: single event retrieval, time-range retrieval, and keyword search. It does not explicitly name alternatives or state when not to use it, but the read-only semantics and retrieval modes make intended usage obvious relative to sibling write tools like manage_event.

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

get_formGet FormC
Read-onlyIdempotent

Get a form.

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesThe ID of the form to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.3/5.0
Behavior2/5

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

The annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already establish the safety profile, but the description adds no additional behavioral context such as what exactly is returned, potential errors, or authorization requirements beyond what the schema states. The description is neutral but does not enhance transparency.

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

Conciseness2/5

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

The description is a single sentence, but it is under-specified rather than concise. It fails to provide necessary context or details, making it inadequate for an AI agent to understand the tool's purpose and usage.

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

Completeness3/5

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

Given the presence of rich annotations, a fully described schema, and an output schema, the description is minimally adequate. However, it lacks any contextual details about what 'form' refers to or how it fits with related tools, so it is not fully complete.

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%, with both form_id and user_google_email having descriptions. The tool description adds no parameter-related information, but since the schema fully documents the parameters, the baseline of 3 is appropriate.

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

Purpose2/5

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

The description 'Get a form.' simply restates the tool name without adding any specific detail about what the form retrieval entails. It lacks information on what a 'form' is in this context (e.g., Google Form structure, settings) and does not explicitly distinguish from sibling tools like get_form_response, making it nearly tautological.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool or how it compares to alternatives. It does not mention any context, prerequisites, or exclusions, leaving the agent without information about appropriate usage scenarios.

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

get_form_responseGet Form ResponseA
Read-onlyIdempotent

Get one response from the form.

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesThe ID of the form.
response_idYesThe ID of the response to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, destructiveHint=false, idempotentHint, and openWorldHint, so the safety profile is clear. The description adds no extra behavioral context, such as error behavior or return format, but it also does not contradict the annotations.

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 a single, concise sentence: 'Get one response from the form.' It is front-loaded, immediately conveys the purpose, and contains no filler or redundant information.

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

Completeness4/5

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

For a simple read-only getter with a full output schema and rich annotations, the description is adequate but not fully complete. It does not mention the necessity of a response_id (though the schema covers it) or provide any context about what a response contains, but given the tool's simplicity, the missing details are minor.

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 parameters are well-documented in the schema. The description does not add any additional parameter-level information, so it meets the baseline but does not exceed it.

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 'Get one response from the form' clearly identifies the action (get) and resource (form response), with the scope 'one' distinguishing it from listing all responses (e.g., list_form_responses). It is specific and unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention that it requires a response_id or that list_form_responses should be used for multiple responses. The usage context is left entirely to inference from the schema.

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

get_gmail_attachment_contentGet Gmail Attachment ContentA

Downloads an email attachment and saves it to local disk.

In stdio mode, returns the local file path for direct access. In HTTP mode, returns a temporary download URL (valid for 1 hour). May re-fetch message metadata to resolve filename and MIME type.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe ID of the Gmail message containing the attachment.
attachment_idYesThe ID of the attachment to download.
return_base64NoWhen True, includes the full attachment as a standard base64 string in the response (in addition to any file path or download URL). Useful for sandboxed clients that cannot reach localhost download URLs or the MCP server's local file paths (e.g. containerized agents with network allowlists). The returned base64 uses the standard alphabet, so it can be passed directly to tools like ``draft_gmail_message`` that expect standard (not URL-safe) base64. Default False preserves the existing behavior and response size.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: it saves to disk, returns a temporary URL valid for 1 hour in HTTP mode, and may re-fetch message metadata. Annotations provide limited safety info (readOnlyHint=false), so the description carries the burden of explaining side effects and output behavior, which it does effectively.

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 and well-structured: it opens with the main action, then breaks down output modes in two clear sentences, and ends with a relevant behavioral caveat. Every sentence adds distinct value, with no redundancy or filler.

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

Completeness4/5

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

Given that an output schema exists and the input schema is thorough, the description provides the essential extra context: mode-specific outputs, time validity, and side effects. It does not explain error cases or prerequisites, but these are not critical given the tool's moderate complexity and the schema richness.

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%, with detailed descriptions for all four parameters including return_base64. The tool description itself does not add parameter-level information, but since the schema fully documents each parameter, the baseline of 3 is appropriate—the schema does the heavy lifting.

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 clearly states the tool's action with a specific verb ('Downloads') and resource ('email attachment'), and further specifies it saves to local disk. This distinguishes it from siblings like get_gmail_message_content by focusing on attachment content, and the mode-specific output details reinforce its unique purpose.

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

Usage Guidelines4/5

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

The description gives clear context on when to use the tool by explaining its behavior in stdio and HTTP modes, which helps select it for attachment downloads. It does not explicitly name alternatives or exclusions, but the context is sufficient for most scenarios without needing explicit 'when-not-to-use' guidance.

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

get_gmail_message_contentGet Gmail Message ContentA
Read-onlyIdempotent

Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message.

Bodies are returned inline and truncated at 20,000 characters. Set full=True to get the complete, untruncated message instead: it is exported to disk and the response carries a short-lived download URL (HTTP transport) or file path (stdio transport) rather than the body, so large messages never stream through the model context. Stateless deployments have no file storage, so there full=True returns the untruncated body inline.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoWhen True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export).
message_idYesThe unique ID of the Gmail message to retrieve.
body_formatNoBody output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.text
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial behavioral detail: 20,000-character truncation, export-to-disk with a short-lived download URL or file path, and stateless inline fallback. These details help the agent anticipate response size and transport behavior, going well beyond the annotations.

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 three tightly written paragraphs: a one-sentence purpose statement, a concise explanation of truncation and full=True behavior, and a short note on stateless deployments. Every sentence contributes new information and is front-loaded with the most important 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?

Given the strong annotations, complete input schema with 100% parameter coverage, and presence of an output schema, the description covers all key operational edge cases: truncation, full=True behavior, transport differences, and stateless mode. It is fully sufficient for reliable tool invocation.

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?

Schema description coverage is 100%, and the schema itself has rich parameter descriptions. The tool description adds extra value by explaining the 20,000-character truncation threshold and the rationale that large messages never stream through model context, which complements the schema's full=True description.

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 'Retrieves the full content (subject, sender, recipients, body) of a specific Gmail message,' using a specific verb and clearly identifying the resource and scope. The 'specific' qualifier distinguishes it from sibling batch/thread/attachment tools.

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

Usage Guidelines4/5

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

The description gives clear context on when to use full=True (large messages, byte-exact fidelity) and when the default truncated inline body is used. It does not explicitly name sibling alternatives or state when not to use this tool, so it lacks explicit exclusion guidance but is otherwise clear.

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

get_gmail_messages_content_batchGet Gmail Messages Content BatchA
Read-onlyIdempotent

Retrieves the content of multiple Gmail messages in a single batch request. Supports up to 25 messages per batch to prevent SSL connection exhaustion.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoMessage format. "full" includes body, "metadata" only headers.full
body_formatNoBody output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.text
message_idsYesList of Gmail message IDs to retrieve (max 25 per batch).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the 25-message limit and the rationale ('to prevent SSL connection exhaustion'), which is behavioral context beyond the annotations and schema.

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?

Two sentences, front-loaded with the core purpose, and every word earns its place. The second sentence explains a practical constraint without verbosity.

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

Completeness4/5

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

The tool is straightforward, with full schema coverage and an output schema available. The description covers batch size and rationale, and the sibling list includes the singular variant, making the context clear. It doesn't discuss error handling or partial failures, but that's not critical for a read-only batch retriever.

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%, with clear descriptions for all four parameters. The description does not add any parameter-specific detail beyond what the schema provides, so the baseline of 3 applies.

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 clearly states the tool retrieves content of multiple Gmail messages in a single batch request. The verb 'retrieves' with the resource 'Gmail messages' and the scope 'batch' distinctly differentiate it from the singular get_gmail_message_content sibling.

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

Usage Guidelines4/5

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

It provides the key context of batching up to 25 messages per request, which guides when to use this tool over the singular version. However, it does not explicitly say 'use this for multiple messages instead of single fetch' or name the alternative, so it falls short of explicit exclusion guidance.

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

get_gmail_thread_contentGet Gmail Thread ContentA
Read-onlyIdempotent

Retrieves the complete content of a Gmail conversation thread, including all messages.

Optionally also returns structured ownership analysis so a caller can determine who sent the last message and who owes whom a response without re-parsing the formatted string or making a second tool call.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idYesThe unique ID of the Gmail thread to retrieve.
body_formatNoBody output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body.text
include_analysisNoWhen True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds behavioral context about return shape (string by default, dict when include_analysis=True) and clarifies that the default preserves the existing string return shape, which is beyond annotation data.

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?

Two sentences: the first clearly states the core purpose, the second explains an optional feature and its benefit. No redundant wording, well-front-loaded, every sentence earns its place.

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 an output schema exists and annotations are rich, the description covers the essential aspects: thread retrieval, all messages, optional analysis, and default return shape. It is sufficiently complete for an agent to understand the tool's functionality without ambiguity.

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?

Schema description coverage is 100%, so the baseline is 3. The description enriches the include_analysis parameter by explaining the structured ownership analysis (last sender, ball-in-court verdict), which is not fully captured in the schema. It also clarifies body_format behavior via the schema, and the description adds value by describing the default return shape.

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 the tool retrieves complete Gmail thread content including all messages, using a specific verb and resource. It distinguishes from sibling tools like get_gmail_message_content by focusing on the whole thread, and mentions optional structured ownership analysis as an added feature.

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

Usage Guidelines4/5

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

The description gives clear context for when to use this tool (to retrieve full thread content) and hints at a reason to prefer it over alternatives: by enabling include_analysis, callers avoid re-parsing or making a second call. It does not explicitly name sibling alternatives, but the guidance is useful.

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

get_gmail_threads_content_batchGet Gmail Threads Content BatchA
Read-onlyIdempotent

Retrieves the content of multiple Gmail threads in a single batch request. Supports up to 25 threads per batch to prevent SSL connection exhaustion.

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_idsYesA list of Gmail thread IDs to retrieve. The function will automatically batch requests in chunks of 25.
body_formatNoBody output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body.text
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With annotations already declaring readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds valuable context beyond these: the batch limit of 25 threads and the rationale (SSL connection exhaustion). The parameter description also notes automatic batching in chunks of 25, which is additional behavioral detail. No contradiction with annotations.

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 exactly two sentences, both front-loaded and free of filler. The first sentence delivers the core purpose, the second provides a key constraint. Every word earns its place, making it an exemplary concise description.

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

Completeness4/5

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

Given the output schema exists, annotations cover safety, and schema descriptions cover all parameters, the description only needs to convey the tool's unique value and constraints. It does that well by highlighting batch retrieval and the 25-thread limit. It could mention alternatives for full completeness, but the existing information is sufficient 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 baseline is 3. The description itself does not add parameter-level semantics beyond what the schema provides. The schema already contains detailed explanations for thread_ids (batching) and body_format (text/html/raw), so no compensation is needed. The description adds no extra value here.

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 clearly states the specific verb and resource: 'Retrieves the content of multiple Gmail threads in a single batch request.' This distinguishes it from sibling tools like get_gmail_thread_content (single thread) and get_gmail_messages_content_batch (messages, not threads) by focusing on 'multiple threads' and 'batch'. The addition of the 25-thread limit further clarifies its scope.

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

Usage Guidelines4/5

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

The description implies usage for fetching multiple threads at once and provides a rationale ('to prevent SSL connection exhaustion'). However, it does not explicitly name alternatives or state when not to use this tool, though the name and context make batch usage clear. Given the existence of a sibling for single threads, a brief 'for a single thread, use get_gmail_thread_content' would have made it a 5.

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

get_messagesGet MessagesC
Read-onlyIdempotent

Retrieves messages from a Google Chat space.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_byNocreateTime desc
space_idYes
page_sizeNo
message_filterNoOptional filter string using the Chat API filter syntax. Supports createTime and thread.name. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"' 'thread.name = spaces/X/threads/Y'
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, but the description adds no behavioral context beyond the basic retrieval action. It does not mention filtering, ordering, pagination, or any limits, nor does it contradict the annotations.

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 a single, efficient sentence with no filler or repetition. It front-loads the verb and object.

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

Completeness2/5

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

For a tool with 5 parameters and a sibling search_messages, this description is too sparse to support selection and correct invocation. The presence of an output schema helps with return values, but the description fails to explain filtering capabilities, pagination defaults, or how this differs from related message retrieval tools.

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

Parameters2/5

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

Schema description coverage is only 20% (just message_filter has a description), yet the tool description adds no explanation for user_google_email, space_id, order_by, or page_size. The phrase 'from a Google Chat space' weakly maps to space_id but is not enough to compensate for the low coverage.

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

Purpose4/5

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

The description uses a specific verb ('Retrieves') and names a concrete resource ('Google Chat space'), making the core action clear. However, it does not distinguish this from sibling tools like 'search_messages' or 'search_drive_files', so it falls short of full differentiation.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as search_messages. The description is a single statement with no context, exclusions, or alternative references.

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

get_pageGet PageB
Read-onlyIdempotent

Get details about a specific page (slide) in a presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_object_idYesThe object ID of the page/slide to retrieve.
presentation_idYesThe ID of the presentation.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and mutation aspects. The description adds minimal extra behavioral context beyond a minor clarification that 'page' means 'slide'. With annotations present, this is acceptable but not enriched.

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 a single, focused sentence that front-loads the essential purpose. It contains no redundant phrases, making it maximally concise while remaining informative.

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

Completeness4/5

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

Given the tool's simplicity and the existence of an output schema, the description sufficiently covers what the tool does. It does not explain return format or error behavior, but the output schema handles return details, and the operation is a straightforward read. It lacks a bit of contextual guidance but is largely complete.

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 fully documents all three parameters. The description clarifies that 'page' refers to a slide, which slightly aids understanding of page_object_id, but it does not elaborate on details like ID formats or defaults. This aligns with the baseline of 3.

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

Purpose4/5

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

The description clearly identifies the action ('Get') and resource ('details about a specific page (slide) in a presentation'). It conveys the tool's specific function without ambiguity. However, it does not explicitly differentiate from sibling tools like get_presentation or get_page_thumbnail, so it falls short of a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or contrast with other getters in the sibling list. The usage context is only implied by the tool's name and nature.

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

get_page_thumbnailGet Page ThumbnailA
Read-onlyIdempotent

Generate a thumbnail URL for a specific page (slide) in a presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_object_idYesThe object ID of the page/slide.
thumbnail_sizeNoSize of thumbnail ("LARGE", "MEDIUM", "SMALL"). Defaults to "MEDIUM".MEDIUM
presentation_idYesThe ID of the presentation.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds minimal behavioral context beyond stating the output (a URL). It does not disclose any side effects, permissions, or additional behavioral traits.

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 a single, focused sentence with no fluff. It front-loads the core purpose and is appropriately sized for the tool's simplicity.

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

Completeness4/5

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

Given the rich annotations and complete schema descriptions, the description suffices. It does not explain return values in detail, but the presence of an output schema fills that gap. It is complete enough for this straightforward tool, though it omits any caveats about URL expiry or usage constraints.

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 input schema already documents all parameters. The description mentions 'specific page (slide)', which aligns with page_object_id, but does not add extra meaning beyond what the schema provides.

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 clearly states the tool's function with a specific verb 'Generate' and a specific resource 'thumbnail URL for a specific page (slide) in a presentation.' It distinguishes itself from sibling tools like get_page or get_presentation by focusing on thumbnail URL generation.

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

Usage Guidelines3/5

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

The description implies its usage context (obtaining a thumbnail URL for a slide) but provides no explicit guidance on when to choose this over alternatives or any exclusions. There is no mention of when not to use it or which sibling tool might be more appropriate.

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

get_presentationGet PresentationA
Read-onlyIdempotent

Get details about a Google Slides presentation.

ParametersJSON Schema
NameRequiredDescriptionDefault
presentation_idYesThe ID of the presentation to retrieve.
user_google_emailYesThe user's Google email address. Required.
include_speaker_notesNoAlso report each slide's speaker (presenter) notes and the object ID of the shape holding them. Pass True when you need to read or edit notes: that shape ID is the only valid target for insertText/deleteText on notes, and batch_update_presentation writes notes by deleting the shape's existing text and inserting new text. Defaults to False.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the description doesn't need to repeat those. It adds value by explaining that include_speaker_notes reports speaker notes and the shape object ID, and that the shape ID is the only valid target for insertText/deleteText on notes—useful behavioral context beyond annotations. No contradiction found.

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 a single, front-loaded sentence with zero filler. It states the core purpose efficiently, and all additional necessary detail is delegated to the input schema and annotations.

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

Completeness4/5

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

For a simple read-only tool, the description is adequate, especially given the presence of an output schema (which explains return values) and rich annotations. It could mention that it returns presentation-level metadata rather than slide contents, but that's an enhancement, not a gap, because the schema and output schema cover the specifics.

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 baseline is 3 even without parameter info in the tool description. The description itself doesn't add meaning beyond the schema, but the schema's include_speaker_notes parameter has a rich explanation covering both its purpose and its relation to editing operations.

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

Purpose4/5

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

The description clearly states the action ('Get details') and the resource ('a Google Slides presentation'), which distinguishes it from tools for other Google services. However, it doesn't explicitly differentiate from sibling presentation tools like get_page, which retrieves page-level details, so it's clear but not fully distinguishing.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like get_page or batch_update_presentation. The only usage hint is buried in the include_speaker_notes parameter description, which mentions when to pass True and references batch_update_presentation for writing notes, but that's parameter-level guidance, not tool selection guidance.

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

get_script_contentGet Script ContentB
Read-onlyIdempotent

Retrieves content of a specific file within a project.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_nameYesName of the file to retrieve
script_idYesThe script project ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds no extra behavioral context (e.g., required permissions, return format, or error conditions). Since annotations do the heavy lifting, a score of 3 is appropriate.

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 a single, concise sentence that immediately conveys the tool's purpose. It contains no filler or redundant information.

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

Completeness4/5

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

Given the simple nature of this read-only tool, the presence of rich annotations, complete schema descriptions, and an output schema, the one-sentence description is largely sufficient. It could be improved by clarifying that 'content' refers to source code within an Apps Script project, but overall it is reasonably complete.

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%, with each parameter having a basic description. The tool description itself does not add any additional meaning beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

The description uses the specific verb 'retrieves' and identifies the resource as 'content of a specific file within a project,' which clearly outlines the tool's function. However, it does not explicitly differentiate from similar sibling tools like get_script_project or update_script_content, so it is clear but not fully distinct.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. With many sibling tools for script-related operations, some usage context would be helpful, but it is entirely absent.

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

get_script_metricsGet Script MetricsA
Read-onlyIdempotent

Gets execution metrics for a script project.

Returns analytics data including active users, total executions, and failed executions over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
user_google_emailYesUser's email address
metrics_granularityNoGranularity of metrics - "DAILY" or "WEEKLY"DAILY

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, lowering the burden. The description adds useful context about the returned data (active users, executions, failures) and confirms the read-only nature. It does not cover pagination or time range defaults, but these are not critical given the annotations and output schema.

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 two sentences, front-loaded with the core action, and contains no filler or redundancy. Every word adds value.

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

Completeness4/5

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

With an output schema present, return value documentation is handled. The description provides a high-level overview of metrics types and time dimension, and annotations cover safety. It could mention when to use it relative to similar tools, but for a straightforward read-only metrics tool this is adequate.

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% with clear parameter descriptions for script_id, user_google_email, and metrics_granularity. The description does not add parameter-specific guidance, but the schema fully documents the parameters, so the baseline score of 3 is appropriate.

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?

Clearly states 'Gets execution metrics for a script project' with a specific verb and resource. It distinguishes from sibling script tools like get_script_project or get_script_content by focusing on execution analytics.

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

Usage Guidelines3/5

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

The description implies usage for retrieving script execution metrics over time, but it does not explicitly state when to use this tool versus alternatives or any exclusions. No when-not-to-use guidance is provided.

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

get_script_projectGet Script ProjectA
Read-onlyIdempotent

Retrieves complete project details including all source files.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it includes 'all source files', which gives some scope context, but it does not disclose additional behavioral traits such as authentication requirements, rate limits, or what 'complete' entails beyond the output schema.

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 a single, front-loaded sentence with zero redundant words. It immediately states the verb and resource, earning its place without fluff. This is ideal conciseness.

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 the rich annotations (readOnlyHint, idempotentHint, openWorldHint) and the presence of an output schema, the description is sufficient for a simple getter tool. It communicates the essential scope ('complete project details including all source files') and does not need to explain return values or safety, as those are covered by structured fields.

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?

The input schema has 100% coverage for both parameters with clear descriptions. The tool description does not add any additional meaning beyond the schema's field labels. Baseline 3 is appropriate as the schema carries the semantic burden.

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 clearly states the verb 'Retrieves' and the resource 'complete project details including all source files', distinguishing it from sibling tools like list_script_projects (which lists projects) and get_script_content (which focuses on content). The scope is explicit and unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. There is no mention of alternatives, use cases, or exclusion criteria. The description merely states what it does without contextualizing when the agent should choose it.

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

get_search_engine_infoGet Search Engine InfoA
Read-onlyIdempotent

Retrieves metadata about a Programmable Search Engine.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive, covering the safety profile. The description adds that it retrieves 'metadata' (not content), but this is minimal additional context. No contradiction with annotations.

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?

A single sentence, front-loaded with the verb and resource. No wasted words, perfectly sized for the tool's simple purpose.

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

Completeness4/5

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

The tool has an output schema, so return values are documented externally. The description is adequate for a simple metadata retrieval operation. However, it does not mention prerequisites (e.g., need for authorization) or what 'metadata' includes, but these are minor given the output schema.

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?

The input schema covers the single parameter (user_google_email) with full description coverage (100%), so the description adds no parameter-specific meaning. Baseline 3 applies as the schema already documents the parameter adequately.

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

Purpose4/5

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

The description uses a specific verb ('retrieves') and resource ('Programmable Search Engine metadata'), clearly stating the tool's function. It doesn't explicitly distinguish it from sibling tools, but the resource is specific enough that confusion is unlikely.

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

Usage Guidelines3/5

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

The description implies usage for retrieving metadata about a search engine but provides no explicit guidance on when to use this versus other tools or any exclusions. It's clear only from the tool name and context, not from explicit instructions.

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

get_spreadsheet_infoGet Spreadsheet InfoA
Read-onlyIdempotent

Gets information about a specific spreadsheet including its sheets.

ParametersJSON Schema
NameRequiredDescriptionDefault
spreadsheet_idYesThe ID of the spreadsheet to get info for. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds some behavioral context by noting that the response includes sheets, but it does not disclose additional details like error conditions, permission requirements, or the exact format of returned information beyond what the output schema already 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 a single, focused sentence that immediately states what the tool does and what result to expect. There is no redundancy, filler, or repetition of schema details, making it highly concise and well-structured.

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

Completeness4/5

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

Given the tool's simplicity, the presence of a rich output schema, and annotations covering safety behavior, the description is largely sufficient. It clearly identifies the tool's purpose and key output characteristic ('including its sheets'). The only minor gap is not elaborating on the format of the spreadsheet_id (e.g., URL vs. raw ID), but this is likely covered elsewhere or by the schema.

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%, with both parameters (spreadsheet_id and user_google_email) already well-documented in the input schema. The description adds no additional parameter-level meaning, so a baseline score of 3 is appropriate since the schema does the heavy lifting.

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 uses a specific verb ('Gets') with a clear resource ('information about a specific spreadsheet') and explicitly scopes the result ('including its sheets'). It distinguishes itself from sibling tools like list_spreadsheets (which lists spreadsheets) and read_sheet_values (which reads cell values), making its function immediately clear.

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

Usage Guidelines3/5

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

The description conveys that this is for retrieving metadata about a specific spreadsheet, which implies usage when a spreadsheet_id is known and high-level structure/sheet info is needed. However, it does not explicitly mention when not to use it, nor does it name alternatives such as list_spreadsheets or read_sheet_values for different needs.

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

get_taskGet TaskA
Read-onlyIdempotent

Get details of a specific task.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesThe ID of the task to retrieve.
task_list_idYesThe ID of the task list containing the task.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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

The description adds no behavioral context beyond what annotations already declare (readOnlyHint, idempotentHint, destructiveHint). It does not mention error behavior, permissions, or response specifics, so it contributes no additional transparency.

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 a single concise sentence with zero filler or redundancy, making it appropriately sized and front-loaded.

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

Completeness4/5

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

Given the simplicity of the tool, the presence of an output schema, and strong annotations, the one-sentence description is sufficient to convey the core function. It lacks usage nuances but is complete for basic selection and invocation.

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 covers all three parameters with descriptions (100% coverage), so the schema already provides the parameter semantics. The description adds no extra information about the parameters.

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 'Get details of a specific task' uses a specific verb ('get') and resource ('specific task'), clearly distinguishing it from siblings like list_tasks (multiple tasks) and manage_task (mutations).

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

Usage Guidelines3/5

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

No explicit when-to-use or when-not-to-use guidance is provided. The usage is only implied by the phrase 'specific task,' leaving the agent to infer that this is for single-task retrieval rather than listing or managing tasks.

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

get_task_listGet Task ListA
Read-onlyIdempotent

Get details of a specific task list.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_list_idYesThe ID of the task list to retrieve.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds no additional behavioral context beyond the operation type; it does not mention return format, error cases, or required scopes. Since annotations carry the burden, a score of 3 is appropriate.

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 a single, front-loaded sentence with no filler or redundant information. It efficiently communicates the core purpose, making it easy to parse and remember.

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

Completeness4/5

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

Given the low complexity (2 required params, no nesting), rich annotations, and presence of an output schema, the description is largely complete. It clearly states the action and target, while the schema and annotations cover the remaining details. Slight deduction for not mentioning relationship to sibling list tools, but this is minor.

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?

The input schema covers 100% of the parameters (user_google_email and task_list_id) with clear descriptions. The tool description adds no extra parameter semantics, but the schema is sufficient. Baseline of 3 is warranted because the schema does the heavy lifting.

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 uses the specific verb 'get' with the resource 'task list', clearly indicating a read operation for a single list. It naturally distinguishes itself from sibling tools like 'list_task_lists' (which lists all) and 'get_task' (which retrieves a task within a list), making the tool's purpose unambiguous.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives such as 'list_task_lists' or 'get_task'. It does not mention prerequisites, typical scenarios, or situations where another tool would be more appropriate, leaving the agent without sufficient decision support.

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

get_versionGet VersionB
Read-onlyIdempotent

Gets details of a specific version.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
version_numberYesThe version number to retrieve (1, 2, 3, etc.)
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds no behavioral context beyond what annotations and the output schema imply, such as what 'details' are included or any auth constraints.

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 a single sentence with no redundant wording. It is front-loaded with the main action and resource, making it highly concise and appropriately sized for a simple read operation.

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

Completeness3/5

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

Given the simple read nature, full schema, output schema, and annotations, the description is minimally sufficient. However, it lacks explicit context that this retrieves an Apps Script version, which could lead to ambiguity even with sibling names present.

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% and all three parameters (script_id, version_number, user_google_email) are fully documented in the schema. The description adds no parameter-specific semantics, but the baseline of 3 applies given full schema coverage.

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

Purpose4/5

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

The description uses a specific verb 'Gets' and identifies a resource ('details of a specific version'), which clearly distinguishes it from siblings like list_versions (all versions) and create_version (new version). However, it does not explicitly mention that it retrieves a script version, relying on parameter context.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention that list_versions should be used for retrieving all versions or that this tool is for a single version, leaving the agent to infer usage from the name and sibling context.

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

import_to_google_docImport to Google DocA

Imports a file (Markdown, DOCX, TXT, HTML, RTF, ODT) into Google Docs format with automatic conversion.

Google Drive automatically converts the source file to native Google Docs format, preserving formatting like headings, lists, bold, italic, etc. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNoText content for text-based formats. Use only for short snippets or content already in memory.
file_urlNoRemote URL to fetch the file from (http/https).
file_nameYesThe name for the new Google Doc (extension will be ignored).
file_pathNoLocal file path or file:// URL for any supported format (MD, TXT, HTML, DOCX, ODT, RTF). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files.
folder_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('md', 'markdown', 'docx', 'txt', 'html', 'rtf', 'odt'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for a binary source such as DOCX or ODT.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

The description adds behavioral context beyond annotations by explaining that Google Drive automatically converts the file, preserves formatting, and that binary sources can be passed as base64_content. It also discloses that file_path can still load files into memory, which is useful performance-related behavior.

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 action, and every sentence serves a purpose. It avoids restating the parameter schema and keeps additional guidance brief.

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, combined with 100% schema description coverage and an output schema, provides enough information to select and invoke the tool correctly. It covers supported formats, conversion behavior, input modes, and practical guidance for larger files.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds extra value by advising when to prefer file_path for batch operations and by clarifying that binary sources may use base64_content, going beyond what the schema fields already state.

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 ('Imports'), a clear target resource ('Google Docs format'), and enumerates the supported source formats. It differentiates from sibling import tools (import_to_google_slides, import_to_google_sheets) by making the destination format explicit.

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

Usage Guidelines4/5

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

The description gives clear context on when to use file_path versus content/base64_content, especially for batch operations, telling callers to avoid loading full file contents into context. It does not explicitly contrast against sibling tools, but the intended use case is clear.

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

import_to_google_sheetsImport to Google SheetsA

Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.

Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentNoText content for text-based formats (CSV, TSV). Use only for short snippets or content already in memory.
file_urlNoRemote URL to fetch the spreadsheet from (http/https).
file_nameYesThe name for the new Google Sheets spreadsheet (extension will be ignored).
file_pathNoLocal file path or file:// URL for any supported format (XLSX, XLS, ODS, CSV, TSV). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files.
folder_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('xlsx', 'xls', 'ods', 'csv', 'tsv'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for an XLSX, XLS, or ODS source.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the safety profile (mutating, non-destructive, non-idempotent, open-world); the description adds real behavioral context — 'Google Drive automatically converts the source spreadsheet to native Google Sheets format, preserving rows, columns, sheets, and values.' It stops short of covering auth prerequisites or failure modes, but there is no contradiction with the annotations.

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 sentences, each earning its place: purpose, conversion behavior, and delivery-channel guidance. The most important information (what it imports and where) is front-loaded, with no redundancy against the schema.

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

Completeness4/5

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

For a 9-parameter tool with full schema coverage, an output schema, and annotations, the description covers purpose, behavior, and selection guidance in compact form. It could add one sentence on auth expectations (user_google_email is required) or where the resulting spreadsheet lands (folder_id defaults to 'root'), but those are already documented in the schema.

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?

Schema coverage is 100%, so the baseline is 3; the description pushes above it by explaining when to prefer file_path over base64_content/content and by framing base64_content as the channel for binary sources. The remaining parameters (folder_id, source_format, base64_sha256) are left to the already-detailed 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?

Opens with a specific verb and resource: 'Imports a spreadsheet (XLSX, XLS, ODS, CSV, TSV) into Google Sheets format with automatic conversion.' The enumerated formats and explicit destination make it immediately distinguishable from the import_to_google_doc and import_to_google_slides siblings by target format.

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

Usage Guidelines4/5

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

Provides actionable delivery-channel guidance: 'Binary sources may be passed directly as base64_content' and 'For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.' It does not, however, say when to choose this over near-siblings (create_spreadsheet, import_to_google_doc, import_to_google_slides) or state exclusions.

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

import_to_google_slidesImport to Google SlidesA

Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.

Google Drive automatically converts the source presentation to native Google Slides format, preserving slides, layouts, text, and images. Binary sources may be passed directly as base64_content. For batch operations, prefer file_path for files on disk so callers do not need to load full file contents into their context.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_urlNoRemote URL to fetch the presentation from (http/https).
file_nameYesThe name for the new Google Slides presentation (extension will be ignored).
file_pathNoLocal file path or file:// URL for any supported format (PPTX, PPT, ODP). Appropriate for larger files than content, but file_path may still load the file into memory or perform non-streaming reads. Avoid very large files that could exceed memory or time limits; use streaming/chunked uploads or an alternative API for huge files.
folder_idNoThe ID of the parent folder. Defaults to 'root'.root
base64_sha256NoExpected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks.
source_formatNoSource format hint ('pptx', 'ppt', 'odp'). Auto-detected from file_name extension if not provided.
base64_contentNoStandard base64-encoded bytes for a PPTX or ODP source.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

It discloses automatic Google Drive conversion, preservation of slides/layouts/text/images, and the important caveat that file_path may still load the file into memory or perform non-streaming reads, with advice to avoid very large files. This adds substantial behavioral context beyond the sparse annotations and contains no contradiction.

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 three focused sentences: purpose first, then conversion behavior, then input-method guidance. Every sentence earns its place, and there is no redundant or vague wording.

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 an 8-parameter import tool, the description plus schema and output schema cover supported formats, conversion behavior, input methods, destination folder default, and performance/memory caveats. The description does not need to enumerate every parameter because the schema already does so comprehensively.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds useful semantics for choosing between base64_content and file_path, especially for batch operations and avoiding context bloat. It does not need to repeat the schema's detailed parameter descriptions.

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: 'Imports a presentation (PPTX, PPT, ODP) into Google Slides format with automatic conversion.' It names supported source formats and the destination format, which clearly distinguishes it from siblings like import_to_google_doc and import_to_google_sheets.

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

Usage Guidelines4/5

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

The description gives practical guidance: binary sources may use base64_content, and batch operations should prefer file_path to avoid loading full contents into context. However, it does not explicitly compare this tool to alternatives such as create_presentation or other import tools, so when-not-to-use guidance is only implicit.

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

insert_doc_elementsInsert Doc ElementsB

Inserts structural elements like tables, lists, or page breaks into a Google Doc.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoNumber of rows for table (required for table)
textNoInitial text content for list items
indexYesPosition to insert element (0-based)
columnsNoNumber of columns for table (required for table)
list_typeNoType of list ("UNORDERED", "ORDERED") (required for list)
document_idYesID of the document to update
element_typeYesType of element to insert ("table", "list", "page_break")
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already indicate this is a mutation (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds no behavioral context beyond that, such as how insertion affects existing content, positional indexing behavior, or any side effects. It does not contradict the annotations, but fails to enrich them.

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 a single, front-loaded sentence with zero wasted words. It immediately states the action, target, and examples, making it easy to scan and understand.

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

Completeness4/5

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

With a fully described schema, annotations, and an output schema, the one-sentence description is largely sufficient. However, the tool has 8 parameters with conditional dependencies, and while the schema covers these, a bit more contextual guidance (e.g., 'required parameters depend on element_type') would help. Still, the structured data compensates well.

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?

The input schema has 100% coverage, describing each parameter including conditional requirements (e.g., rows/columns for table, list_type for list). The description only names example element types and does not add meaning beyond what the schema already provides. Baseline 3 is appropriate.

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 uses a specific verb ('Inserts') and resource ('structural elements like tables, lists, or page breaks into a Google Doc'), clearly distinguishing it from sibling tools like insert_doc_image (images) and modify_doc_text (text). It precisely communicates the tool's scope.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives such as batch_update_doc, create_table_with_data, or insert_doc_image. There is no mention of prerequisites, exclusions, or scenarios where another tool would be more appropriate.

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

insert_doc_imageInsert Doc ImageA

Inserts an image into a Google Doc from Drive or a URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexYesPosition to insert image (0-based)
widthNoImage width in points (optional)
heightNoImage height in points (optional)
document_idYesID of the document to update
image_sourceYesDrive file ID or public image URL
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, establishing a safe mutation profile. The description adds context about supported source types (Drive/URL) but does not disclose other behavioral details such as effects on existing content or permission requirements. With annotations present, the bar is lower, so this is acceptable.

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 a single, front-loaded sentence with no redundant words. It clearly states the action and source in minimal space.

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

Completeness4/5

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

Given the rich schema and annotations, the description covers the essential context adequately. It clearly states the core operation, and the schema handles parameter details, while annotations handle safety. Minor additional context (e.g., prerequisites or error scenarios) would have pushed it higher, but the tool is well-specified already.

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?

The input schema has 100% parameter description coverage, so the schema already documents each parameter and its purpose. The description's mention of 'from Drive or a URL' loosely corresponds to the image_source parameter but adds no additional semantic detail beyond what the schema provides.

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 uses a specific verb ('Inserts') with a specific resource ('image into a Google Doc') and specifies the source ('from Drive or a URL'). This clearly distinguishes it from broader sibling tools like insert_doc_elements, making the purpose unambiguous.

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

Usage Guidelines3/5

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

The description implies the primary use case (inserting an image into a Google Doc) but does not explicitly state when to use this tool over alternatives or any exclusions. With many sibling tools like insert_doc_elements, explicit guidance would have been helpful, but the specificity of the action makes the intended context clear.

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

inspect_doc_structureInspect Doc StructureA
Read-onlyIdempotent

Essential tool for finding safe insertion points and understanding document structure.

USE THIS FOR:

  • Finding the correct index for table insertion

  • Understanding document layout before making changes

  • Locating existing tables and their positions

  • Getting document statistics and complexity info

  • Inspecting structure of specific tabs

CRITICAL FOR TABLE OPERATIONS: ALWAYS call this BEFORE creating tables to get a safe insertion index.

WHAT THE OUTPUT SHOWS:

  • total_elements: Number of document elements

  • total_length: Maximum safe index for insertion

  • tables: Number of existing tables

  • table_details: Position and dimensions of each table

  • headers / footers: Real segment IDs and previews for header/footer editing

  • tabs: List of available tabs in the document (if no tab_id specified)

WORKFLOW FOR TABLE INSERTION: Step 1: Call this function Step 2: Note the "total_length" value Step 3: Use an index < total_length for table insertion Step 4: Create your table

FORMATTING WORKFLOW: After inserting all text via batch_update_doc with end_of_segment=true, call this tool with detailed=true to get exact start_index and end_index for every paragraph. Use those indices directly in format_text and update_paragraph_style operations in a second batch_update_doc call.

HEADER/FOOTER WORKFLOW: For ordinary header/footer text, use update_doc_headers_footers. If you need low-level segment editing, call this tool first and use the real segment_id values returned under headers/footers. Do not invent IDs.

The detailed output includes elements[].start_index and elements[].end_index with text_preview for each paragraph, making it easy to identify which ranges to format.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoOptional ID of the tab to inspect. If not provided, inspects main document.
detailedNoWhether to return detailed structure information
document_idYesID of the document to inspect
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/idempotentHint and non-destructive, but the description adds substantial behavioral context: total_length is the maximum safe insertion index, headers/footers return real segment IDs, and detailed output includes exact start/end indices. It also warns 'Do not invent IDs,' which is valuable operational guidance.

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

Conciseness4/5

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

The description is long but well-structured with clear headings and front-loaded purpose. Every section (USE THIS FOR, OUTPUT SHOWS, workflows) provides operational value, though the step-by-step workflow details make it more verbose than strictly necessary.

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 thorough: it explains safe insertion indices, output fields, detailed mode, tab behavior, and integration with batch_update_doc and update_doc_headers_footers. Since an output schema exists, it does not need to enumerate return values, making it complete for the tool's complexity.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning for `detailed` by explaining it returns exact start_index/end_index per paragraph for formatting workflows, and for `tab_id` by noting it lists tabs when omitted. Other parameters are self-explanatory and already covered by 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 opens with 'Essential tool for finding safe insertion points and understanding document structure,' a specific verb+resource+scope statement. It clearly enumerates use cases like locating tables, inspecting tabs, and getting document statistics, which distinguishes it from sibling doc mutation tools.

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 provides an explicit 'USE THIS FOR' list and a 'CRITICAL FOR TABLE OPERATIONS' warning to always call before creating tables. It also gives step-by-step workflows for table insertion, formatting, and header/footer editing, and explicitly says to use `update_doc_headers_footers` for ordinary header/footer text instead.

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

list_calendarsList CalendarsA
Read-onlyIdempotent

Retrieves a list of calendars accessible to the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already provide readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description does not need to repeat those. It adds the scope 'accessible to the authenticated user', which is useful context, but does not disclose additional behaviors like pagination or result ordering.

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 a single, concise sentence that is front-loaded with the action and resource. Every word adds value, with no redundancy or 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?

For a simple list tool with one parameter, complete annotations, and an output schema, the description is sufficiently complete. It does not need to explain return values because the output schema handles that.

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?

The schema covers 100% of the parameters, including a description for user_google_email. The tool description adds no parameter-specific meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

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 clearly states the tool retrieves a list of calendars accessible to the authenticated user. It uses a specific verb ('retrieves') and resource ('list of calendars'), and distinguishes it from sibling tools like create_calendar or get_events.

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

Usage Guidelines3/5

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

The description implies usage when a list of calendars is needed but does not explicitly mention when to use this tool over alternatives or any exclusions. There is no guidance about prerequisites or when not to use it.

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

list_contact_groupsList Contact GroupsA
Read-onlyIdempotent

List contact groups (labels) for the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoMaximum number of groups to return (default: 100, max: 1000).
page_tokenNoToken for pagination.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds minimal context by clarifying the scope ('for the user') and the terminology ('labels'). It does not disclose pagination behavior or other operational details, but the annotations cover the safety profile adequately.

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 a single, front-loaded sentence with no redundant words. It states the action, resource, and scope efficiently.

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

Completeness4/5

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

Given the tool's simplicity, the presence of a rich output schema, and strong annotations, the description is adequate. It could mention pagination or the required user_google_email, but those are already covered by the schema, so the description remains sufficient without being verbose.

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%, with each parameter described in the input schema. The description adds no parameter-specific meaning, so it does not compensate beyond the schema baseline.

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 uses a specific verb ('List') and resource ('contact groups'), with an explicit alias ('labels') and scope ('for the user'). This clearly distinguishes it from sibling tools like get_contact_group and manage_contact_group.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as get_contact_group or list_contacts. The description only implies usage through its name and does not mention exclusions or alternative scenarios.

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

list_contactsList ContactsB
Read-onlyIdempotent

List contacts for the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoMaximum number of contacts to return (default: 100, max: 1000).
page_tokenNoToken for pagination.
sort_orderNoSort order: "LAST_MODIFIED_ASCENDING", "LAST_MODIFIED_DESCENDING", "FIRST_NAME_ASCENDING", or "LAST_NAME_ASCENDING".
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds the scope constraint 'for the authenticated user,' which is useful context beyond the annotations. However, it does not disclose pagination behavior, default ordering, or what fields are returned, so it provides limited additional behavioral detail.

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 a single, clear sentence with no filler or redundancy. It is appropriately sized for a simple list operation and front-loads the key action and scope.

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

Completeness4/5

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

Given the strong annotations, complete parameter descriptions, and presence of an output schema, the description is mostly sufficient for a straightforward read-only list. It clearly states the resource and user scope, though it lacks alternative-tool guidance, which is covered under usage guidelines rather than completeness.

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 all parameters, including defaults and token semantics. The description does not add extra meaning beyond the schema, resulting in the baseline score of 3.

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

Purpose4/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: 'List contacts for the authenticated user.' This clearly conveys the tool's function. However, it does not explicitly differentiate from sibling tools like search_contacts or get_contact, so it falls short of a 5.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives such as search_contacts or get_contact. The description only states what it does, leaving the agent to infer usage context without explicit exclusions or recommendations.

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

list_deploymentsList DeploymentsA
Read-onlyIdempotent

Lists all deployments for a script project, including the bound version number of each deployment so callers can verify which version is served.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the read-only, non-destructive, idempotent nature of the operation. The description adds useful behavioral context beyond the annotations by stating that each deployment exposes its bound version number and that this enables verification of which version is served.

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?

A single sentence that front-loads the primary action and resource, then adds the most important distinguishing behavior. Every phrase earns its place and there is no 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?

For a simple read-only list operation with two fully described parameters, strong annotations, and an output schema, the description is complete. It tells the agent what the tool does, what extra information it provides, and why that information matters.

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 both parameters are already documented in the input schema. The description does not add parameter-level detail, but it also does not need to because the schema fully covers them.

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 uses a specific verb ('Lists') and resource ('all deployments for a script project'), and explains the key distinguishing detail that each deployment includes its bound version number. This makes it easy to tell apart from sibling tools like manage_deployment or list_versions without opening schemas.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: to list deployments and verify which version is served. It does not explicitly name alternatives or state when not to use it, but the purpose is specific enough that an agent can infer the appropriate scenario.

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

list_docs_in_folderList Docs in FolderA
Read-onlyIdempotent

Lists Google Docs within a specific Drive folder.

Returns: str: A formatted list of Google Docs in the specified folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idNoroot
page_sizeNo
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds that it returns a formatted list and scopes to a specific folder, providing some context beyond annotations, but doesn't discuss pagination, error handling, or that it only returns Google Docs.

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?

Two sentences, front-loaded with the core action, no fluff. The return type is noted compactly without unnecessary elaboration, making it highly scannable.

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

Completeness4/5

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

For a simple read-only list tool with safety annotations and a default-everything schema, the description covers the core purpose and return shape. It lacks parameter semantics and usage contrast, but these are scored separately; overall it's adequately complete for its low complexity.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not explain any of the three parameters. The phrase 'specific Drive folder' hints at folder_id but provides no detail on defaults, required user_google_email, or page_size, leaving the agent without critical parameter semantics.

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 uses a specific verb 'Lists' with resource 'Google Docs' and scoping phrase 'within a specific Drive folder', clearly distinguishing it from related tools like list_drive_items and search_drive_files. The title and description align perfectly.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this vs alternatives is provided. The description implies usage for listing docs in a folder but doesn't mention exclusions or alternative tools such as search_drive_files, leaving the agent to infer context.

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

list_document_commentsList Document CommentsA
Read-onlyIdempotent

List all comments from a Google Document (optional max_comments to limit results).

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes
max_commentsNo
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description only adds the max_comments limiting behavior. It does not disclose any other behavioral traits such as pagination, sorting, or whether resolved comments are included.

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 a single concise sentence that front-loads the primary purpose (list all comments) and includes the optional parameter. Every word earns its place with no redundancy.

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

Completeness3/5

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

With a simple tool, annotations, and an output schema, the description is minimally complete but lacks details like whether comments include resolved ones, pagination behavior, or any filtering. It does not fully leverage the context, leaving some ambiguity about the return set.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It explains max_comments as a limit on results, but does not clarify document_id or user_google_email, although their names are somewhat self-explanatory. The description adds limited value 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 clearly states the tool lists all comments from a Google Document, specifying the resource (Google Document) and the action (list). This distinguishes it from sibling tools like list_spreadsheet_comments and manage_document_comment.

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

Usage Guidelines3/5

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

The description implies usage by stating the tool lists comments and mentions an optional limit using max_comments, but it does not explicitly state when to use this tool versus alternatives or any exclusion criteria. No alternatives are referenced.

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

list_drive_itemsList Drive ItemsA
Read-onlyIdempotent

Lists files/folders or shared drive containers, supporting shared drives. If drive_id is specified, lists items within that shared drive. folder_id is then relative to that drive (or use drive_id as folder_id for root). If drive_id is not specified, lists items from user's "My Drive" and accessible shared drives (if include_items_from_all_drives is True). Set resource_type to "shared_drives" to list shared drive containers instead of folder contents.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoShared drive query used only when resource_type="shared_drives", e.g. "name contains 'Engineering'".
corporaNoCorpus to query ('user', 'drive', 'allDrives'). If `drive_id` is set and `corpora` is None, 'drive' is used. If None and no `drive_id`, API defaults apply.
detailedNoWhether to include size, modified time, and link in results. Defaults to True.
drive_idNoID of the shared drive. If provided, the listing is scoped to this drive.
order_byNoSort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering).
file_typeNoRestrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types).
folder_idNoThe ID of the Google Drive folder. Defaults to 'root'. For a shared drive, this can be the shared drive's ID to list its root, or a folder ID within that shared drive.root
page_sizeNoThe maximum number of items to return. Defaults to 100.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
resource_typeNoWhat to list. Use "items" for folder contents or "shared_drives" for shared drive containers. Defaults to "items".items
user_google_emailYesThe user's Google email address. Required.
include_organizersNoWhen resource_type="shared_drives", include principals with the organizer role. This costs one extra permissions.list API call per shared drive returned. Defaults to False.
include_items_from_all_drivesNoWhether items from all accessible shared drives should be included if `drive_id` is not set. Defaults to True.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable scoping behavior (how drive_id and resource_type alter the listing scope) and notes the include_items_from_all_drives condition, going beyond the annotation signals. It does not disclose pagination or rate-limit behavior, but for a straightforward list tool this is adequate.

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 four sentences with no filler. The first sentence states the core purpose, and the remaining sentences concisely explain the key decision branches. Every sentence earns its place.

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

Completeness4/5

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

Given the comprehensive input schema, presence of an output schema, and clear annotations, the description covers the main behavioral branches of this listing tool. It could mention how it differs from search_drive_files or discuss edge cases like pagination, but it is complete enough for an agent to understand scope and core usage.

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?

With 100% schema description coverage, the schema already documents all 13 parameters. The description adds semantic value by explaining the relationship between drive_id, folder_id, and resource_type, and by clarifying when include_items_from_all_drives applies—context that is not evident from the individual parameter descriptions.

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 'Lists files/folders or shared drive containers', providing a specific verb and resource. The conditional logic for drive_id and resource_type clarifies distinct listing modes, making it clearly distinct from sibling tools like search_drive_files.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool based on whether drive_id is provided or resource_type is set to 'shared_drives'. However, it does not explicitly contrast with alternatives like search_drive_files or get_drive_file_content, so it lacks explicit when-not guidance.

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

list_form_responsesList Form ResponsesA
Read-onlyIdempotent

List a form's responses.

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesThe ID of the form.
page_sizeNoMaximum number of responses to return. Defaults to 10.
page_tokenNoToken for retrieving next page of results.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds no additional behavioral context such as pagination behavior or return format, but these are inferable from the schema and output schema. No contradiction with annotations.

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 a single sentence that is front-loaded and contains zero wasted words. It efficiently states the core function without unnecessary detail, making it highly concise and well-structured.

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 the tool's simplicity, rich schema (100% parameter coverage), output schema, and comprehensive annotations, the one-sentence description is adequate. It does not need to explain return values (output schema covers that) or pagination (schema covers that). The description is complete for its purpose.

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 baseline is 3. The description does not add any parameter semantics beyond what the schema already provides; it only states the general purpose without elaborating on parameter usage or syntax.

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

Purpose4/5

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

The description clearly states the action (List) and the resource (a form's responses), making the purpose explicit. It does not differentiate from the sibling tool get_form_response, which likely retrieves a single response, so it lacks explicit sibling differentiation. Verb+resource+scope is clear, but the scope is generic.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like get_form_response, and does not mention pagination or when to use page_token. It simply states the function without any contextual usage hints or exclusions.

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

list_gmail_filtersList Gmail FiltersA
Read-onlyIdempotent

Lists all Gmail filters configured in the user's mailbox.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false, fully covering the safety profile. The description adds no additional behavioral context such as pagination, rate limits, or auth requirements, so it provides no extra value beyond the annotations.

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 a single sentence with no wasted words. It directly states the purpose without redundancy, making it appropriately sized and front-loaded.

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

Completeness4/5

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

The tool is simple with one parameter, complete schema, strong annotations, and an output schema present. The description adequately states what it does, though it lacks additional context like scope limitations (e.g., delegated accounts) or data freshness. It is nearly complete for this straightforward list operation.

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% as the sole parameter `user_google_email` has a clear description ('The user's Google email address. Required.'). The tool description does not add any parameter-specific meaning, so it sits at the baseline for high coverage.

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 uses a specific verb 'Lists' with a clear resource 'all Gmail filters' and scope 'in the user's mailbox'. This clearly distinguishes it from sibling tools like manage_gmail_filter (which mutates filters) and list_gmail_labels (different resource).

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

Usage Guidelines3/5

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

The description gives no explicit guidance on when to use this tool versus alternatives. It implies its use for listing filters but does not mention that it is the read-only counterpart to manage_gmail_filter or provide any exclusions. Usage is implied, not stated.

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

list_gmail_labelsList Gmail LabelsC
Read-onlyIdempotent

Lists labels in the user's Gmail account.

ParametersJSON Schema
NameRequiredDescriptionDefault
prefixNoReturn only labels whose name starts with this exact (case-sensitive) string. users.labels.list accepts no filter, so the full list is fetched and narrowed here: this shrinks what the caller receives, not the API call.
compactNoReturn minimal JSON {"count", "labels": [{"id", "name"}]} sorted by name, instead of the formatted text list. For callers that parse the result, e.g. a label cache refresh.
include_systemNoInclude Gmail system labels (INBOX, SENT, ...). Set False to return user labels only.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

The annotations already carry the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=true, destructiveHint=false), but the description itself adds zero behavioral context beyond restating the tool's name. It discloses no auth requirements, no account-scope nuances, and no output characteristics; notably, the schema's prefix parameter description ('the full list is fetched and narrowed here') does more behavioral disclosure than the tool description itself.

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

Conciseness4/5

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

A single sentence with zero filler and the core action front-loaded. It is appropriately sized for a simple read tool. It doesn't earn a 5 because the brevity comes at the cost of omitting usage guidance that similar tools include as a second sentence.

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

Completeness3/5

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

With 100% schema coverage, detailed parameter descriptions, a present output schema, and four safety annotations, an agent can technically invoke and parse the result correctly. The description is adequate but complete only in a minimal sense: it fails to help an agent disambiguate between list_gmail_labels and list_gmail_filters, and it never states that this tool is the read-side counterpart to manage_gmail_label.

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 baseline of 3 applies. The tool description mentions no parameters, but each of the four parameters carries a rich description in the schema, including prefix case-sensitivity and the fetch-then-narrow behavior, the compact JSON response shape, and the include_system toggle. The schema does the heavy lifting here, and the description adds nothing beyond it.

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

Purpose4/5

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

The description 'Lists labels in the user's Gmail account' uses a specific verb (Lists) and a clear resource (labels in the user's Gmail account). It is precise about what is being listed and does not confuse the operation with mutation tools like manage_gmail_label. However, it does not explicitly differentiate from the closely related sibling list_gmail_filters, leaving the agent to infer the labels-vs-filters distinction.

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

Usage Guidelines2/5

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

The description offers no guidance on when to use this tool versus alternatives. With siblings like list_gmail_filters, manage_gmail_label, and modify_gmail_message_labels, an agent receives no basis for choosing between listing labels, listing filters, or managing labels, so the when-to-use decision is left entirely to inference.

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

list_presentation_commentsList Presentation CommentsA
Read-onlyIdempotent

List all comments from a Google Presentation (optional max_comments to limit results).

ParametersJSON Schema
NameRequiredDescriptionDefault
max_commentsNo
presentation_idYes
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the optional max_comments limit, which clarifies that all comments are returned unless a limit is set. No contradiction with annotations.

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?

A single, front-loaded sentence that states the verb, object, and a conditional modifier. No irrelevant detail or repetition of schema fields.

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

Completeness4/5

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

With a read-only, idempotent annotation set and an output schema present, the description is adequate for a simple list operation. It covers the core behavior and the optional parameter, though it doesn't discuss pagination or auth prerequisites (already implied by user_google_email and annotations).

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 0%, so the description must compensate. It clarifies max_comments as a limit, but presentation_id and user_google_email are only explained by their names and the tool's context. The description adds some meaning but not enough to fully cover the required parameters.

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 uses a specific verb 'List' plus a clear resource 'all comments from a Google Presentation'. It distinguishes from sibling tools like list_document_comments and manage_presentation_comment by specifying the presentation scope.

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

Usage Guidelines4/5

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

The description clearly indicates the tool is for reading comments from a presentation, but it does not explicitly contrast with related tools such as manage_presentation_comment or list_document_comments. The context is clear, but no direct exclusions or alternative recommendations are provided.

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

list_script_processesList Script ProcessesA
Read-onlyIdempotent

Lists recent execution processes for user's scripts.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoNumber of results (default: 50)
script_idNoOptional filter by script ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the 'recent' scope and 'user's scripts' context, which is useful, but it doesn't disclose behavioral details like pagination behavior, ordering, or filtering beyond what the schema specifies.

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 a single, concise sentence that is front-loaded with the key verb 'Lists' and includes all essential information without redundancy. It wastes no words and is easy to scan.

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

Completeness4/5

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

For a straightforward listing tool, the description is sufficiently complete given the presence of an output schema and comprehensive annotations. It doesn't explain what 'execution processes' mean in detail, but that is likely domain-standard. The only minor gap is that 'recent' is not precisely defined, but this is not critical.

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?

The schema describes all three parameters (page_size, script_id, user_google_email) with their types and defaults, achieving 100% schema description coverage. The description adds no parameter-level information, so it does not enhance what the schema already provides.

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 uses the specific verb 'Lists' with a clear resource 'recent execution processes for user's scripts', making the tool's purpose unambiguous. It distinguishes itself from sibling tools like list_script_projects and list_versions by focusing on execution processes rather than projects or versions.

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

Usage Guidelines4/5

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

The description clearly implies this tool is for retrieving execution history, which provides context. However, it does not explicitly mention when to use it versus alternatives like get_script_metrics or list_script_projects, nor does it state any exclusions or prerequisites.

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

list_script_projectsList Script ProjectsA
Read-onlyIdempotent

Lists Google Apps Script projects accessible to the user.

Uses Drive API to find Apps Script files.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoNumber of results per page (default: 50)
page_tokenNoToken for pagination (optional)
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the context that it uses the Drive API to find Apps Script files, which is a useful implementation detail. However, it does not disclose pagination behavior or whether it returns only projects the user owns or all accessible projects. With annotations carrying the safety burden, this is adequate but not rich.

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, containing only two short sentences. The first sentence front-loads the core purpose ('Lists Google Apps Script projects accessible to the user'), and the second adds relevant implementation context ('Uses Drive API to find Apps Script files'). Every sentence earns its place with no filler.

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

Completeness4/5

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

The tool is simple: a list operation with well-specified schema and annotations. The description confirms the scope (accessible to the user) and the underlying method (Drive API). The presence of an output schema means return values need not be described. The only minor gap is not mentioning that this may only return projects with Drive visibility, but that is covered by 'accessible to the user.' Overall, it is complete enough for an agent to use 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 baseline is 3. The description does not add any additional meaning to the parameters (page_size, page_token, user_google_email) beyond what the schema already provides. It does not clarify how page_size interacts with results or what page_token refers to. The schema fully documents parameter names and defaults, so no deduction is warranted.

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 clearly states 'Lists Google Apps Script projects accessible to the user.' This is a specific verb+resource combination that distinguishes it from sibling tools like get_script_project (which fetches a single project) and list_deployments (which lists deployments). The mention of 'Drive API' further clarifies the tool's scope.

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

Usage Guidelines3/5

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

The description implies usage when you need to enumerate all Apps Script projects visible to the user, but it does not explicitly name alternatives or exclusions. For example, it does not say 'For a specific project, use get_script_project' or 'For scripts that are running, use list_script_processes.' This is implied usage rather than explicit guidance.

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

list_sheet_tablesList Sheet TablesA
Read-onlyIdempotent

Lists all structured tables in a spreadsheet with their IDs, names, ranges, and column details. Use this to find table IDs for append_table_rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is clear. The description adds behavioral detail by specifying what is returned (IDs, names, ranges, column details) and that it lists all structured tables, which goes beyond the annotations. This is helpful context for the agent.

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 two sentences total, front-loaded with the main action in the first sentence. Every word adds value: the first specifies the resource and output, the second gives the use case. No waste.

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 an output schema exists (though not shown), the description appropriately summarizes the return values (IDs, names, etc.) at a high level. It also mentions the downstream use case, and annotations cover safety. This is complete for a simple read-only listing 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?

The input schema provides full descriptions for both parameters (spreadsheet_id and user_google_email) with 100% coverage. The description does not add further parameter details, but none are needed because the schema is sufficient. Baseline 3 applies.

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 clearly states the tool lists all structured tables in a spreadsheet, specifying the resource (tables) and the action (lists). It also distinguishes from sibling tools by noting it provides table IDs for append_table_rows, which is a sibling tool. This makes the purpose unambiguous.

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

Usage Guidelines4/5

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

The description explicitly suggests using this tool to find table IDs for append_table_rows, giving a concrete use case. It doesn't explicitly mention when not to use it, but the context is clear enough for an agent to select it for table discovery. It doesn't reference alternative tools, but the named downstream use is sufficient guidance.

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

list_spacesList SpacesB
Read-onlyIdempotent

Lists Google Chat spaces (rooms and direct messages) accessible to the user.

Returns: str: A formatted list of Google Chat spaces accessible to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNo
space_typeNoall
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the scope ('accessible to the user') and the return type (a formatted string). However, it does not explain behavior around pagination, space_type filtering, or what happens if the user email is invalid/unauthorized.

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

Conciseness4/5

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

The description is very brief and front-loaded, stating the core purpose in the first sentence. The 'Returns' line is somewhat redundant given the output schema, but it is acceptable. No unnecessary fluff, though it could be more informative within the same length.

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

Completeness2/5

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

For a tool with 3 parameters and no parameter descriptions, the description is incomplete. It does not explain the use of page_size or space_type, nor does it provide usage context. Although it is a simple list operation, the lack of parameter semantics and usage guidance makes it insufficient for correct invocation.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not mention any of the three parameters (user_google_email, page_size, space_type). It fails to explain the meaning or purpose of these inputs, leaving the agent to guess. This is a significant gap because the description does not compensate for the missing parameter descriptions.

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 clearly states the tool's function with a specific verb ('Lists') and resource ('Google Chat spaces'), and clarifies the scope ('accessible to the user'). It also distinguishes between rooms and direct messages, which helps differentiate it from other list_* tools for different Google services.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, typical use cases, or why you might need to list spaces (e.g., before sending a message). There is no mention of excluded scenarios or similar tools.

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

list_spreadsheet_commentsList Spreadsheet CommentsA
Read-onlyIdempotent

List all comments from a Google Spreadsheet (optional max_comments to limit results).

ParametersJSON Schema
NameRequiredDescriptionDefault
max_commentsNo
spreadsheet_idYes
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare the tool safe (readOnlyHint, idempotentHint, non-destructive), so the description's burden is lighter. It adds the optional max_comments limiting behavior, but does not disclose return format or any other behavioral traits. This is adequate but not rich.

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?

A single sentence with front-loaded purpose and a brief optional parameter note. No filler or unnecessary detail, perfectly sized for a simple list tool.

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

Completeness4/5

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

Given the tool's simplicity, strong annotations, and existence of an output schema, the description is largely complete. It states the action, the resource, and the optional limit. It lacks usage guidance, but that is already penalized in the usage_guidelines dimension.

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 0%, so the description must compensate. It clarifies that max_comments limits results, but leaves spreadsheet_id and user_google_email unaddressed. While these are somewhat self-explanatory from names, the description only partially covers parameter semantics.

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 uses a specific verb 'list' with a clear resource 'comments from a Google Spreadsheet', distinguishing it from sibling tools like manage_spreadsheet_comment (manage vs list) and list_document_comments/list_presentation_comments (different resources).

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no prerequisites. It simply states what it does without contextualizing its place among siblings.

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

list_spreadsheetsList SpreadsheetsA
Read-onlyIdempotent

Lists spreadsheets from Google Drive that the user has access to.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_resultsNoMaximum number of spreadsheets to return. Defaults to 25.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds a scoping constraint ('user has access to'), which is useful context. However, it does not elaborate on pagination or output behavior beyond what the schema provides, so the added behavioral insight is minimal.

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 a single, front-loaded sentence with no redundancy. It efficiently conveys the essential information without any filler or extraneous details.

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

Completeness4/5

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

For a simple read-only listing operation with complete schema coverage, annotations, and an output schema, the description sufficiently covers the core functionality. However, the absence of any mention of related tools or potential limitations makes it not fully complete in the broader context of many similar Drive-related tools.

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%, meaning both parameters (max_results, user_google_email) already have descriptions in the schema. The tool description does not add any additional semantics or usage details for the parameters, so the baseline score of 3 applies.

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 uses a specific verb ('lists') and clearly identifies the resource ('spreadsheets from Google Drive') and scope ('that the user has access to'). This differentiates it from sibling tools like get_spreadsheet_info or read_sheet_values which target specific spreadsheets or data.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like list_drive_items or search_drive_files. There are no exclusions or explicit mentions of suitable contexts, leaving the agent without decision support for tool selection.

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

list_task_listsList Task ListsA
Read-onlyIdempotent

List all task lists for the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_tokenNoToken for pagination.
max_resultsNoMaximum number of task lists to return (default: 1000, max: 1000).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no extra behavioral context, such as pagination behavior or that 'all' may be subject to max_results limits, which could mislead.

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 a single, front-loaded sentence that communicates the core purpose without redundancy. Every word earns its place, and there is no extraneous information.

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

Completeness4/5

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

With an output schema present and annotations covering safety, the description is mostly complete for a simple list operation. However, the word 'all' could conflict with max_results/pagination, so a brief mention of pagination would have made it fully complete.

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 coverage is 100%, with all three parameters described in the input schema. The description does not add meaning beyond the schema, but the schema already explains page_token, max_results, and user_google_email. Baseline 3 is appropriate.

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 uses a specific verb ('List') and resource ('all task lists'), clearly distinguishing it from sibling tools like get_task_list (singular) and list_tasks (tasks within a list). The scope is explicitly 'for the user', making its purpose unambiguous.

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

Usage Guidelines3/5

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

The description implies use when you need to enumerate all task lists for a user, but it does not explicitly state when to prefer this over alternatives like get_task_list or manage_task_list. There are no exclusions or alternative references, so usage guidance is only implied.

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

list_tasksList TasksA
Read-onlyIdempotent

List all tasks in a specific task list.

ParametersJSON Schema
NameRequiredDescriptionDefault
due_maxNoUpper bound for due date (RFC 3339 timestamp).
due_minNoLower bound for due date (RFC 3339 timestamp).
page_tokenNoToken for pagination.
max_resultsNoMaximum number of tasks to return. (default: 20, max: 10000).
show_hiddenNoWhether to include hidden tasks (default: False).
updated_minNoLower bound for last modification time (RFC 3339 timestamp).
show_deletedNoWhether to include deleted tasks (default: False).
task_list_idYesThe ID of the task list to retrieve tasks from.
completed_maxNoUpper bound for completion date (RFC 3339 timestamp).
completed_minNoLower bound for completion date (RFC 3339 timestamp).
show_assignedNoWhether to include assigned tasks (default: False).
show_completedNoWhether to include completed tasks (default: True). Note that show_hidden must also be true to show tasks completed in first party clients, such as the web UI and Google's mobile apps.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds no behavioral context beyond the core action, such as pagination or default filtering, though the schema provides extensive details. No contradiction with annotations.

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 a single sentence of 9 words, front-loaded with the action and resource. Every word is useful, with no unnecessary elaboration or repetition.

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

Completeness4/5

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

The description is adequate for tool selection given the rich schema and output schema. It does not summarize the filtering parameters, but the schema fully compensates for that. It is slightly less complete than a description that explicitly mentions filtering capabilities, but still sufficient for a list operation.

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?

The schema has 100% description coverage for all 13 parameters, so the description adds no additional parameter meaning. The baseline of 3 applies because the schema fully documents each parameter's purpose and defaults.

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 uses the specific verb 'List' with resource 'tasks' and scoping 'in a specific task list'. This clearly distinguishes it from sibling tools like get_task (single task) and list_task_lists (task lists).

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as get_task or list_task_lists. It only states the basic action, leaving the selection entirely to the agent without explicit context or exclusions.

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

list_versionsList VersionsA
Read-onlyIdempotent

Lists all versions of a script project.

Versions are immutable snapshots of your script code. They are created when you deploy or explicitly create a version.

ParametersJSON Schema
NameRequiredDescriptionDefault
script_idYesThe script project ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds useful context by explaining that versions are immutable snapshots, which informs the agent about the nature of the data. This goes beyond the structured annotations without contradicting them.

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, consisting of two sentences that front-load the main purpose and then provide a brief, relevant clarification about version immutability. Every sentence earns its place, with no redundant or filler content.

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

Completeness4/5

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

For a simple list tool, the description is sufficiently complete: the input schema fully documents parameters, annotations cover the safety profile, an output schema exists, and the description provides essential conceptual context about what versions are. No significant gaps remain.

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% for both required parameters (script_id and user_google_email), so the schema already provides complete parameter documentation. The description does not add additional meaning or usage details for the parameters, making the baseline score of 3 appropriate.

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 clearly states the tool's purpose: 'Lists all versions of a script project.' The verb ('lists') and resource ('versions of a script project') are specific, and the clarification that versions are immutable snapshots distinguishes this tool from get_version and create_version siblings.

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

Usage Guidelines3/5

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

The description implies when to use the tool by explaining that versions are created on deployment or explicit creation, suggesting it is used to inspect the history of a script. However, it does not explicitly state when to use this tool over alternatives like get_version or list_deployments, nor does it mention exclusions.

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

manage_conditional_formattingManage Conditional FormattingA
Destructive

Manages conditional formatting rules on a Google Sheet. Supports adding, updating, and deleting conditional formatting rules via a single tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesThe operation to perform. Must be one of "add", "update", or "delete".
range_nameNoA1-style range (optionally with sheet name). Required for "add". Optional for "update" (preserves existing ranges if omitted). Not used for "delete".
rule_indexNo0-based index of the rule. For "add", optionally specifies insertion position. Required for "update" and "delete".
sheet_nameNoSheet name to locate the rule when range_name is omitted. Defaults to the first sheet. Used by "update" and "delete".
text_colorNoHex text color to apply when condition matches. Used by "add" and "update".
condition_typeNoSheets condition type (e.g., NUMBER_GREATER, TEXT_CONTAINS, DATE_BEFORE, CUSTOM_FORMULA). Required for "add". Optional for "update" (preserves existing type if omitted).
spreadsheet_idYesThe ID of the spreadsheet. Required.
gradient_pointsNoList (or JSON list) of gradient points for a color scale. If provided, a gradient rule is created and boolean parameters are ignored. Used by "add" and "update".
background_colorNoHex background color to apply when condition matches. Used by "add" and "update".
condition_valuesNoValues for the condition; accepts a list or a JSON string representing a list. Depends on condition_type. Used by "add" and "update".
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds that the tool supports delete operations, which is consistent with the annotations, but offers no additional side-effect context such as behavior on missing rules or replacement semantics.

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 one clear sentence, front-loaded with the primary purpose, and immediately enumerates the three operations. There is no filler or redundant wording.

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

Completeness4/5

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

With an output schema present and thorough annotations, the description need not explain return values or safety. It provides enough high-level context for a complex tool, though it could mention distinctions from nearby formatting tools. Overall, it is adequate given the structured data available.

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 description does not need to explain parameters. It adds no extra parameter semantics beyond the schema; the baseline of 3 applies because the schema does the heavy lifting.

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 clearly states the tool 'manages conditional formatting rules on a Google Sheet' and enumerates the supported operations: adding, updating, and deleting. This specific verb+resource combination distinguishes it from sibling tools like format_sheet_range, which handles other formatting aspects.

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

Usage Guidelines3/5

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

The description implies use for conditional formatting rule management but provides no explicit when-to-use guidance or alternatives. It does not mention when to prefer this tool over format_sheet_range or other sheet-modification tools, leaving the agent to infer context from the name and operations.

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

manage_contactManage ContactA
Destructive

Create, update, or delete a contact. Consolidated tool replacing create_contact, update_contact, and delete_contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoList of URL dicts {value, type?}. Supported types: homepage, blog, profile, work, ftp, reservations, other, etc.
emailNo[DEPRECATED] Email address. Use emails=[{"address":..., "type":"other"}].
notesNoAdditional notes (for create/update).
phoneNo[DEPRECATED] Single phone number. Use phones=[{"number":..., "type":"mobile"}].
actionYesThe action to perform: "create", "update", or "delete".
emailsNoList of email dicts {address, type?}.
phonesNoList of phone dicts {number, type?}. Supported types: mobile, work, home, main, workMobile, internal, other, etc. Use type="internal" for internal PBX/ATS short numbers (e.g. 250, 301) — stored as a standalone number without + prefix, displayed as "Internal: 250".
addressNoStreet address (for create/update).
birthdayNoBirthday as 'YYYY-MM-DD', 'MM-DD' (no year), or 'clear'/'' to remove.
job_titleNo[DEPRECATED] Job title. Use organizations=[{"title":...}].
nicknamesNoList of nickname dicts {value, type?}. Useful for bilingual contacts (e.g. Hebrew/English alternative forms). Android dialer and WhatsApp search both index nicknames, enabling cross-script lookup. Supported types: default, alternate_name, maiden_name, initials, other, etc.
relationsNoList of relation dicts {person, type?}. Supported types: spouse, child, parent, friend, manager, assistant, etc.
urls_modeNoHow to update urls on "update": "merge" (default), "replace", or "remove". merge dedups by normalized URL (lowercased, trailing slash stripped).merge
contact_idNoThe contact ID. Required for "update" and "delete" actions.
given_nameNoFirst name (for create/update).
emails_modeNoHow to update emails on "update": "merge" (default), "replace", or "remove".merge
family_nameNoLast name (for create/update).
phones_modeNoHow to update phones on "update": "merge" (default), "replace", or "remove". merge = read-modify-write with dedup by canonicalForm/normalized value. replace = overwrite all phones with provided list. remove = delete phones matching provided numbers.merge
organizationNo[DEPRECATED] Company name. Use organizations=[{"name":...}].
user_definedNoList of custom field dicts {key, value}. Useful for structured data like account numbers, IDs, or custom dates.
organizationsNoList of org dicts {name?, title?, department?, jobDescription?, type?}.
nicknames_modeNoHow to update nicknames on "update": "merge" (default), "replace", or "remove".merge
relations_modeNoHow to update relations on "update": "merge" (default), "replace", or "remove".merge
user_defined_modeNoHow to update custom fields on "update": "merge" (default), "replace", or "remove". merge overrides value on matching key; new keys appended.merge
user_google_emailYesThe user's Google email address. Required.
organizations_modeNoHow to update orgs on "update": "merge" (default), "replace", or "remove".merge

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, covering the safety profile. The description adds the 'consolidated tool' context, which is useful but does not disclose other behavioral traits like merge/replace/remove update modes or the requirement of contact_id for update/delete. These are left to the schema descriptions.

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 two sentences, front-loaded with the action verb, and every word earns its place. 'Create, update, or delete a contact' is concise and complete, followed by the consolidation note that explains why this tool exists.

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

Completeness4/5

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

For a 26-parameter CRUD tool with a rich schema and output schema, the description gives enough orientation (verb + consolidation) while the schema handles parameter-level details. It could briefly mention that batch operations are handled elsewhere, but the existing text is adequate given the schema size.

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 input schema already documents every parameter with detailed descriptions, including deprecated aliases, mode behavior, and formatting. The description adds no parameter-specific semantics beyond 'contact', so the baseline of 3 applies.

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 uses a specific verb + resource: 'Create, update, or delete a contact.' It clearly distinguishes this from the 100+ sibling tools by stating it consolidates three former contact tools (create_contact, update_contact, delete_contact). This is a clear, unambiguous statement of purpose.

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

Usage Guidelines4/5

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

It explicitly says this tool replaces create_contact, update_contact, and delete_contact, which tells the agent when to use it for those operations. However, it does not mention when NOT to use it (e.g., batch operations via manage_contacts_batch), leaving a small gap in exclusion guidance.

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

manage_contact_groupManage Contact GroupA
Destructive

Create, update, delete a contact group, or modify its members. Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe group name. Required for "create" and "update" actions.
actionYesThe action to perform: "create", "update", "delete", or "modify_members".
group_idNoThe contact group ID. Required for "update", "delete", and "modify_members" actions.
add_contact_idsNoContact IDs to add (for "modify_members").
delete_contactsNoIf True and action is "delete", also delete contacts in the group (default: False).
user_google_emailYesThe user's Google email address. Required.
remove_contact_idsNoContact IDs to remove (for "modify_members").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=false and destructiveHint=true, and the description's mention of 'delete' is consistent. However, the description adds no additional behavioral context beyond what the annotations and the schema already convey, such as irreversibility or permission requirements.

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 a single, front-loaded sentence that conveys the tool's purpose and consolidation. Every part contributes value, with no redundancy or filler.

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

Completeness4/5

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

Given the tool's complexity (7 parameters, 4 actions), the description provides a clear high-level overview. It does not explain action-specific behavior, but the schema and output schema fill that gap, making the description sufficiently complete for an agent.

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 all parameters. The description adds no parameter-level detail, only summarizing the action types. It does not contradict or extend the schema, so baseline 3 is appropriate.

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 clearly states the tool's function: 'Create, update, delete a contact group, or modify its members.' It uses a specific verb+resource structure and distinguishes itself from siblings by noting it is a 'Consolidated tool replacing create_contact_group, update_contact_group, delete_contact_group, and modify_contact_group_members.'

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 identifies the four tools it replaces, giving clear guidance on when to use this consolidated tool versus the alternatives. The action parameter enumeration further supports when to use it, though it stop short of describing when not to use other group-related tools like listing.

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

manage_contacts_batchManage Contacts BatchA
Destructive

Batch create, update, or delete contacts. Consolidated tool replacing batch_create_contacts, batch_update_contacts, and batch_delete_contacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNoFor "update" action — the single People API field to update across all contacts in this batch. Required. Must be one of: names, phoneNumbers, emailAddresses, organizations, nicknames, urls, userDefined, relations, biographies, addresses, birthdays. Using a single field per batch call prevents unintentional data loss from a union updateMask overwriting unrelated fields.
actionYesThe action to perform: "create", "update", or "delete".
updatesNoList of update dicts for "update" action. Each dict must contain contact_id and may contain the same fields as contacts.
contactsNoList of contact dicts for "create" action. Each dict may contain: given_name, family_name, phones, emails, organizations, notes, address. Deprecated: phone, email, organization, job_title.
contact_idsNoList of contact IDs for "delete" action.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true and readOnlyHint=false, so the description's statement 'Batch create, update, or delete contacts' adds no behavioral information beyond what annotations provide. It does not disclose aspects like partial-failure behavior, permissions, or side effects.

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 two sentences, front-loads the core action, and includes a brief consolidation note with zero filler.

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

Completeness4/5

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

The tool is complex, but the input schema is exceptionally rich and the output schema is present. The description adequately identifies the tool's role as a batch mutation endpoint, though it could ideally include a pointer to the singular manage_contact tool for non-batch operations.

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%, with detailed per-parameter descriptions in the input schema. The tool description itself adds no parameter-level meaning, so a baseline of 3 is appropriate.

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 uses a specific verb phrase 'Batch create, update, or delete contacts' that clearly identifies the resource (contacts) and the batch scope. It also distinguishes from siblings by noting it is a consolidated replacement for three prior batch tools, making its role clear.

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

Usage Guidelines4/5

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

The description conveys clear context: this is the batch counterpart for contact mutations, and it explicitly says it replaces three older batch tools. However, it does not provide explicit guidance about when to use this instead of the singular 'manage_contact' sibling, nor does it list exclusions.

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

manage_deploymentManage DeploymentB
Destructive

Manages Apps Script deployments. Supports creating, updating, and deleting deployments.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform - "create", "update", or "delete"
script_idYesThe script project ID
descriptionNoDeployment description (required for create; optional for update when version_number is supplied)
deployment_idNoThe deployment ID (required for update and delete)
version_numberNoVersion number to point the deployment at (for update only). Required to roll a deployment forward to a newly created script version.
user_google_emailYesUser's email address
version_descriptionNoOptional version description (for create only)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true, and the description merely restates the operations without adding context about the consequences of deletion/update, required permissions, irreversibility, or side effects. No additional behavioral disclosure is provided beyond the schema.

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 two sentences, front-loaded with the resource and actions, with zero filler. Every word earns its place.

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

Completeness3/5

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

The description is minimal but the rich schema (100% param descriptions) and annotations cover operation safety. However, it lacks contextual guidance on selecting this tool vs siblings and doesn't synthesize the action-specific parameters, leaving some completeness gap.

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 all parameter purposes and conditional requirements (e.g., deployment_id required for update/delete). The description adds no parameter-level information, meeting the baseline of 3.

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

Purpose4/5

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

The description clearly states the tool 'Manages Apps Script deployments' and enumerates the supported operations ('creating, updating, and deleting deployments'), giving a specific verb and resource. While 'manages' is somewhat generic, the explicit operation list distinguishes it from siblings like list_deployments.

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

Usage Guidelines3/5

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

Usage context is implied by listing the actions (create/update/delete), so an agent can infer that this tool is for deployment mutation. However, it does not explicitly mention when to use it over alternatives (e.g., list_deployments for reading) or provide exclusions or prerequisites.

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

manage_doc_tabManage Doc TabB
Destructive

Manage document tabs: create, rename, delete, or populate from Markdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoPosition index for new tab, 0-based among siblings (required for create)
titleNoTab title (required for create; used by rename)
actionYesAction to perform - "create", "rename", "delete", or "populate_from_markdown"
tab_idNoTab ID (required for rename, delete, populate_from_markdown; use inspect_doc_structure to find IDs)
document_idYesID of the document
markdown_textNoMarkdown source to render (populate_from_markdown only)
parent_tab_idNoOptional parent tab ID to nest under (create only)
replace_existingNoClear tab body before inserting markdown (default True)
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description need not repeat safety profiles. The description lists destructive actions but does not add context such as replace_existing behavior or irreversibility. It aligns with annotations without adding rich behavioral detail.

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?

A single, front-loaded sentence with an em-colon list of actions. Zero redundant words or filler; it earns its place.

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

Completeness3/5

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

The tool has 9 parameters and 4 distinct actions, but the schema fills in per-action requirements and output schema exists, reducing the burden on the description. The description is minimal but sufficient with structured data. However, a sentence about prerequisites like using inspect_doc_structure for tab IDs would improve completeness.

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 covers all 9 parameters with descriptions (100% coverage), including action-specific requirements like 'index required for create'. The description adds no extra parameter meaning beyond the schema, so baseline 3 is appropriate.

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

Purpose4/5

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

The description names the resource (document tabs) and lists specific actions: create, rename, delete, populate from Markdown. This distinguishes it from other doc manipulation siblings. However, 'Manage' is a generic verb rather than a specific operation, though the list compensates.

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

Usage Guidelines2/5

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

No explicit when-to-use or when-not-to-use guidance, nor alternatives. The tool's purpose is implied by the resource, but there are no exclusions or comparisons to sibling tools like inspect_doc_structure or get_doc_as_markdown.

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

manage_document_commentManage Document CommentA

Manage comments on a Google Document.

Actions:

  • create: Create a new document-level comment. Requires comment_content. Note: The Drive API cannot anchor comments to specific text; only the Google Docs UI can do that.

  • reply: Reply to a comment. Requires comment_id and comment_content.

  • resolve: Resolve a comment. Requires comment_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
comment_idNo
document_idYes
comment_contentNo
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

The description discloses a key behavioral constraint—the Drive API cannot anchor comments to text—which goes beyond annotations. It does not discuss permissions, reversibility of resolve, or other side effects, but annotations already signal non-read-only behavior. Net contribution is moderate.

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 a compact summary followed by a bulleted list of actions, each with dependencies. The note about Drive API limitations is the only extra context and is valuable. No filler or redundancy.

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

Completeness4/5

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

The description covers the three operations and their parameter dependencies, with an output schema available for return values. It lacks details on prerequisites (e.g., edit permissions) and error conditions, but given the multi-action scope, it is reasonably complete.

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?

With 0% schema description coverage, the description compensates by specifying which parameters each action requires (comment_content for create; comment_id and comment_content for reply; comment_id for resolve). It also enumerates the three valid action values. It does not describe document_id or user_google_email, but their names are self-explanatory.

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 clearly states the tool manages document comments and enumerates three specific actions (create, reply, resolve), distinguishing it from read-only sibling list_document_comments and other resource-specific comment tools. The scope is explicit and matches the title.

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

Usage Guidelines3/5

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

The description conveys when to use each action by listing required parameters, and the Drive API anchoring note imposes a limitation on creation. However, it does not explicitly point to list_document_comments for viewing or mention alternative tools, so usage vs alternatives is only implied.

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

manage_drive_accessManage Drive AccessA
Destructive

Consolidated tool for managing Google Drive file and folder access permissions.

Supports granting, batch-granting, updating, revoking permissions, and transferring file ownership -- all through a single entry point.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoPermission role -- 'reader', 'commenter', or 'writer'. Used by "grant" (defaults to 'reader') and "update".
actionYesThe access management action to perform. Required. One of: - "grant": Share with a single user, group, domain, or anyone. - "grant_batch": Share with multiple recipients in one call. - "update": Modify an existing permission (role or expiration). - "revoke": Remove an existing permission. - "transfer_owner": Transfer file ownership to another user.
file_idYesThe ID of the file or folder. Required.
recipientsNoList of recipient objects for "grant_batch". Each should have: email (str), role (str, optional), share_type (str, optional), expiration_time (str, optional). For domain shares use 'domain' field instead of 'email'.
share_typeNoType of sharing -- 'user', 'group', 'domain', or 'anyone'. Used by "grant". Defaults to 'user'.user
share_withNoEmail address (user/group), domain name (domain), or omit for 'anyone'. Used by "grant".
email_messageNoCustom notification email message. Used by "grant" and "grant_batch".
permission_idNoThe permission ID to modify or remove. Required for "update" and "revoke" actions.
expiration_timeNoExpiration in RFC 3339 format (e.g., "2025-01-15T00:00:00Z"). Used by "grant" and "update".
new_owner_emailNoEmail of the new owner. Required for "transfer_owner".
send_notificationNoWhether to send notification emails. Defaults to True. Used by "grant" and "grant_batch".
user_google_emailYesThe user's Google email address. Required.
allow_file_discoveryNoFor 'domain'/'anyone' shares, whether the file appears in search. Used by "grant".
move_to_new_owners_rootNoMove file to the new owner's My Drive root. Defaults to False. Used by "transfer_owner".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already disclose destructiveHint=true and readOnlyHint=false, so mutation risk is known. The description adds the specific actions like revoking and transferring ownership, but does not elaborate on consequences, irreversibility, or notification behaviors beyond what the schema already states.

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 two concise, front-loaded sentences. It wastes no words and communicates the tool's scope and key operations immediately.

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

Completeness4/5

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

Given the rich schema, annotations, and output schema, the description sufficiently frames a complex permission-management tool. It lacks only explicit cross-referencing to permission-related sibling tools, which would improve completeness.

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 coverage is 100% with each of the 14 parameters individually described. The tool description does not add parameter-level meaning beyond listing high-level capabilities, so it stays at the baseline for a fully schema-documented tool.

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 explicitly states the resource (Google Drive file/folder access permissions) and lists the exact supported operations: granting, batch-granting, updating, revoking, and ownership transfer. The 'consolidated tool' and 'single entry point' framing help distinguish it from more specialized permission siblings.

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

Usage Guidelines3/5

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

The description implies a one-stop tool for drive access management but never explicitly states when to use it versus alternatives like set_drive_file_permissions or get_drive_file_permissions. No when-not-to-use or exclusion guidance is provided.

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

manage_eventManage EventB
Destructive

Manages calendar events. Supports creating, updating, deleting, and RSVP.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform - "create", "update", "delete", or "rsvp".
summaryNoEvent title (required for create).
color_idNoEvent color ID (1-11, update only).
end_timeNoEnd time in RFC3339 format (required for create).
event_idNoEvent ID (required for update and delete).
locationNoEvent location.
responseNoRSVP response — "accepted", "declined", "tentative", or "needsAction" (rsvp action only).
timezoneNoIANA timezone applied to both boundaries (e.g., "America/New_York"). Overridden per boundary by start_timezone/end_timezone.
attendeesNoAttendee email addresses or objects.
remindersNoCustom reminder objects.
recurrenceNoRFC5545 recurrence rules for a recurring event, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart time in RFC3339 format (required for create).
visibilityNo"default", "public", "private", or "confidential".
attachmentsNoList of Google Drive file URLs or IDs to attach.
calendar_idNoCalendar ID (default: 'primary').primary
descriptionNoEvent description.
end_timezoneNoIANA timezone for the end boundary only, overriding timezone. See start_timezone.
rsvp_commentNoOptional message to include with the RSVP response (rsvp action only).
send_updatesNoNotification behavior for create, update, delete, and rsvp — "all" (default), "externalOnly", or "none".
transparencyNo"opaque" (busy) or "transparent" (free).
conference_idNoOptional provider-side conference/meeting ID.
conference_uriNoJoin URL for the third-party conference (e.g. "https://zoom.us/j/123456789"). Required when conference_provider is set.
start_timezoneNoIANA timezone for the start boundary only, overriding timezone. Use for events whose two ends sit in different zones - a flight departing 13:45 "Asia/Jerusalem" and landing 17:50 "Europe/Amsterdam" is one event authored in two zones. Passing a single timezone for such an event silently rewrites one end's wall-clock.
add_google_meetNoWhether to add/remove native Google Meet.
conference_dataNoRaw Google Calendar `conferenceData` payload to attach a third-party conference (Zoom/Webex/Teams add-on). Use this for full control; mutually exclusive with the conference_provider helper params and with add_google_meet. (create/update only)
guests_can_modifyNoWhether attendees can modify.
user_google_emailYesThe user's Google email address. Required.
conference_passcodeNoOptional passcode for the third-party conference.
conference_providerNoHigher-level helper: third-party provider name (e.g. "zoom", "webex", "teams"). Requires conference_uri. The MCP builds the addOn `conferenceData` block internally. (create/update only)
use_default_remindersNoWhether to use default reminders.
guests_can_invite_othersNoWhether attendees can invite others.
guests_can_see_other_guestsNoWhether attendees can see other guests.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false; the description's create/update/delete operations are consistent with them, so there is no contradiction. Yet the description adds no behavioral context of its own — nothing about irreversibility of deletion, notification side effects, or the RSVP state change — leaving the annotations to carry the full burden.

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

Conciseness4/5

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

Two short sentences with zero filler, and the resource 'calendar events' is front-loaded. It is efficiently written, though for a 32-parameter, four-mode tool the description could carry more useful signal without becoming verbose.

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

Completeness3/5

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

For a tool this complex, the description is thin: it offers no usage routing, no authentication note, and no cross-action parameter guidance. The 100%-covered schema and the presence of an output schema compensate substantially, so the tool remains correctly invokable, but the description alone leaves an agent under-informed about prerequisites and action-specific expectations.

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% with detailed per-parameter docstrings (e.g., 'required for create', 'rsvp action only'), so the baseline of 3 applies. The description merely enumerates the four action values already defined in the schema and adds no additional parameter-level meaning.

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

Purpose4/5

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

The description identifies the resource ('calendar events') and the operations ('creating, updating, deleting, and RSVP'), which tells an agent this is the write/management tool for events rather than the read-only get_events. However, 'manages' is a generic verb and no sibling is named explicitly, so differentiation is conveyed only through the action list rather than a direct contrast.

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

Usage Guidelines3/5

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

The operation list ('creating, updating, deleting, and RSVP') implies when the tool applies, which is the minimum viable usage signal. But the description gives no explicit when-to-use vs alternatives — notably get_events for reading, create_calendar for calendar-level work — and no mention of the start_google_auth prerequisite.

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

manage_focus_timeManage Focus TimeA
Destructive

Manages Focus Time events on Google Calendar. These special events auto-decline meeting invitations and, by default, set the user's chat status to Do Not Disturb, helping protect blocks of uninterrupted work time.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform - "create", "list", "update", or "delete".
summaryNoDisplay text on the calendar. Defaults to "Focus Time".
end_timeNoEnd date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create.
event_idNoEvent ID. Required for "update" and "delete" actions.
time_maxNoFor "list" action: end of time range.
time_minNoFor "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range.
timezoneNoTimezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset.
recurrenceNoRFC5545 recurrence rules for a recurring Focus Time series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create.
calendar_idNoCalendar ID. Defaults to 'primary'. Focus Time status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID.primary
chat_statusNoGoogle Chat status during the focus time. Supports "doNotDisturb" (default) and "available".
descriptionNoEvent description. Useful for adding context about what the focus time is for.
max_resultsNoFor "list" action: maximum events to return. Defaults to 10.
decline_messageNoMessage included when auto-declining invitations.
auto_decline_modeNoHow to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone".
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructive and non-read-only behavior, so the description adds valuable context by disclosing key side effects: auto-declining meeting invitations and setting chat status to Do Not Disturb by default. This goes beyond the structured annotations without contradicting them.

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 two sentences, front-loaded with the verb and resource, and every word earns its place. It is concise and structured effectively.

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

Completeness4/5

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

For a 16-parameter tool, the description is brief but sufficient because the schema carries detailed parameter semantics and the output schema is present. It explains the purpose and key side effects, making it complete enough for an agent to understand what the tool does, though it does not enumerate the CRUD actions (already in the action parameter schema).

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?

The input schema has 100% parameter description coverage, so the baseline is 3. The description does not add parameter-specific details beyond what the schema provides, though it does mention defaults behavior that maps to chat_status and auto_decline_mode. This adds some context but does not compensate for anything missing 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 clearly states the tool 'Manages Focus Time events on Google Calendar' and distinguishes these special events from regular calendar events by mentioning they auto-decline meeting invitations and set chat status to Do Not Disturb. This differentiates it from sibling tools like manage_event.

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

Usage Guidelines4/5

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

The description gives clear context that this tool is for Focus Time events, which are distinct from regular events due to their auto-decline and DND behaviors. It implies when to use this tool, though it does not explicitly name alternatives or state when not to use it.

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

manage_gmail_filterManage Gmail FilterB
Destructive

Manages Gmail filters. Supports creating and deleting filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform - "create" or "delete".
criteriaNoFilter criteria object (required for create).
filter_idNoID of the filter to delete (required for delete).
filter_actionNoFilter action object (required for create). Named 'filter_action' to avoid shadowing the 'action' parameter.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate destructive behavior (destructiveHint: true). The description adds no additional behavioral context, such as side effects of deletion, error handling, or requirements like Google account authentication. It merely restates the create/delete actions.

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

Conciseness3/5

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

The description is short, but the first sentence 'Manages Gmail filters' is redundant with the tool title and adds no value. The second sentence 'Supports creating and deleting filters' is the substantive part. Could be condensed to a single sentence.

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

Completeness2/5

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

Despite having 5 parameters with conditional requirements, the description does not explain the two distinct modes (create vs delete) or the need to provide criteria and filter_action for create, and filter_id for delete. The schema covers this, but the description offers no operational context. Output schema exists, so return values are not needed, but usage context is lacking.

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 parameters are fully documented in the schema. The description adds no further semantic information about what criteria or filter_action objects should contain, relying on 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 clearly states the tool creates and deletes Gmail filters, distinguishing it from read-only sibling tools like list_gmail_filters. The specific actions (create/delete) make the purpose unambiguous.

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

Usage Guidelines3/5

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

The description implies usage (use when you need to create/delete filters) but does not explicitly mention alternatives or clearly define when not to use this tool. No reference to list_gmail_filters for read operations or to manage_gmail_label for labels.

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

manage_gmail_labelManage Gmail LabelB
Destructive

Manages Gmail labels: create, update, or delete labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLabel name. Required for create, optional for update.
actionYesAction to perform on the label.
label_idNoLabel ID. Required for update and delete operations.
user_google_emailYesThe user's Google email address. Required.
label_list_visibilityNoWhether the label is shown in the label list.labelShow
message_list_visibilityNoWhether the label is shown in the message list.show

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true and readOnlyHint=false, so the tool is known to be a mutating/destructive operation. However, the description adds no behavioral context beyond the raw actions—e.g., it doesn't disclose that deleting a label may remove it from all messages, that updates could affect visibility settings, or any side effects. With annotations present, the description should add such context but doesn't.

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 a single sentence with no fluff. It front-loads the resource (Gmail labels) and lists the three actions cleanly. Every word earns its place, achieving maximum conciseness.

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

Completeness4/5

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

Given the tool's complexity (6 parameters, 3 actions, output schema present), the description is minimal but sufficient. The schema and output schema cover parameter details and return format, while annotations cover safety. The description only needs to convey the high-level CRUD nature, which it does. It could mention per-action requirements, but those are in the schema, so a score of 4 is appropriate.

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?

The input schema has 100% description coverage, with each parameter (name, action, label_id, user_google_email, label_list_visibility, message_list_visibility) already documented. The description adds no semantic value for parameters, only listing the actions. Since schema covers everything, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool 'Manages Gmail labels: create, update, or delete labels.' This distinguishes it from read-only sibling tools like list_gmail_labels and modify_gmail_message_labels, which operate on label assignments rather than label definitions. The verb 'manages' is generic, but the enumerated actions make the purpose explicit.

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

Usage Guidelines3/5

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

The description implies usage for creating, updating, or deleting Gmail labels, but provides no explicit guidance on when to choose this tool over alternatives like list_gmail_labels for reading or modify_gmail_message_labels for altering message-label associations. It gives no exclusions or alternative references, so usage is only implied.

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

manage_out_of_officeManage Out of OfficeA
Destructive

Manages Out of Office events on Google Calendar. These special events auto-decline meeting invitations and set the user's status to "Out of office" across Google Workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform - "create", "list", "update", or "delete".
summaryNoDisplay text on the calendar. Defaults to "Out of Office".
end_timeNoEnd date/time (exclusive). Same format as start_time. For a single full day on April 5, use start_time='2026-04-05' and end_time='2026-04-06'. Required for create.
event_idNoEvent ID. Required for "update" and "delete" actions.
time_maxNoFor "list" action: end of time range.
time_minNoFor "list" action: start of time range. Defaults to current time. Recurring series are expanded into individual instances in the requested range.
timezoneNoTimezone for the event (e.g., "America/New_York", "Europe/London"). Required when using date-only values or dateTime values without an explicit UTC offset.
recurrenceNoRFC5545 recurrence rules for a recurring Out of Office series, e.g. ["RRULE:FREQ=WEEKLY;COUNT=10"].
start_timeNoStart date/time. Use 'YYYY-MM-DD' for full-day or RFC3339 for partial-day (e.g., '2024-04-05T09:00:00Z'). Date-only values are auto-converted to dateTime (midnight-to-midnight). Required for create.
calendar_idNoCalendar ID. Defaults to 'primary'. Out of Office status events live on primary calendars, so use 'primary' or a user's primary calendar ID/email rather than a secondary calendar ID.primary
max_resultsNoFor "list" action: maximum events to return. Defaults to 10.
decline_messageNoMessage included when auto-declining invitations.
auto_decline_modeNoHow to handle conflicting invitations. One of: "declineAllConflictingInvitations" (default), "declineOnlyNewConflictingInvitations", "declineNone".
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond annotations: OOO events auto-decline invitations and set the user's status across Google Workspace. It does not contradict the destructiveHint or readOnlyHint annotations, and the auto-decline behavior is meaningful for agent decisions.

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?

Two sentences with no redundancy. The first sentence front-loads the verb and resource; the second adds essential behavioral details. Highly efficient and structured.

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

Completeness4/5

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

While the tool has many parameters and actions, the rich schema and output schema fully cover operational details. The description provides the necessary OOO-specific context and status effect, making the tool understandable without over-explaining. Slightly more could be said about action types, but structured data compensates.

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?

The input schema already provides 100% coverage with detailed descriptions for all 14 parameters, including defaults, required conditions, and format examples. The description adds only high-level context and does not need to duplicate schema details, so baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool manages Out of Office events on Google Calendar and explains their special effects (auto-declining invitations and setting status across Workspace). It distinguishes from generic event tools like manage_event by focusing on OOO-specific behavior, though the verb 'Manages' is somewhat generic.

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

Usage Guidelines3/5

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

The description implies usage for Out of Office events but does not explicitly state when to use it versus alternatives like manage_event or manage_focus_time. No exclusions or alternative tool mentions are provided, leaving the agent to infer from the OOO context.

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

manage_presentation_commentManage Presentation CommentA

Manage comments on a Google Presentation.

Actions:

  • create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Slides comments are element-scoped via the API.

  • reply: Reply to a comment. Requires comment_id and comment_content.

  • resolve: Resolve a comment. Requires comment_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
comment_idNo
comment_contentNo
presentation_idYes
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotation flags, the description adds a valuable behavioral note that the Drive API cannot anchor comments to arbitrary text and that Slides comments are element-scoped via the API. It also states required parameters for each action, providing useful context beyond the schema.

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-organized with a bulleted list of actions and a concise note about API limitations. Every sentence adds value and the structure makes requirements easy to scan.

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

Completeness4/5

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

The description covers all three actions, their parameter requirements, and a key limitation, making it sufficient for correct invocation. It could be more explicit about the role of user_google_email and presentation_id, but the output schema and general context fill most gaps.

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?

With schema description coverage at 0%, the description compensates by mapping actions to their required parameters (comment_content for create, comment_id/comment_content for reply, comment_id for resolve). It does not explain user_google_email or presentation_id, but these are likely self-evident from the tool context.

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 clearly states 'Manage comments on a Google Presentation' and lists three specific actions (create, reply, resolve), distinguishing it from sibling comment-management tools for other Google Workspace types (e.g., manage_document_comment, manage_spreadsheet_comment).

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

Usage Guidelines4/5

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

The description provides clear context by defining each action and its required parameters, implying when to use the tool. However, it does not explicitly mention alternatives or exclusions, such as when to use list_presentation_comments instead.

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

manage_spreadsheet_commentManage Spreadsheet CommentA

Manage comments on a Google Spreadsheet.

Actions:

  • create: Create a new comment. Requires comment_content. Note: The Drive API cannot anchor comments to arbitrary text; Sheets comments are cell-scoped via the API.

  • reply: Reply to a comment. Requires comment_id and comment_content.

  • resolve: Resolve a comment. Requires comment_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
comment_idNo
spreadsheet_idYes
comment_contentNo
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds meaningful context: a note that the Drive API cannot anchor comments to arbitrary text and that Sheets comments are cell-scoped. This helps set expectations about what the create action can and cannot do. It does not contradict annotations.

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 and well-structured with a brief overview followed by a bulleted action list. Every sentence contributes useful information, and the API limitation note is placed where relevant. No redundant phrasing.

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

Completeness4/5

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

For a moderately complex multi-action tool with an output schema, the description covers the main behavior, required parameters, and a key API constraint. It does not explain how cell scope is specified in practice or what happens with an invalid action, but the output schema and annotation context cover some gaps. Overall it is adequate for correct selection and invocation.

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?

With 0% schema description coverage, the description carries the burden of explaining parameters. It does so effectively by mapping each action to its required parameters (create→comment_content; reply→comment_id+comment_content; resolve→comment_id). It leaves user_google_email and spreadsheet_id implicit, but their roles are reasonably inferable from the tool name and context. The nullable comment_id and comment_content are partially clarified through action-specific requirements.

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 clearly states it manages comments on a Google Spreadsheet and enumerates three specific actions (create, reply, resolve) with a verb+resource pattern. This distinguishes it from sibling tools like manage_document_comment and manage_presentation_comment by explicitly scoping to spreadsheets.

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

Usage Guidelines4/5

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

The action list with required parameters provides clear guidance on when to use each sub-operation. However, it does not explicitly mention when not to use this tool or point to alternatives like list_spreadsheet_comments for read-only comment retrieval. The note about API limitations implies trade-offs but no explicit exclusions.

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

manage_taskManage TaskA
Destructive

Manage tasks: create, update, delete, or move tasks within task lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNoDue date in RFC 3339 format (e.g., "2024-12-31T23:59:59Z"). Used by "create" and "update" actions.
notesNoNotes/description for the task. Used by "create" and "update" actions.
titleNoThe title of the task. Required for "create", optional for "update".
actionYesThe action to perform. Must be one of: "create", "update", "delete", "move".
parentNoParent task ID (for subtasks). Used by "create" and "move" actions.
statusNoTask status ("needsAction" or "completed"). Used by "update" action.
task_idNoThe ID of the task. Required for "update", "delete", and "move" actions.
previousNoPrevious sibling task ID (for positioning). Used by "create" and "move" actions.
task_list_idYesThe ID of the task list. Required for all actions.
user_google_emailYesThe user's Google email address. Required.
destination_task_listNoDestination task list ID (for moving between lists). Used by "move" action.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds the specific actions but does not disclose additional behavioral nuances such as irreversibility of delete, dependency on task_id for update/delete/move, or the meaning of 'move' (between lists vs. reordering). No contradictions with annotations.

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?

A single, concise sentence that front-loads the tool's purpose and actions. No filler or repetition of schema information.

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

Completeness3/5

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

The tool has 11 parameters and an output schema, but the description is minimal. While the schema fills in parameter details, the description could provide more context on action-specific parameter requirements (e.g., task_id needed for update/delete/move, destination_task_list for moves between lists). It is adequate for a basic understanding but not comprehensive for a multi-action mutation 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?

Schema description coverage is 100%, so parameters are well-documented. The description itself does not add new parameter details, but it does mention action types that map to the 'action' parameter. This meets the baseline but adds little 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 clearly states the tool's purpose with a specific verb ('manage') and resource ('tasks'), and enumerates the actions: create, update, delete, or move. It distinguishes from siblings like manage_task_list (task lists) and read-only tools like list_tasks/get_task by specifying task-level mutations.

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

Usage Guidelines3/5

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

The description implies usage: use this when you need to create, update, delete, or move tasks. However, it does not explicitly contrast with alternatives (e.g., list_tasks for viewing) or provide guidance on which action to choose for specific scenarios. The 'within task lists' phrase gives partial context but no exclusions.

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

manage_task_listManage Task ListB
Destructive

Manage task lists: create, update, delete, or clear completed tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoThe title for the task list. Required for "create" and "update" actions.
actionYesThe action to perform. Must be one of: "create", "update", "delete", "clear_completed".
task_list_idNoThe ID of the task list. Required for "update", "delete", and "clear_completed" actions.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true, and the description merely echoes this by listing 'delete' and 'clear completed tasks' without adding contextual details such as permanence of deletion, impact on contained tasks, or permission requirements. It does not contradict the annotations, but it fails to disclose behavior beyond what the schema and annotations already convey.

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 a single, concise sentence that front-loads the core purpose and enumerates the specific operations. Every word contributes meaning, with no redundancy or filler. It is appropriately sized for a tool with four parameters and a straightforward CRUD-like behavior.

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

Completeness4/5

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

Given the presence of a complete output schema, full parameter descriptions, and annotations covering destructive behavior, the description is largely sufficient. It captures the high-level operations and the specific 'clear completed tasks' nuance. However, it could be slightly improved by adding a note about the irreversibility of delete or clear actions, though this is partially covered by the destructiveHint annotation.

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 each parameter is already well-documented (e.g., title required for create/update, task_list_id for update/delete/clear_completed). The description adds no new parameter-level semantics beyond restating the allowed actions, which are also listed in the action parameter's description. Thus the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool's purpose: 'Manage task lists: create, update, delete, or clear completed tasks.' It identifies the resource (task lists) and enumerates the supported operations, distinguishing it from siblings like manage_task (which handles individual tasks) and list_task_lists (which is read-only). However, the verb 'Manage' is somewhat generic and does not add specificity beyond the enumerated actions.

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

Usage Guidelines3/5

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

The description implies usage for task list management but provides no explicit guidance on when to use this tool versus alternatives such as manage_task for individual tasks or list_task_lists for retrieval. There are no stated exclusions or alternative tool recommendations, so the usage context is only inferred from the resource type and sibling names.

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

modify_doc_textModify Doc TextA
Destructive

Modifies text in a Google Doc - can insert/replace text and/or apply formatting in a single operation.

TIP: To append text to the end of the document without calculating indices, set end_of_segment=true. This avoids index calculation errors.

For ordinary header/footer text, prefer update_doc_headers_footers. Only pass segment_id when you already have a real header/footer/footnote segment ID from inspect_doc_structure output. Do not guess IDs such as "kix.header" or "kix.footer".

ParametersJSON Schema
NameRequiredDescriptionDefault
boldNoWhether to make text bold (True/False/None to leave unchanged)
textNoNew text to insert or replace with (optional - can format existing text without changing it)
italicNoWhether to make text italic (True/False/None to leave unchanged)
tab_idNoOptional document tab ID to target
link_urlNoHyperlink URL (http/https)
end_indexNoEnd position for text replacement/formatting (if not provided with text, text is inserted)
font_sizeNoFont size in points
underlineNoWhether to underline text (True/False/None to leave unchanged)
clear_linkNoRemove hyperlink from the target range
segment_idNoOptional header/footer/footnote segment ID to target
small_capsNoWhether to apply small caps
text_colorNoForeground text color (#RRGGBB)
document_idYesID of the document to update
font_familyNoFont family name (e.g., "Arial", "Times New Roman")
font_weightNoFont weight (100-900 in steps of 100; requires font_family)
start_indexYesStart position for operation using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position.
strikethroughNoWhether to strike through text (True/False/None to leave unchanged)
end_of_segmentNoInsert text at the end of the targeted segment instead of start_index
baseline_offsetNoOne of NONE, SUPERSCRIPT, SUBSCRIPT
background_colorNoBackground/highlight color (#RRGGBB)
user_google_emailYesUser's Google email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds behavioral context beyond annotations by warning about index calculation errors, explaining end_of_segment behavior, and cautioning about ID guessing. It does not detail irreversible side effects, but the annotation covers the core safety profile.

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: main purpose in the first sentence, then a useful TIP, then explicit exclusions and warnings. Every sentence provides actionable value, and key information is front-loaded.

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 the complexity of 21 parameters and an output schema, the description effectively covers the essential operational nuances: insertion vs replacement, formatting-only usage, end_of_segment for append, header/footer guidance, and segment ID provenance. It is complete enough for an agent to select and invoke this tool correctly.

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?

With 100% schema coverage, the schema itself documents all parameters. The description adds operational meaning beyond the schema, particularly for end_of_segment ('avoids index calculation errors') and segment_id ('Do not guess IDs'), which helps the agent use parameters correctly. This goes beyond baseline 3.

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 ('Modifies text in a Google Doc') and clearly enumerates the scope: insert/replace text and/or apply formatting in a single operation. It distinguishes itself from likely siblings (e.g., update_doc_headers_footers) by explicitly addressing header/footer use cases.

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 gives direct guidance on when to use an alternative: 'For ordinary header/footer text, prefer update_doc_headers_footers.' It also provides concrete procedural warnings, such as only passing real segment IDs from inspect_doc_structure and not guessing IDs, plus a practical TIP for appending with end_of_segment=true.

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

modify_gmail_message_labelsModify Gmail Message LabelsA
Destructive

Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label.

ParametersJSON Schema
NameRequiredDescriptionDefault
message_idYesThe ID of the message to modify.
add_label_idsNoList of label IDs to add to the message.
remove_label_idsNoList of label IDs to remove from the message.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description is not contradicting them. The description adds value by explaining the side effects of specific label choices (removing INBOX archives, adding TRASH deletes), which is meaningful behavioral context beyond the raw annotation. However, it does not mention that changes are immediate, whether label removal can permanently delete messages, or any permissions/user-consent implications. With annotations present, the description's additional behavioral detail earns a 3 rather than lower.

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

Conciseness4/5

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

The description is concise and front-loaded with the core action. The two example sentences are useful and non-redundant. It could be slightly improved by adding a sentence on label ID format, but the current length is appropriate and every sentence serves a purpose.

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

Completeness4/5

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

For a single-message label modification tool, the description is fairly complete: it states the action, gives the two most important use cases, and annotations cover the destructive nature. The output schema exists (though not shown) which may cover return values. It could have mentioned the relationship to batch_modify_gmail_message_labels and that custom label IDs are allowed, but the essentials are present.

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?

The input schema covers 100% of parameters with descriptions, so the baseline is 3. The description's examples imply the meaning of add_label_ids and remove_label_ids but do not add technical details like label ID format (e.g., 'INBOX', 'TRASH', custom ID). Since the schema already documents all parameters, the description does not need to compensate for gaps; it just doesn't add much beyond the examples.

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 ('Adds or removes labels from a Gmail message') and immediately provides two concrete operational examples (archiving via removing INBOX, deleting via adding TRASH). This clearly distinguishes the tool from siblings like manage_gmail_label (which manages label definitions) and batch_modify_gmail_message_labels (which operates on multiple messages).

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

Usage Guidelines4/5

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

The description gives explicit usage context for common operations (archive and delete), which helps the agent understand when to use this tool. However, it does not explicitly mention when to prefer batch_modify_gmail_message_labels over this single-message tool, nor does it state any exclusions for when not to use it. The practical examples imply usage well but leave the single-vs-batch distinction implicit.

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

modify_sheet_valuesModify Sheet ValuesB
Destructive

Modifies values in a specific range of a Google Sheet - can write, update, or clear values.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesNo2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True.
range_nameYesThe range to modify (e.g., "Sheet1!A1:D10", "A1:D10"). Required.
clear_valuesNoIf True, clears the range instead of writing values. Defaults to False.
spreadsheet_idYesThe ID of the spreadsheet. Required.
user_google_emailYesThe user's Google email address. Required.
value_input_optionNoHow to interpret input values ("RAW" or "USER_ENTERED"). Defaults to "USER_ENTERED".USER_ENTERED

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds no behavioral context beyond restating the tool's purpose (write/update/clear). It does not mention that writes overwrite existing data or that clear operations are permanent, which would be valuable given the destructive hint.

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 a single, front-loaded sentence that efficiently conveys the core action and supported operations. There is no waste or redundancy.

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

Completeness3/5

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

The tool is relatively simple with 6 parameters, 3 required, and an output schema present. The description covers the basic function but lacks additional context such as side effects or typical use cases. Given the annotations and schema coverage, it meets the minimum viable completeness but does not go beyond it.

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?

The input schema has 100% description coverage for all parameters, including values, clear_values, and value_input_option. The description's phrase 'can write, update, or clear values' aligns with the schema but adds no new semantic information beyond it.

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 ('Modifies') and resource ('values in a specific range of a Google Sheet'), and further clarifies the supported actions (write, update, clear). This clearly distinguishes it from sibling tools like read_sheet_values or format_sheet_range.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives such as append_table_rows or format_sheet_range. It does not mention exclusions or conditions that would help an agent decide between this and similar sheet-related tools.

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

move_sheet_rowsMove Sheet RowsA
Destructive

Moves rows from one sheet to another within the same spreadsheet. The move is performed in a single batchUpdate (copyPaste followed by deleteDimension). Note: batchUpdate executes requests sequentially but does not roll back on partial failure — if the copy succeeds but the delete fails, rows may be duplicated. Formulas, data types, and formatting are preserved (unlike a values.get/append round-trip). Row numbers are 1-based (matching the spreadsheet UI).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_rowYesLast row to move (1-based, inclusive). Required.
start_rowYesFirst row to move (1-based, inclusive). Required.
source_sheetYesName of the sheet to move rows from. Required.
spreadsheet_idYesThe ID of the spreadsheet. Required.
destination_sheetYesName of the sheet to move rows to. Required.
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Discloses non-rollback partial failure and duplication risk, preservation of formulas/types/formatting, and 1-based row semantics, all beyond the annotations. The destructiveHint annotation is consistent with the described deleteDimension step, so no contradiction.

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?

Four dense, information-bearing sentences, front-loaded with the action; every sentence contributes essential behavioral context without fluff.

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

Completeness4/5

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

Covers operation mechanics, failure behavior, preservation guarantees, and row numbering. Missing destination placement details (e.g., where moved rows land in destination sheet) is a minor gap, but annotations and output schema cover safety and return context.

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 coverage is 100%, so the schema handles per-parameter documentation; the description's 1-based/inclusive note partially repeats schema text. It adds no significant new parameter-level details beyond making the row-number convention explicit.

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?

Clearly identifies a specific operation (moving rows) with explicit scope (between sheets in the same spreadsheet). This distinguishes it from sibling tools like modify_sheet_values or append_table_rows.

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

Usage Guidelines4/5

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

States that the operation uses batchUpdate rather than a values round-trip and explicitly contrasts with values.get/append behavior, giving context for when choosing this tool. It does not name alternative tools explicitly or list cases where a different operation should be used, but the purpose is specific enough to imply usage.

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

query_freebusyQuery FreebusyB
Read-onlyIdempotent

Returns free/busy information for a set of calendars.

ParametersJSON Schema
NameRequiredDescriptionDefault
time_maxYesThe end of the interval for the query in RFC3339 format (e.g., '2024-05-12T18:00:00Z' or '2024-05-12').
time_minYesThe start of the interval for the query in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12').
calendar_idsNoList of calendar identifiers to query. If not provided, queries the primary calendar. Use 'primary' for the user's primary calendar or specific calendar IDs obtained from `list_calendars`.
user_google_emailYesThe user's Google email address. Required.
group_expansion_maxNoMaximum number of calendar identifiers to be provided for a single group. Optional. An error is returned for a group with more members than this value. Maximum value is 100.
calendar_expansion_maxNoMaximum number of calendars for which FreeBusy information is to be provided. Optional. Maximum value is 50.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already mark this as read-only and idempotent, but the description adds no further behavioral context—no limits, error conditions, or notes on time zone handling. It is purely a return-type statement, adding no value beyond the annotations.

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?

A single concise sentence with no filler. It is appropriately sized and to the point, clearly stating the tool's core function without unnecessary verbosity.

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

Completeness4/5

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

Given the presence of an output schema and highly descriptive input schema, the description is minimally sufficient. It identifies the action and resource, and the phrase 'set of calendars' implies support for multiple calendars. No critical context appears to be missing for basic usage.

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?

The input schema provides comprehensive descriptions for all six parameters, including examples, defaults, and validation details. The description adds no additional parameter semantics, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb ('Returns') and resource ('free/busy information') for 'a set of calendars'. It clearly identifies the tool's function and differentiates it from sibling tools like get_events or list_calendars by focusing on free/busy availability rather than event details.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as get_events or list_calendars. The description simply states what it returns, leaving usage context implicit and not offering any exclusions or prerequisites.

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

read_sheet_valuesRead Sheet ValuesB
Read-onlyIdempotent

Reads values from a specific range in a Google Sheet.

ParametersJSON Schema
NameRequiredDescriptionDefault
range_nameNoThe range to read (e.g., "Sheet1!A1:D10", "A1:D10"). Defaults to "A1:Z1000". Open-ended or oversized ranges are clamped to at most 1000 rows before the Sheets API request to bound memory use.A1:Z1000
include_notesNoIf True, also fetch cell notes for the range. Defaults to False to avoid expensive includeGridData requests.
spreadsheet_idYesThe ID of the spreadsheet. Required.
include_formulasNoIf True, also fetch raw formula strings for cells that contain formulas. Useful for identifying cross-sheet references before writing back to a range. Defaults to False to avoid an extra API request.
user_google_emailYesThe user's Google email address. Required.
include_hyperlinksNoIf True, also fetch hyperlink metadata for the range. Defaults to False to avoid expensive includeGridData requests.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral details beyond the obvious 'reads values'; it doesn't mention range clamping, default behaviors, or return format. It provides minimal additional value beyond annotations.

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?

A single sentence with zero waste. It clearly states the core purpose and relies on the schema for details, making it an appropriately sized description.

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

Completeness3/5

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

The tool is simple, annotations cover safety, schema covers all parameters, and an output schema exists. However, the description lacks usage context such as when to choose this over other sheet tools, and doesn't mention the required user_google_email or that it's a read-only operation. It's adequate but leaves room for improvement in guiding selection.

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 coverage is 100%, with detailed parameter descriptions including defaults, clamping behavior, and performance implications (e.g., includeGridData). The description itself adds no parameter semantics, but the baseline of 3 is appropriate given the schema carries the full burden.

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

Purpose4/5

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

Description uses a specific verb ('reads') and resource ('values from a specific range in a Google Sheet'), clearly indicating the tool's function. It doesn't explicitly differentiate from siblings like get_spreadsheet_info or list_spreadsheets, but the action is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives such as modify_sheet_values, format_sheet_range, or get_spreadsheet_info. The description only states what it does, leaving the agent to infer usage context without explicit exclusions or alternative recommendations.

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

resize_sheet_dimensionsResize Sheet DimensionsA
Destructive

Manages sheet-level dimension properties: resize columns/rows, auto-resize to fit content, freeze rows/columns, hide/unhide rows/columns, and insert/delete rows/columns.

ParametersJSON Schema
NameRequiredDescriptionDefault
hide_rowsNoList of 1-based row numbers to hide. Example: [3, 4].
row_sizesNoDict mapping 1-based row numbers to pixel heights. Example: {"1": 40, "3": 60}. Can be a JSON string or Python dict.
sheet_nameNoSheet name to target. Defaults to the first sheet if not provided.
delete_rowsNoList of 1-based row numbers to delete. Example: [5, 6]. Best for non-contiguous rows.
insert_rowsNoNumber of rows to insert.
unhide_rowsNoList of 1-based row numbers to unhide. Example: [3, 4].
column_sizesNoDict mapping column letters to pixel widths. Example: {"A": 200, "C": 300}. Can be a JSON string or Python dict.
hide_columnsNoList of column letters to hide. Example: ["C", "D"].
delete_columnsNoList of column letters to delete. Example: ["E", "F"].
insert_columnsNoNumber of columns to insert.
insert_rows_atNo1-based row number to insert before. Appends to the end of the sheet if omitted.
spreadsheet_idYesThe ID of the spreadsheet. Required.
unhide_columnsNoList of column letters to unhide. Example: ["C", "D"].
auto_resize_rowsNoList of 1-based row numbers to auto-resize to fit content. Example: [1, 2].
delete_row_rangeNoContiguous range of rows to delete, as "start:end" (1-based, inclusive). Example: "5:10" deletes rows 5 through 10. More efficient than delete_rows for large contiguous ranges.
frozen_row_countNoNumber of rows to freeze from the top. Use 0 to unfreeze all rows.
insert_columns_atNoColumn letter to insert before (e.g. "C"). Appends to the end if omitted.
user_google_emailYesThe user's Google email address. Required.
auto_resize_columnsNoList of column letters to auto-resize to fit content. Example: ["A", "B"].
frozen_column_countNoNumber of columns to freeze from the left. Use 0 to unfreeze all columns.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the description is not required to repeat these. It adds context by specifying the types of destructive operations (insert/delete rows/columns), but does not disclose additional behavioral traits such as potential data shifts or permission requirements.

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

Conciseness4/5

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

The description is a single sentence with a colon-separated list, front-loading the key resource ('sheet-level dimension properties'). It is efficient and covers all major operations without redundancy, though the list format is a bit transactional.

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

Completeness4/5

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

For a tool with 20 parameters, a high-level summary is appropriate. The schema and annotations provide detailed parameter definitions and safety profile. An output schema exists, so return values need not be explained. The description is complete enough for the agent to understand the tool's purpose and choose it 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 each parameter is already documented with examples and defaults. The description itself adds no parameter-level detail, but the schema fully compensates. This meets the baseline of 3.

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

Purpose4/5

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

The description clearly states it manages sheet-level dimension properties and enumerates specific operations (resize, auto-resize, freeze, hide/unhide, insert/delete). While 'manages' is not as sharp as a direct verb like 'resize,' the list of actions removes ambiguity and distinguishes it from sibling tools that handle values or formatting.

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

Usage Guidelines3/5

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

The description implies the tool is for dimension-related changes but does not explicitly state when to use it vs alternatives like modify_sheet_values or format_sheet_range. No exclusions or alternative tool names are provided, though the scope is reasonably clear from the listed operations.

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

run_script_functionRun Script FunctionC
Destructive

Executes a function in a deployed script.

ParametersJSON Schema
NameRequiredDescriptionDefault
dev_modeNoWhether to run latest code vs deployed version
script_idYesThe script project ID
parametersNoOptional list of parameters to pass
function_nameYesName of function to execute
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

The description discloses only the basic action. It does not explain that running a function may execute arbitrary code with side effects, act as the user (based on user_google_email), or affect user data. Annotations already signal destructive and not read-only, but the description fails to add useful context beyond that.

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 a single, front-loaded sentence with no wasted words. It efficiently communicates the primary action, though this conciseness comes at the cost of missing important behavioral and usage context.

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

Completeness2/5

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

Given the tool's complexity (running arbitrary script functions, potential side effects) and the existence of an output schema, the description is far too sparse. It doesn't explain what happens after execution, how errors are returned, or the implications of running code as the user. This is insufficient for an agent to safely and correctly use the 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?

The schema fully describes all parameters (100% coverage), so the baseline is 3. The description adds no extra meaning about parameter relationships, like how dev_mode changes execution target or how parameters are passed. It simply restates the action without enriching schema semantics.

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

Purpose3/5

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

The description states a clear verb 'executes' and resource 'function in a deployed script', but the qualifier 'deployed' is inaccurate because the tool can also run latest code via dev_mode (as noted in the schema). This partial misstatement obscures the full scope, so it's not a fully reliable purpose statement.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, such as needing a deployment or auth, and no reference to sibling tools that manage script projects or deployments.

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

search_contactsSearch ContactsC
Read-onlyIdempotent

Search contacts by name, email, phone number, or other fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query string (searches names, emails, phone numbers).
page_sizeNoMaximum number of results to return (default: 30, max: 30).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

The description adds no behavioral context beyond what annotations already provide. Annotations declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, but the description only restates the search functionality without additional disclosures like result scope, pagination behavior, or user-specific data access.

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 a single, front-loaded sentence that accurately conveys the core function. It is concise with no wasted words, well-suited for its simple purpose.

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

Completeness2/5

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

While the schema and annotations are enriched, the description fails to provide usage context. It does not distinguish itself from the closely related list_contacts tool, leaving a gap in how the agent should choose between them. For a tool with many siblings, more explicit context is expected.

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 coverage is 100% with each parameter having a helpful description. The main description's mention of name, email, and phone number is redundant with the query parameter description, adding no new semantic value. Baseline of 3 applies given the strong schema.

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

Purpose4/5

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

The description clearly states the tool searches contacts by name, email, phone number, or other fields, giving a specific verb and resource. However, it does not differentiate from sibling tools like list_contacts or get_contact, so it lacks explicit sibling distinction.

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

Usage Guidelines2/5

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

No guidance is provided on when to use search_contacts versus list_contacts or get_contact. There are no alternatives mentioned, exclusions, or contextual triggers for choosing this tool.

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

search_customSearch CustomC
Read-onlyIdempotent

Performs a search using Google Custom Search JSON API.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesThe search query. Required.
numNoNumber of results to return (1-10). Defaults to 10.
safeNoSafe search level. Defaults to "off".off
sitesNoList of sites/domains to restrict search to (e.g., ["example.com", "docs.example.com"]). When provided, results are limited to these sites.
startNoThe index of the first result to return (1-based). Defaults to 1.
countryNoCountry code for results (e.g., "countryUS").
languageNoLanguage code for results (e.g., "lang_en").
file_typeNoFilter by file type (e.g., "pdf", "doc").
search_typeNoSearch for images if set to "image".
site_searchNoRestrict search to a specific site/domain.
date_restrictNoRestrict results by date (e.g., "d5" for past 5 days, "m3" for past 3 months).
user_google_emailYesThe user's Google email address. Required.
site_search_filterNoExclude ("e") or include ("i") site_search results.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description adds no extra behavioral context beyond the generic fact that it performs a search. It does not address rate limits, result variability, or how the openWorld hint impacts results, so the description contributes no value beyond the annotations.

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

Conciseness4/5

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

The description is a single short sentence that is easy to parse and free of redundant information. It efficiently states the core purpose, but is so terse that it lacks any usage guidance. It is appropriately sized for a simple tool though not maximally informative.

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

Completeness3/5

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

Given the tool's complexity (13 parameters, output schema present), the minimal description is sufficient for basic invocation, especially with the schema handling parameter details. However, it lacks any context about when to choose this tool over other search tools, and the return format is not summarized. The description meets a minimum viable threshold but has clear gaps in usability guidance.

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?

The input schema has 100% parameter description coverage, with each of the 13 parameters clearly described. The tool description itself adds no parameter-specific information. Baseline 3 is appropriate since the schema carries the full burden for parameter understanding.

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

Purpose4/5

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

The description clearly states the action ('Performs a search') and identifies the specific API ('Google Custom Search JSON API'). This distinguishes it from sibling search tools that target specific services like Gmail or Drive, though the exact scope of results (e.g., web search vs. other content) is not explicitly stated. It is more specific than a vague 'search' but lacks detailed differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives like search_gmail_messages or search_drive_files, nor any mention of prerequisites or exclusions. The description does not help an agent decide between this and other search tools.

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

search_docsSearch DocsA
Read-onlyIdempotent

Searches for Google Docs by name using Drive API (mimeType filter).

Returns: str: A formatted list of Google Docs matching the search query.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
page_sizeNo
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare this as a safe, read-only, idempotent operation. The description adds that it uses the Drive API with a mimeType filter and returns a formatted list, but it does not elaborate on pagination behavior, auth requirements, or what 'formatted list' entails. With annotations covering the safety profile, the description adds only modest extra behavioral context.

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 two concise sentences, front-loaded with the core action, and contains no fluff or redundancy. It efficiently states what the tool does and what it returns.

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

Completeness2/5

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

With three parameters, 0% schema description coverage, and an output schema present, the description is too thin. It explains the query as a name search but omits usage context for required parameters like user_google_email and does not specify how page_size affects results. This is insufficient for reliable tool invocation without external knowledge.

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

Parameters2/5

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

Schema coverage is 0%, so the description must compensate for missing parameter explanations. It clarifies that 'query' is a name search, but it fails to explain 'page_size' and especially 'user_google_email' (a required parameter). This leaves the agent unsure how to populate essential inputs correctly.

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 clearly states the tool searches for Google Docs by name using Drive API with a mimeType filter. This distinguishes it from broader file search (search_drive_files) and Gmail search, making its purpose unambiguous.

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

Usage Guidelines4/5

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

The description implies the tool is for finding Google Docs specifically by name, providing clear context for when to use it. However, it does not explicitly mention alternatives or when not to use it, so it stops short of full exclusion guidance.

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

search_drive_filesSearch Drive FilesA
Read-onlyIdempotent

Searches for files and folders within a user's Google Drive, including shared drives.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query string. Supports Google Drive search operators. NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives because files are owned by the shared drive itself, not individual users. For recent files by a specific user in Shared Drives, search by modifiedTime and use order_by='modifiedTime desc' instead.
corporaNoBodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives'). If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'. Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency.
detailedNoWhether to include size, modified time, and link in results. Defaults to True.
drive_idNoID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
order_byNoSort order. Comma-separated list of sort keys with optional 'desc' modifier. Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'. Defaults to None (Drive API default ordering).
file_typeNoRestrict results to a specific file type. Accepts a friendly name ('folder', 'document'/'doc', 'spreadsheet'/'sheet', 'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut', 'script', 'site', 'jam'/'jamboard') or any raw MIME type string (e.g. 'application/pdf'). Defaults to None (all types).
page_sizeNoThe maximum number of files to return. Defaults to 10.
page_tokenNoPage token from a previous response's nextPageToken to retrieve the next page of results.
include_trashedNoWhether to include files in the trash. Defaults to False, matching the Drive web UI and `list_drive_items`. Ignored when `query` already contains its own `trashed` clause (`=` or `!=`), which always wins.
user_google_emailYesThe user's Google email address. Required.
include_items_from_all_drivesNoWhether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and idempotentHint=true, so the description's mention of 'including shared drives' adds a useful scope detail not covered by annotations. However, the description does not disclose search limitations (e.g., owner-based query issues) or pagination behavior; those are left to the schema.

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 a single, front-loaded sentence that conveys the essential action and scope without any wasted words. It is concise and appropriately sized for the tool.

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

Completeness4/5

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

Given the rich input schema (11 params, 100% coverage), the presence of an output schema, and strong annotations, the description needs only to clarify purpose and scope. It does so effectively by specifying files/folders and shared drives. It could mention more about search behavior, but the schema covers the gaps.

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 baseline is 3. The top-level description does not add parameter semantics; all parameter meaning is already fully documented in the input schema, including examples, defaults, and notes on query operators.

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 clearly states the tool 'Searches for files and folders within a user's Google Drive, including shared drives.' This uses a specific verb ('Searches') and resource (files/folders in Google Drive) and distinguishes it from sibling tools like list_drive_items by emphasizing search functionality.

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

Usage Guidelines3/5

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

The description implies use for searching Google Drive files but does not explicitly mention when to use this tool versus alternatives (e.g., list_drive_items or search_docs). It lacks direct exclusions or recommendations for choosing between tools.

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

search_gmail_messagesSearch Gmail MessagesA
Read-onlyIdempotent

Searches messages in a user's Gmail account based on a query. Returns both Message IDs and Thread IDs for each found message, along with Gmail web interface links for manual verification. Supports pagination via page_token parameter.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search query. Supports standard Gmail search operators.
page_sizeNoThe maximum number of messages to return. Defaults to 10.
page_tokenNoToken for retrieving the next page of results. Use the next_page_token from a previous response.
include_headersNoIf True, also fetch each message's metadata and include Subject, From, and Date per result. Costs one metadata get per result, grouped into HTTP batches of up to 10, plus retries for transient failures. Defaults to False (output unchanged from prior versions).
user_google_emailYesThe user's Google email address. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark the operation read-only and idempotent. The description adds meaningful behavioral details: the return of both Message IDs and Thread IDs, Gmail web links for manual verification, and pagination support. It does not disclose potential rate limits or the additional cost of fetching headers, but the schema covers the include_headers behavior.

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 three sentences, front-loaded with the primary action, and contains no redundant information. Every sentence earns its place: purpose, return value, and pagination feature.

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

Completeness4/5

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

Given the presence of an output schema and full schema parameter descriptions, the description provides sufficient context for a search tool. It covers the main purpose, return values, and pagination. It does not mention include_headers, but that parameter's behavior is fully described in the schema.

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 parameters are fully documented in the schema. The description mentions query and page_token but adds no new semantics beyond what the schema already provides, such as Gmail search operator support or pagination token usage.

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 clearly states the tool searches a user's Gmail messages based on a query, returns Message IDs and Thread IDs, and provides web links for verification. It uses specific verbs and resources, distinguishing it from sibling tools that fetch content or manage labels.

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

Usage Guidelines3/5

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

The description clarifies the search context and mentions pagination but does not explicitly contrast with sibling tools like get_gmail_message_content or search_drive_files. No when-not-to-use scenarios or alternative recommendations are provided.

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

search_messagesSearch MessagesA
Read-onlyIdempotent

Searches for messages in Google Chat spaces by text content and/or time range.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoOptional text to search for. If omitted, only time_filter is applied.
space_idNoOptional space to restrict the search to.
page_sizeNoMaximum number of messages to return per space.
max_spacesNoMaximum number of spaces to search when space_id is not provided (default 10).
time_filterNoOptional filter using Chat API createTime syntax. Examples: 'createTime > "2026-03-18T00:00:00-03:00"' 'createTime > "2026-03-18T00:00:00-03:00" AND createTime < "2026-03-19T00:00:00-03:00"'
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already cover the read-only, idempotent, non-destructive nature of the tool. The description adds that it searches by text/time and across spaces, which is useful, but it does not disclose additional behavioral details like pagination, rate limits, or multi-space scoping beyond what the schema already indicates. No contradiction with annotations.

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 a single, focused sentence: 'Searches for messages in Google Chat spaces by text content and/or time range.' It is front-loaded with the verb and resource, contains no filler or redundant phrases, and every word contributes to understanding the tool's core purpose.

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

Completeness4/5

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

Given the presence of a rich output schema, detailed parameter descriptions, and annotations, the description is adequate for an agent to select and invoke the tool. It captures the essential search capability and differentiates from siblings, though it does not explicitly mention cross-space search or pagination—details available in the schema. The overall package is fairly complete.

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 83%, so parameters are well-documented (e.g., query optional, time_filter syntax, max_spaces defaults). The description adds a high-level mapping of 'text content' to query and 'time range' to time_filter, which is helpful but does not add new meaning beyond the existing schema documentation. The baseline is 3 due to high schema coverage.

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 clearly states the tool's function: 'Searches for messages in Google Chat spaces by text content and/or time range.' It specifies the resource (messages in Google Chat spaces) and the two search dimensions (text content, time range), distinguishing it from Gmail search and other message-related tools like get_messages.

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

Usage Guidelines4/5

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

The description provides clear context for when to use this tool: searching for Chat messages by content or time. However, it does not explicitly mention alternatives or exclusion scenarios (e.g., 'use get_messages to fetch a specific thread' or 'use search_gmail_messages for email'). The context is clear but lacks explicit when-not-to-use guidance.

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

send_gmail_messageSend Gmail MessageA

Sends an email using the user's Gmail account. Supports new emails, replies, and forwards, with optional attachments. Supports Gmail's "Send As" feature to send from configured alias addresses.

To forward an existing message, pass forward_message_id. The original subject, body (quoted with a "Forwarded message" header), and attachments are carried over. In forward mode, body (if any) is prepended as a note and subject is optional. Threading, reply, and signature options do not apply when forwarding.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoOptional CC email address.
toNoRecipient email address. Optional when replying with reply_all=True, which derives it from the thread.
bccNoOptional BCC email address.
bodyNoEmail body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original.
subjectNoEmail subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>').
from_nameNoOptional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'.
reply_allNoWhether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false.
thread_idNoOptional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID.
from_emailNoOptional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email.
referencesNoOptional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target.
attachmentsNoOptional list of attachments. Each can have: "url" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR "path" (file path, auto-encodes), OR "content" (standard base64, not urlsafe) + "filename". Optional "mime_type". Optional "content_id" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src="cid:<content_id>">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{"url": "https://host/attachments/abc-123", "filename": "report.pdf"}]
body_formatNoFormat of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content.plain
in_reply_toNoOptional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id.
quote_originalNoWhether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.
include_signatureNoWhether to append the Gmail signature from Settings > Signature when available. Defaults to true.
user_google_emailYesThe user's Google email address. Required for authentication.
forward_message_idNoSet to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward.
include_forwarded_attachmentsNoWhen forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate this is a mutating, non-idempotent operation, but the description adds useful behavioral detail: forward mode carries over the original subject, quotes the body with a 'Forwarded message' header, optionally includes attachments, and disables threading/reply/signature options. This goes beyond the annotations and helps the agent predict side effects. There is no contradiction with the annotations.

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 and front-loaded: the first sentence states the core action, followed by a focused paragraph on forward-mode behavior. Every sentence earns its place, with no filler or repetition of schema 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?

Given the tool's complexity (18 parameters, multiple modes), the description provides a solid orientation to new/reply/forward and alias sending, while the highly detailed schema covers the remaining parameter-level semantics. An output schema exists, so the description does not need to explain return values. No critical calling context is missing for an agent to use this tool correctly.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics not fully captured in individual property descriptions: how forward mode treats body as a prepended note, which options are ignored, and the overall relationship between forward_message_id, subject, and body. This helps an agent reason about combinations of parameters.

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: it 'Sends an email using the user's Gmail account.' It clearly identifies the main modes (new, reply, forward), attachments, and the 'Send As' alias feature, which distinguishes it from siblings like draft_gmail_message and the Chat-oriented send_message. An agent can immediately understand what this tool accomplishes.

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

Usage Guidelines4/5

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

The description gives concrete usage direction for forwarding: pass forward_message_id, and explains that the original subject/body/attachments are carried over and that body becomes an optional note. It also notes which options do not apply when forwarding. However, it does not explicitly contrast this tool with draft_gmail_message or state when to prefer a reply versus a new message, leaving some selection inference to the reader.

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

send_messageSend MessageB

Sends a message to a Google Chat space.

ParametersJSON Schema
NameRequiredDescriptionDefault
space_idYes
thread_keyNoReply in a thread by app-defined key (creates thread if not found).
thread_nameNoReply in an existing thread by its resource name (e.g. spaces/X/threads/Y).
message_textYes
user_google_emailYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

The description adds no behavioral context beyond what annotations already provide. It does not mention side effects, authentication needs, rate limits, or threading behavior. It is consistent with annotations (readOnlyHint false) but does not enrich the agent's understanding.

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 a single, clear sentence with no redundant words. It is front-loaded and efficiently conveys the core purpose without waste.

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

Completeness2/5

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

Given the tool has 5 parameters (3 required) and no usage guidance, the description is too sparse. It does not explain the roles of space_id, user_google_email, or message_text, nor does it mention threading options beyond what the schema provides. Annotations and output schema do not compensate for the lack of contextual explanations.

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

Parameters2/5

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

The description offers no explanation of parameters. Schema coverage is only 40% (thread_key and thread_name have descriptions), leaving space_id, message_text, and user_google_email undocumented. The description does not compensate for this gap.

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 'Sends a message to a Google Chat space' clearly identifies the specific verb (sends) and resource (Google Chat space). It distinguishes this tool from siblings like 'send_gmail_message' and Chat read tools such as 'get_messages'.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. No mention of exclusions, prerequisites, or situations where another tool would be more appropriate. The description only states the basic action.

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

set_drive_file_permissionsSet Drive File PermissionsA
Destructive

Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.

This is a high-level tool for the most common permission changes. Use this to toggle "anyone with the link" access or configure file-level sharing behavior. For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesThe ID of the file or folder. Required.
link_sharingNoControl "anyone with the link" access for the file. - "off": Disable "anyone with the link" access for this file. - "reader": Anyone with the link can view. - "commenter": Anyone with the link can comment. - "writer": Anyone with the link can edit.
user_google_emailYesThe user's Google email address. Required.
writers_can_shareNoWhether editors can change permissions and share. If False, only the owner can share. Defaults to None (no change).
copy_requires_writer_permissionNoWhether viewers and commenters are prevented from copying, printing, or downloading. Defaults to None (no change).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds some context by noting it's a 'high-level tool for the most common permission changes' and that it handles link sharing. However, it does not disclose potential side effects like overwriting existing file-level settings or what exactly happens when link_sharing is set to 'off.' The description does not contradict annotations.

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, two short paragraphs, with the main purpose front-loaded. Every sentence contributes useful information: the first defines the tool, the second clarifies scope and alternatives. No fluff or redundancy.

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

Completeness2/5

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

The description is incomplete due to the confusing requirement of user_google_email. It claims the tool is only for file-level link sharing, yet it requires a user email, which strongly suggests individual user permissions. This contradiction is not addressed, potentially leading an agent to misuse the tool. The description should explain why user_google_email is needed despite the stated scope.

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 each parameter. The description does not explain why user_google_email is required if the tool is not for individual permissions, which is a notable gap. It adds no extra meaning beyond the schema, so it meets the baseline but does not elevate.

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 clearly states the tool's function: 'Sets file-level sharing settings and controls link sharing for a Google Drive file or folder.' It uses specific verbs and identifies the resource. It distinguishes itself from sibling tools by labeling itself as a 'high-level tool for the most common permission changes' and explicitly naming alternatives for individual user/group permissions.

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 provides explicit when-to-use guidance: 'Use this to toggle "anyone with the link" access or configure file-level sharing behavior.' It also specifies when not to use it and names alternatives: 'For managing individual user/group permissions, use share_drive_file or update_drive_permission instead.' This is clear and actionable.

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

set_publish_settingsSet Publish SettingsB

Updates the publish settings of a form.

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesThe ID of the form to update publish settings for.
is_publishedNoWhether the form is published and visible to responders. Defaults to True.
user_google_emailYesThe user's Google email address. Required.
is_accepting_responsesNoWhether the form accepts responses. Only takes effect when the form is published. Defaults to True.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, but the description adds no extra behavioral context, such as side effects on existing responses, required permissions, or whether changes are reversible. It does not contradict annotations, but fails to enrich them.

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

Conciseness4/5

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

The description is a single, front-loaded sentence with no fluff. However, it is arguably too terse for a tool with four parameters and no guidance, though conciseness itself is well-executed.

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

Completeness3/5

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

The presence of an output schema and complete parameter descriptions lowers the burden on the description. Still, the description does not explain when to use this tool instead of batch_update_form, nor the implications of altering publish settings. It is minimally sufficient for a simple tool but leaves gaps.

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 coverage is 100%, so the baseline is 3. The description provides no additional parameter meaning; the schema's own field descriptions fully document form_id, is_published, user_google_email, and is_accepting_responses.

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 uses a specific verb 'Updates' and a specific resource 'publish settings' targeting 'a form'. This clearly distinguishes it from broader tools like batch_update_form, making its purpose unambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as batch_update_form or get_form. There are no exclusions or context cues to help an agent choose correctly.

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

start_google_authStart Google AuthA

Manually initiate Google OAuth authentication flow.

NOTE: This is a legacy OAuth 2.0 tool and is disabled when OAuth 2.1 is enabled. The authentication system automatically handles credential checks and prompts for authentication when needed. Only use this tool if:

  1. You need to re-authenticate with different credentials

  2. You want to proactively authenticate before using other tools

  3. The automatic authentication flow failed and you need to retry

In most cases, simply try calling the Google Workspace tool you need - it will automatically handle authentication if required.

ParametersJSON Schema
NameRequiredDescriptionDefault
service_nameYes
user_google_emailNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description adds valuable behavioral context beyond annotations: it's a legacy tool, disabled with OAuth 2.1, and the system already auto-handles auth. This clarifies when the manual initiation is appropriate, which the annotations do not convey.

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 a clear opening statement, a note about legacy status, and a numbered list of use cases. Every sentence adds value, and the alternative guidance is succinct.

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

Completeness4/5

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

Given the tool's narrow scope and presence of an output schema, the description covers purpose, usage conditions, and important limitations. The main gap is parameter details, but the overall context is sufficient for an agent to decide when to invoke it.

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

Parameters2/5

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

Schema description coverage is 0%, and the description adds no guidance on the meaning or usage of `service_name` and `user_google_email`. While parameter names are somewhat self-explanatory, the description completely ignores them, failing to compensate for the low schema coverage.

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 clearly states the tool's function: "Manually initiate Google OAuth authentication flow." This specific verb+resource phrasing distinguishes it from all sibling tools, which are service-specific operations.

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 provides explicit when-to-use and when-not-to-use guidance. It lists three specific conditions for use and explicitly points to alternatives: "simply try calling the Google Workspace tool you need - it will automatically handle authentication if required."

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

update_doc_headers_footersUpdate Doc Headers FootersA
Destructive

Safely creates or updates header/footer text in a Google Doc.

This is the default tool for header/footer content. Do NOT use batch_update_doc with create_header_footer just to set header/footer text; that low-level operation is only for advanced section-break workflows and can fail when the default header/footer already exists.

This tool handles both creation and update in one call:

  • If the header/footer does not exist, it is automatically created first.

  • If the header/footer already exists, its content is replaced.

You do NOT need to create a header/footer separately before calling this tool. Simply call it with the desired content and it will work whether the header/footer exists or not.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesText content for the header/footer
document_idYesID of the document to update
section_typeYesType of section to create or update ("header" or "footer")
user_google_emailYesUser's Google email address
header_footer_typeNoType of header/footer ("DEFAULT", "FIRST_PAGE_ONLY", "EVEN_PAGE")DEFAULT

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already signal destructiveHint=true, and the description adds valuable behavioral context: it states the tool automatically creates the header/footer if missing and replaces content if present, and it highlights a failure mode of the alternative. However, it does not mention authentication requirements, potential errors, or side effects beyond the header/footer content, so it stops short of full transparency.

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

Conciseness4/5

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

The description is well-structured with a clear opening statement, a warning, and bullet points. It is slightly longer than strictly necessary, but every section serves a purpose—the warning about batch_update_doc and the bulleted behaviors are both important. It is appropriately front-loaded with the core purpose.

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

Completeness4/5

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

The description covers the main operational facets (create/update, no separate step needed, safety) and the alternative tool's limitations. However, it omits guidance on the optional header_footer_type parameter and does not discuss error scenarios or permissions, which leaves some gaps for a 5-parameter tool. The output schema existence reduces the need to explain returns, but a bit more context would make it complete.

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 baseline is 3. The description does not add meaningful parameter semantics beyond the schema—it only mentions 'content' generically and does not explain the optional header_footer_type field or the required user_google_email parameter. Since the schema already documents all fields, the description adds no significant value here.

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 clear, specific verb+resource: 'Safely creates or updates header/footer text in a Google Doc.' It further distinguishes itself from sibling tools by explicitly warning against using batch_update_doc with create_header_footer for this purpose, establishing this tool as the default for header/footer content.

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 this tool ('This is the default tool for header/footer content') and when not to ('Do NOT use batch_update_doc with create_header_footer just to set header/footer text'), including a rationale ('that low-level operation is only for advanced section-break workflows and can fail when the default header/footer already exists'). It also clarifies the automatic create-or-update behavior, leaving no ambiguity.

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

update_drive_fileUpdate Drive FileA
Destructive

Updates metadata, properties, and/or content of a Google Drive file.

Providing one of content, file_path, or file_url replaces the file's content in place, preserving the existing file ID, sharing, comments, and links. For native Google Docs/Sheets/Slides the source is uploaded with its source MIME type so the Drive API applies the same format conversion as import_to_google_doc (markdown headings, tables, bold, etc.). For any other file (.md, .txt, .pdf, ...) there is nothing to convert, so the bytes are written back as-is under the file's own MIME type. Metadata and content can be updated in a single call.

mode='append'/'prepend' splice content onto the file's existing text server-side, so only the new text has to be supplied — no need to send the whole file back to rewrite it.

Drive shortcuts are handled according to the kind of update: supported resource-local metadata changes (rename, move, trash, star, description, and custom properties) apply to the supplied shortcut, while content replacement follows the shortcut and updates its target. To avoid applying metadata to the wrong resource, a shortcut call cannot combine content with resource-local metadata. Update the shortcut metadata and target content in separate calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoHow to apply the new content — 'replace' (default), 'append', or 'prepend'. Append/prepend require 'content' and a UTF-8 text file such as .md or .txt; a newline is inserted at the seam if neither side has one. For native Google Docs use insert_doc_elements, modify_doc_text, or find_and_replace_doc, which edit in place instead of rewriting the file.replace
nameNoNew name for the file.
contentNoNew text content for text-based formats (markdown, TXT, HTML).
file_idYesThe ID of the file to update. Required.
starredNoWhether to star/unstar the file.
trashedNoWhether to move file to/from trash.
file_urlNoRemote http(s) URL to fetch new content from.
file_pathNoLocal file path for binary formats (DOCX, ODT). Supports file:// URLs.
mime_typeNoNew MIME type (note: changing type may require content upload). For a shortcut ID, this must accompany content and applies to the resolved target.
propertiesNoCustom key-value properties for the file.
add_parentsNoComma-separated folder IDs to add as parents.
descriptionNoNew description for the file.
source_formatNoSource format hint for conversion (md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and ignored for non-Google files, which are uploaded without conversion. Provide at most one of content/file_path/file_url.
remove_parentsNoComma-separated folder IDs to remove from parents.
user_google_emailYesThe user's Google email address. Required.
writers_can_shareNoWhether editors can share the file. Pass the target ID directly; this cannot be changed on a shortcut resource.
copy_requires_writer_permissionNoWhether copying requires writer permission. Pass the target ID directly; this cannot be changed on a shortcut resource.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses important behaviors: replacement happens in place while preserving file ID, sharing, comments, and links; source MIME conversion applies for native formats; append/prepend splice server-side; and shortcut updates route content to the target while metadata applies locally. This is rich behavioral context that materially shapes how an agent should invoke the tool.

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

Conciseness4/5

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

The description is long but dense and well-organized into focused paragraphs: core behavior, conversion semantics, append/prepend behavior, and shortcut handling. Almost every sentence adds operational value, though a few points such as 'there is nothing to convert' are slightly explanatory rather than strictly necessary.

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 high-complexity tool with 17 parameters, destructive behavior, shortcut edge cases, and format-conversion nuances, the description covers the critical decision points an agent needs. An output schema exists, so return-value documentation is not required here. The combination of rich annotations, full schema coverage, and this description makes the tool fully navigable.

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?

Schema coverage is 100%, so the schema already documents each parameter individually. The description adds cross-parameter meaning that the schema does not: 'content', 'file_path', and 'file_url' are mutually exclusive for content replacement, metadata and content can be updated in one call, and shortcut-specific restrictions on combining content with resource-local metadata. This justifies a score above the baseline 3.

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-resource pair: 'Updates metadata, properties, and/or content of a Google Drive file.' It further distinguishes content replacement from metadata updates and explains how native Google formats are converted, which separates this tool from siblings like import_to_google_doc and modify_doc_text.

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 names alternatives: for native Google Docs append/prepend it directs agents to insert_doc_elements, modify_doc_text, or find_and_replace_doc, and it references import_to_google_doc for conversion behavior. It also states when not to combine operations, as with shortcuts, making the when-to-use guidance unusually concrete.

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

update_paragraph_styleUpdate Paragraph StyleA

Apply paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc.

This tool can apply named heading styles (H1-H6) for semantic document structure, create bulleted or numbered lists with nested indentation, and customize paragraph properties like alignment, spacing, and indentation. All operations can be applied in a single call.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoOptional document tab ID to target
alignmentNoText alignment - 'START' (left), 'CENTER', 'END' (right), or 'JUSTIFIED'
directionNoParagraph direction - 'LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT'
end_indexYesEnd position (exclusive) - should cover the entire paragraph
list_typeNoCreate a list from existing paragraphs ('UNORDERED' for bullets, 'ORDERED' for numbers, 'CHECKBOX' for checklists)
indent_endNoRight/end indent in points
segment_idNoOptional header/footer/footnote segment ID to target
border_dashNoBorder dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')
document_idYesDocument ID to modify
space_aboveNoSpace above paragraph in points (e.g., 12 for one line)
space_belowNoSpace below paragraph in points
start_indexYesStart position using Docs API indices from inspect_doc_structure. For the main body, 0 is also accepted as an alias for the first writable position.
border_colorNoBorder color (#RRGGBB; defaults to black)
border_edgesNoParagraph border edges to update ('top', 'bottom', 'left', 'right', or 'between'); omit to update all four outer edges
border_widthNoBorder width in points (defaults to 1)
indent_startNoLeft/start indent in points
line_spacingNoLine spacing multiplier (1.0 = single, 1.5 = 1.5x, 2.0 = double)
spacing_modeNo'NEVER_COLLAPSE' or 'COLLAPSE_LISTS'
bullet_presetNoOptional explicit Google Docs bullet preset
heading_levelNoHeading level 0-6 (0 = NORMAL_TEXT, 1 = H1, 2 = H2, etc.) Use for semantic document structure
shading_colorNoParagraph shading/background color (#RRGGBB)
border_paddingNoBorder padding in points (defaults to 4)
keep_with_nextNoKeep the paragraph with the next paragraph
named_style_typeNoDirect named style type - 'NORMAL_TEXT', 'TITLE', 'SUBTITLE', 'HEADING_1' through 'HEADING_6'. Mutually exclusive with heading_level.
indent_first_lineNoFirst line indent in points (e.g., 36 for 0.5 inch)
page_break_beforeNoStart the paragraph on a new page
user_google_emailYesUser's Google email address
list_nesting_levelNoNesting level for lists (0-8, where 0 is top level, default is 0) Use higher levels for nested/indented list items
keep_lines_togetherNoKeep all lines of the paragraph together
avoid_widow_and_orphanNoAvoid widows/orphans for the paragraph

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, so the agent knows this is a mutation. The description adds that multiple formatting operations can be combined in a single call, which is useful context. However, it does not disclose potential side effects, permissions, or behavior on invalid indices.

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?

Two sentences, front-loaded with purpose, no redundant text. Efficiently summarizes the tool's capability.

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

Completeness4/5

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

The tool has 30 parameters and an output schema, and the schema fully documents parameters. The description provides a clear high-level overview of the tool's purpose and combinations, though it could mention using indices from inspect_doc_structure but that's already in the parameter description.

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 coverage is 100%, with each parameter having a description. The tool description adds no parameter-specific semantics beyond what the schema already provides, so a baseline score of 3 is appropriate.

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 ('Apply') and names the resource ('paragraph-level formatting, heading styles, and/or list formatting to a range in a Google Doc'). It clearly differentiates from sibling tools that handle text insertion or document-wide updates.

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

Usage Guidelines4/5

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

The description implies usage by stating what it can do and that all operations can be applied in a single call, but it does not explicitly name alternative tools or exclusion criteria. It provides clear context for when to choose this tool for paragraph styling.

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

update_script_contentUpdate Script ContentA
Destructive

Update or create files in a script project.

By default this merges the supplied files into the existing project by file name, leaving other files untouched. Set merge=False to replace the entire project: any existing file omitted from files is permanently deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesFile objects with name, type, and source to create or update
mergeNoWhen True (default), overlay these files onto the current project. When False, replace the full project file set; omitted files are deleted.
script_idYesThe script project ID
user_google_emailYesUser's email address

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations flag destructiveHint=true; the description adds crucial context by stating that with merge=False, any existing file omitted from `files` is permanently deleted. It also clarifies that default is non-destructive (leaving other files untouched), which is beyond annotation info.

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 two sentences, front-loaded with the core purpose, and efficiently communicates the key merge/replace distinction without redundancy.

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

Completeness4/5

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

For a mutation tool with full schema coverage, annotations, and an output schema, the description sufficiently covers the essential behavior (merge vs replace and deletion). It lacks only explicit prerequisites or alternative tool references, but these are not necessary given the context.

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 covers 100% of parameters with detailed descriptions, including the merge behavior identical to the description. The description adds no extra parameter semantics beyond the schema, so baseline 3 is appropriate.

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 clearly states 'Update or create files in a script project' with a specific verb and resource, and distinguishes from sibling tools like create_script_project and delete_script_project by focusing on file-level updates within an existing project. The merge behavior further clarifies scope.

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

Usage Guidelines4/5

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

It explains the default merge behavior and the alternative merge=False replacement, giving clear context for when to use this tool. However, it does not explicitly exclude alternatives like creating a new project with create_script_project, so it lacks explicit when-not guidance.

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. Dates show when Glama detected each change.

  1. 12 tool updatesv1.25.2
    • Changedbatch_modify_gmail_message_labels3 fields changed
      • removedInput schema / properties / add_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / remove_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / verify
        Added value: +{
        +  "default": true,
        +  "description": "Read the messages back and report per-id outcomes. Costs\none extra (batched) read per id. Set False for very large sweeps\nwhere that cost matters and an unverified result is acceptable.",
        +  "type": "boolean"
        +}
    • Changedcreate_drive_file1 field changed
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changeddraft_gmail_message4 fields changed
      • changedInput schema / properties / from_email / description
        Previous value: -"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email."New value: +"Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the account's default Send As address, falling back to the authenticated user's email when Gmail returns no usable Send-As entry or settings access is not authorized."
      • changedInput schema / properties / in_reply_to / description
        Previous value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id."
      • changedInput schema / properties / references / description
        Previous value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target."
      • changedInput schema / properties / thread_id / description
        Previous value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
    • Changedget_events3 fields changed
      • changedInput schema / properties / detailed / description
        Previous value: -"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False."New value: +"Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series; recurring masters report their raw RFC5545 recurrence rules; and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False."
      • addedInput schema / properties / single_events
        Added value: +{
        +  "default": true,
        +  "description": "Whether to expand recurring series into individual instances. Defaults to True for backwards compatibility. Set to False with detailed=True to retrieve recurring master events and their exact RFC5545 recurrence rules instead of inferring cadence from expanded instances.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / time_min / description
        Previous value: -"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided."New value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time when single_events=True. It is omitted from unexpanded queries so recurring masters that began in the past but still have future occurrences remain discoverable. Ignored if event_id is provided."
    • Changedimport_to_google_doc2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for a binary source such as DOCX or ODT."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedimport_to_google_sheets2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for an XLSX, XLS, or ODS source."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedimport_to_google_slides2 fields changed
      • addedInput schema / properties / base64_content
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Standard base64-encoded bytes for a PPTX or ODP source."
        +}
      • addedInput schema / properties / base64_sha256
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Expected SHA-256 of decoded base64_content. Recommended for binary payload integrity checks."
        +}
    • Changedlist_gmail_labels3 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": false,
        +  "description": "Return minimal JSON {\"count\", \"labels\": [{\"id\", \"name\"}]}\nsorted by name, instead of the formatted text list. For callers\nthat parse the result, e.g. a label cache refresh.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_system
        Added value: +{
        +  "default": true,
        +  "description": "Include Gmail system labels (INBOX, SENT, ...).\nSet False to return user labels only.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / prefix
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Return only labels whose name starts with this\nexact (case-sensitive) string. users.labels.list accepts no filter,\nso the full list is fetched and narrowed here: this shrinks what the\ncaller receives, not the API call."
        +}
    • Changedmanage_event3 fields changed
      • addedInput schema / properties / end_timezone
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "IANA timezone for the end boundary only,\noverriding timezone. See start_timezone."
        +}
      • addedInput schema / properties / start_timezone
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "IANA timezone for the start boundary only,\noverriding timezone. Use for events whose two ends sit in different zones -\na flight departing 13:45 \"Asia/Jerusalem\" and landing 17:50\n\"Europe/Amsterdam\" is one event authored in two zones. Passing a single\ntimezone for such an event silently rewrites one end's wall-clock."
        +}
      • changedInput schema / properties / timezone / description
        Previous value: -"Timezone (e.g., \"America/New_York\")."New value: +"IANA timezone applied to both boundaries (e.g.,\n\"America/New_York\"). Overridden per boundary by start_timezone/end_timezone."
    • Changedmodify_gmail_message_labels2 fields changed
      • removedInput schema / properties / add_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / remove_label_ids / anyOf
        Removed value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
    • Changedsend_gmail_message3 fields changed
      • changedInput schema / properties / in_reply_to / description
        Previous value: -"Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."New value: +"Optional RFC Message-ID to explicitly reply to a specific message (e.g., '<message123@gmail.com>'). Omit to reply to the latest eligible message in thread_id."
      • changedInput schema / properties / references / description
        Previous value: -"Optional chain of Message-IDs for proper threading."New value: +"Optional Message-ID ancestry chain. Normally omit when thread_id is provided; the server derives the chain through the selected reply target."
      • changedInput schema / properties / thread_id / description
        Previous value: -"Optional Gmail thread ID to reply within."New value: +"Optional Gmail thread ID to reply within. When in_reply_to is omitted, replies to the latest non-draft, non-trash message with an RFC Message-ID."
    • Changedupdate_drive_file3 fields changed
      • changedInput schema / properties / copy_requires_writer_permission / description
        Previous value: -"Whether copying requires writer permission."New value: +"Whether copying requires writer\npermission. Pass the target ID directly; this cannot be changed on a\nshortcut resource."
      • changedInput schema / properties / mime_type / description
        Previous value: -"New MIME type (note: changing type may require content upload)."New value: +"New MIME type (note: changing type may require\ncontent upload). For a shortcut ID, this must accompany content and applies\nto the resolved target."
      • changedInput schema / properties / writers_can_share / description
        Previous value: -"Whether editors can share the file."New value: +"Whether editors can share the file. Pass the\ntarget ID directly; this cannot be changed on a shortcut resource."
  2. 8 tool updatesv1.24.0
    • Changedbatch_update_doc1 field changed
      • changedInput schema / properties / operations / items / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true."
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "text": {
        -        "description": "Text to insert.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "insert_text",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "delete_text",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "text": {
        -        "description": "Replacement text.",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "replace_text",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "baseline_offset": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "bold": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "clear_link": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "font_family": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "font_size": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "font_weight": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "italic": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "link_url": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "small_caps": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "strikethrough": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "text_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "type": {
        -        "const": "format_text",
        -        "type": "string"
        -      },
        -      "underline": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alignment": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "avoid_widow_and_orphan": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "direction": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "heading_level": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "indent_end": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "indent_first_line": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "indent_start": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "keep_lines_together": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "keep_with_next": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "line_spacing": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "named_style_type": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "page_break_before": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "shading_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "space_above": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "space_below": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "spacing_mode": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "update_paragraph_style",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "border_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "border_width": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "column_index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "column_span": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "content_alignment": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "padding_bottom": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "padding_left": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "padding_right": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "padding_top": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "row_index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "row_span": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "update_table_cell_style",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "columns": {
        -        "type": "integer"
        -      },
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true."
        -      },
        -      "rows": {
        -        "type": "integer"
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "insert_table",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "rows",
        -      "columns"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "insert_below": {
        -        "default": true,
        -        "type": "boolean"
        -      },
        -      "row_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "insert_table_row",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "row_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "delete_table_row",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_index": {
        -        "type": "integer"
        -      },
        -      "insert_right": {
        -        "default": true,
        -        "type": "boolean"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "insert_table_column",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "column_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "delete_table_column",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "column_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_index": {
        -        "type": "integer"
        -      },
        -      "column_span": {
        -        "type": "integer"
        -      },
        -      "row_index": {
        -        "type": "integer"
        -      },
        -      "row_span": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "merge_table_cells",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_index",
        -      "column_index",
        -      "row_span",
        -      "column_span"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_index": {
        -        "type": "integer"
        -      },
        -      "column_span": {
        -        "type": "integer"
        -      },
        -      "row_index": {
        -        "type": "integer"
        -      },
        -      "row_span": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "unmerge_table_cells",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_index",
        -      "column_index",
        -      "row_span",
        -      "column_span"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_indices": {
        -        "items": {
        -          "type": "integer"
        -        },
        -        "type": "array"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "update_table_column_properties",
        -        "type": "string"
        -      },
        -      "width": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "width_type": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "column_indices"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "min_row_height": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Minimum row height in points."
        -      },
        -      "row_indices": {
        -        "description": "Zero-based row indices to style, e.g. [0] for the header row.",
        -        "items": {
        -          "type": "integer"
        -        },
        -        "type": "array"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "update_table_row_style",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "row_indices"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "pinned_header_rows_count": {
        -        "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "table_start_index": {
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "pin_table_header_rows",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "table_start_index",
        -      "pinned_header_rows_count"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the body instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true."
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "insert_page_break",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the body instead of using index.",
        -        "type": "boolean"
        -      },
        -      "index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true."
        -      },
        -      "section_type": {
        -        "default": "NEXT_PAGE",
        -        "enum": [
        -          "CONTINUOUS",
        -          "NEXT_PAGE"
        -        ],
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "insert_section_break",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "find_text": {
        -        "type": "string"
        -      },
        -      "match_case": {
        -        "default": false,
        -        "type": "boolean"
        -      },
        -      "replace_text": {
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "find_replace",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "find_text",
        -      "replace_text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "bullet_preset": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "list_type": {
        -        "default": "UNORDERED",
        -        "enum": [
        -          "UNORDERED",
        -          "ORDERED",
        -          "CHECKBOX",
        -          "NONE"
        -        ],
        -        "type": "string"
        -      },
        -      "nesting_level": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "paragraph_start_indices": {
        -        "anyOf": [
        -          {
        -            "items": {
        -              "type": "integer"
        -            },
        -            "type": "array"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "create_bullet_list",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "create_named_range",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "name",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "named_range_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "named_range_name": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "text": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "replace_named_range_content",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "named_range_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "named_range_name": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "delete_named_range",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "background_color": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "document_mode": {
        -        "anyOf": [
        -          {
        -            "enum": [
        -              "PAGES",
        -              "PAGELESS"
        -            ],
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "flip_page_orientation": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_bottom": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_footer": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_header": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_left": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_right": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_top": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "page_height": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "page_number_start": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "page_width": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "update_document_style",
        -        "type": "string"
        -      },
        -      "use_even_page_header_footer": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "use_first_page_header_footer": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "column_count": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "column_separator_style": {
        -        "anyOf": [
        -          {
        -            "enum": [
        -              "NONE",
        -              "BETWEEN_EACH_COLUMN"
        -            ],
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "column_spacing": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "content_direction": {
        -        "anyOf": [
        -          {
        -            "enum": [
        -              "LEFT_TO_RIGHT",
        -              "RIGHT_TO_LEFT"
        -            ],
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "end_index": {
        -        "type": "integer"
        -      },
        -      "flip_page_orientation": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_bottom": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_footer": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_header": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_left": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_right": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "margin_top": {
        -        "anyOf": [
        -          {
        -            "type": "number"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "page_number_start": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "start_index": {
        -        "type": "integer"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "update_section_style",
        -        "type": "string"
        -      },
        -      "use_first_page_header_footer": {
        -        "anyOf": [
        -          {
        -            "type": "boolean"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "start_index",
        -      "end_index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "header_footer_type": {
        -        "default": "DEFAULT",
        -        "description": "Header/footer type to create.",
        -        "enum": [
        -          "DEFAULT",
        -          "FIRST_PAGE_ONLY",
        -          "EVEN_PAGE"
        -        ],
        -        "type": "string"
        -      },
        -      "section_break_index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional section break index for section-scoped layouts."
        -      },
        -      "section_type": {
        -        "description": "Which section to create.",
        -        "enum": [
        -          "header",
        -          "footer"
        -        ],
        -        "type": "string"
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "create_header_footer",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "section_type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "end_of_segment": {
        -        "default": false,
        -        "description": "Append to the end of the targeted body/segment instead of using index.",
        -        "type": "boolean"
        -      },
        -      "height": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "image_uri": {
        -        "description": "Image URL or resolvable image URI.",
        -        "type": "string"
        -      },
        -      "index": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Insertion index. Omit when end_of_segment=true."
        -      },
        -      "segment_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        -      },
        -      "tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null,
        -        "description": "Optional document tab ID to target."
        -      },
        -      "type": {
        -        "const": "insert_image",
        -        "type": "string"
        -      },
        -      "width": {
        -        "anyOf": [
        -          {
        -            "type": "integer"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "image_uri"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "index": {
        -        "type": "integer"
        -      },
        -      "parent_tab_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "default": null
        -      },
        -      "title": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "insert_doc_tab",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "title",
        -      "index"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "tab_id": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "delete_doc_tab",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "tab_id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "tab_id": {
        -        "type": "string"
        -      },
        -      "title": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "update_doc_tab",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "tab_id",
        -      "title"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true."
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "text": {
        +        "description": "Text to insert.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "insert_text",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "delete_text",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "text": {
        +        "description": "Replacement text.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "replace_text",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "baseline_offset": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "bold": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "clear_link": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "font_family": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "font_size": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "font_weight": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "italic": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "link_url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "small_caps": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "strikethrough": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "text_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "type": {
        +        "const": "format_text",
        +        "type": "string"
        +      },
        +      "underline": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "alignment": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "avoid_widow_and_orphan": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_dash": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_edges": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "enum": [
        +                "top",
        +                "bottom",
        +                "left",
        +                "right",
        +                "between"
        +              ],
        +              "type": "string"
        +            },
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Paragraph border edges to update; omit to update top, bottom, left, and right."
        +      },
        +      "border_padding": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_width": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "direction": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "heading_level": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "indent_end": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "indent_first_line": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "indent_start": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "keep_lines_together": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "keep_with_next": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "line_spacing": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "named_style_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "page_break_before": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "shading_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "space_above": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "space_below": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "spacing_mode": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "update_paragraph_style",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "border_edges": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "enum": [
        +                "top",
        +                "bottom",
        +                "left",
        +                "right"
        +              ],
        +              "type": "string"
        +            },
        +            "minItems": 1,
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Table-cell border edges to update; omit to update all four edges."
        +      },
        +      "border_width": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "column_index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "column_span": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "content_alignment": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "padding_bottom": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "padding_left": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "padding_right": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "padding_top": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "row_index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "row_span": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "update_table_cell_style",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "columns": {
        +        "type": "integer"
        +      },
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true."
        +      },
        +      "rows": {
        +        "type": "integer"
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "insert_table",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "rows",
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "insert_below": {
        +        "default": true,
        +        "type": "boolean"
        +      },
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "insert_table_row",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "delete_table_row",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "insert_right": {
        +        "default": true,
        +        "type": "boolean"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "insert_table_column",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "delete_table_column",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "column_span": {
        +        "type": "integer"
        +      },
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "row_span": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "merge_table_cells",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index",
        +      "column_index",
        +      "row_span",
        +      "column_span"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_index": {
        +        "type": "integer"
        +      },
        +      "column_span": {
        +        "type": "integer"
        +      },
        +      "row_index": {
        +        "type": "integer"
        +      },
        +      "row_span": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "unmerge_table_cells",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_index",
        +      "column_index",
        +      "row_span",
        +      "column_span"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_indices": {
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "update_table_column_properties",
        +        "type": "string"
        +      },
        +      "width": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "width_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "column_indices"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "min_row_height": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Minimum row height in points."
        +      },
        +      "row_indices": {
        +        "description": "Zero-based row indices to style, e.g. [0] for the header row.",
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "update_table_row_style",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "row_indices"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "pinned_header_rows_count": {
        +        "description": "Number of leading rows to pin as a repeating header on each page. 0 unpins all rows. Use this dedicated request because the 'tableHeader' value reported in TableRowStyle cannot be set through UpdateTableRowStyleRequest.",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "table_start_index": {
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "pin_table_header_rows",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "table_start_index",
        +      "pinned_header_rows_count"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the body instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true."
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "insert_page_break",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the body instead of using index.",
        +        "type": "boolean"
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true."
        +      },
        +      "section_type": {
        +        "default": "NEXT_PAGE",
        +        "enum": [
        +          "CONTINUOUS",
        +          "NEXT_PAGE"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "insert_section_break",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "find_text": {
        +        "type": "string"
        +      },
        +      "match_case": {
        +        "default": false,
        +        "type": "boolean"
        +      },
        +      "replace_text": {
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "find_replace",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "find_text",
        +      "replace_text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bullet_preset": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "list_type": {
        +        "default": "UNORDERED",
        +        "enum": [
        +          "UNORDERED",
        +          "ORDERED",
        +          "CHECKBOX",
        +          "NONE"
        +        ],
        +        "type": "string"
        +      },
        +      "nesting_level": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "paragraph_start_indices": {
        +        "anyOf": [
        +          {
        +            "items": {
        +              "type": "integer"
        +            },
        +            "type": "array"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "create_bullet_list",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "create_named_range",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "name",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "named_range_name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "text": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "replace_named_range_content",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "named_range_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "named_range_name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "delete_named_range",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "background_color": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "document_mode": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "PAGES",
        +              "PAGELESS"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "flip_page_orientation": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_bottom": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_footer": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_header": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_left": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_right": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_top": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "page_height": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "page_number_start": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "page_width": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "update_document_style",
        +        "type": "string"
        +      },
        +      "use_even_page_header_footer": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "use_first_page_header_footer": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "column_count": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "column_separator_style": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "NONE",
        +              "BETWEEN_EACH_COLUMN"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "column_spacing": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "content_direction": {
        +        "anyOf": [
        +          {
        +            "enum": [
        +              "LEFT_TO_RIGHT",
        +              "RIGHT_TO_LEFT"
        +            ],
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "end_index": {
        +        "type": "integer"
        +      },
        +      "flip_page_orientation": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_bottom": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_footer": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_header": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_left": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_right": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "margin_top": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "page_number_start": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "start_index": {
        +        "type": "integer"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "update_section_style",
        +        "type": "string"
        +      },
        +      "use_first_page_header_footer": {
        +        "anyOf": [
        +          {
        +            "type": "boolean"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "start_index",
        +      "end_index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "header_footer_type": {
        +        "default": "DEFAULT",
        +        "description": "Header/footer type to create.",
        +        "enum": [
        +          "DEFAULT",
        +          "FIRST_PAGE_ONLY",
        +          "EVEN_PAGE"
        +        ],
        +        "type": "string"
        +      },
        +      "section_break_index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional section break index for section-scoped layouts."
        +      },
        +      "section_type": {
        +        "description": "Which section to create.",
        +        "enum": [
        +          "header",
        +          "footer"
        +        ],
        +        "type": "string"
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "create_header_footer",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "section_type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "end_of_segment": {
        +        "default": false,
        +        "description": "Append to the end of the targeted body/segment instead of using index.",
        +        "type": "boolean"
        +      },
        +      "height": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "image_uri": {
        +        "description": "Image URL or resolvable image URI.",
        +        "type": "string"
        +      },
        +      "index": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Insertion index. Omit when end_of_segment=true."
        +      },
        +      "segment_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional header/footer/footnote segment ID. Use a real ID returned by inspect_doc_structure; do not guess values like 'kix.header'."
        +      },
        +      "tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null,
        +        "description": "Optional document tab ID to target."
        +      },
        +      "type": {
        +        "const": "insert_image",
        +        "type": "string"
        +      },
        +      "width": {
        +        "anyOf": [
        +          {
        +            "type": "integer"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "image_uri"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "index": {
        +        "type": "integer"
        +      },
        +      "parent_tab_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "default": null
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "insert_doc_tab",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "title",
        +      "index"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "delete_doc_tab",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "tab_id": {
        +        "type": "string"
        +      },
        +      "title": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "update_doc_tab",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "tab_id",
        +      "title"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changeddraft_gmail_message1 field changed
      • changedInput schema / properties / quote_original / description
        Previous value: -"Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false."New value: +"Whether to include the original message as a quoted reply. Only has an effect when thread_id is provided. Defaults to false."
    • Changedget_presentation1 field changed
      • addedInput schema / properties / include_speaker_notes
        Added value: +{
        +  "default": false,
        +  "description": "Also report each slide's speaker (presenter)\nnotes and the object ID of the shape holding them. Pass True when you\nneed to read or edit notes: that shape ID is the only valid target for\ninsertText/deleteText on notes, and batch_update_presentation writes\nnotes by deleting the shape's existing text and inserting new text.\nDefaults to False.",
        +  "type": "boolean"
        +}
    • Changedmodify_doc_text1 field changed
      • changedInput schema / properties / font_size / type
        Previous value: -"integer"New value: +"number"
    • Changedsearch_gmail_messages1 field changed
      • addedInput schema / properties / include_headers
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch each message's metadata and include\nSubject, From, and Date per result. Costs one metadata get per result,\ngrouped into HTTP batches of up to 10, plus retries for transient failures.\nDefaults to False (output unchanged from prior versions).",
        +  "type": "boolean"
        +}
    • Changedsend_gmail_message7 fields changed
      • addedInput schema / properties / quote_original
        Added value: +{
        +  "default": false,
        +  "description": "Whether to include the message being replied to as a quoted original. Only has an effect when thread_id is provided. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / reply_all
        Added value: +{
        +  "default": false,
        +  "description": "Whether to derive reply-all recipients from the thread: To = the sender being replied to, Cc = the other participants, excluding the authenticated account and from_email. Requires thread_id. Explicit to/cc win; when cc is omitted the sender being replied to is added to the derived Cc if they are not already in To. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / to / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / to / default
        Added value: +null
      • changedInput schema / properties / to / description
        Previous value: -"Recipient email address."New value: +"Recipient email address. Optional when replying with reply_all=True, which derives it from the thread."
      • removedInput schema / properties / to / type
        Removed value: -"string"
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "to"
        -]New value: +[
        +  "user_google_email"
        +]
    • Changedupdate_drive_file2 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "description": "How to apply the new content — 'replace' (default), 'append', or\n'prepend'. Append/prepend require 'content' and a UTF-8 text file such as\n.md or .txt; a newline is inserted at the seam if neither side has one.\nFor native Google Docs use insert_doc_elements, modify_doc_text, or\nfind_and_replace_doc, which edit in place instead of rewriting the file.",
        +  "type": "string"
        +}
      • changedInput schema / properties / source_format / description
        Previous value: -"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted.\nProvide at most one of content/file_path/file_url."New value: +"Source format hint for conversion\n(md, markdown, docx, txt, html, rtf, odt). Auto-detected when omitted, and\nignored for non-Google files, which are uploaded without conversion.\nProvide at most one of content/file_path/file_url."
    • Changedupdate_paragraph_style5 fields changed
      • addedInput schema / properties / border_color
        Added value: +{
        +  "default": null,
        +  "description": "Border color (#RRGGBB; defaults to black)",
        +  "type": "string"
        +}
      • addedInput schema / properties / border_dash
        Added value: +{
        +  "default": null,
        +  "description": "Border dash style ('SOLID', 'DOT', or 'DASH'; defaults to 'SOLID')",
        +  "type": "string"
        +}
      • addedInput schema / properties / border_edges
        Added value: +{
        +  "default": null,
        +  "description": "Paragraph border edges to update ('top', 'bottom', 'left',\n          'right', or 'between'); omit to update all four outer edges",
        +  "items": {
        +    "enum": [
        +      "top",
        +      "bottom",
        +      "left",
        +      "right",
        +      "between"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / border_padding
        Added value: +{
        +  "default": null,
        +  "description": "Border padding in points (defaults to 4)",
        +  "type": "number"
        +}
      • addedInput schema / properties / border_width
        Added value: +{
        +  "default": null,
        +  "description": "Border width in points (defaults to 1)",
        +  "type": "number"
        +}
  3. 125 tool updatesv1.0.1
    • Addedappend_table_rows
    • Addedbatch_modify_gmail_message_labels
    • Addedbatch_update_doc
    • Addedbatch_update_form
    • Addedbatch_update_presentation
    • Addedcheck_drive_file_public_access
    • Addedcopy_drive_file
    • Addedcreate_calendar
    • Changedcreate_doc11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / content / description
        Added value: +"Optional initial plain text content to insert"
      • removedInput schema / properties / content / title
        Removed value: -"Content"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / title / description
        Added value: +"Title of the new document"
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"User's Google email address"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_docArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_drive_file
    • Addedcreate_drive_folder
    • Removedcreate_event
    • Changedcreate_form13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / description / description
        Added value: +"The description of the form."
      • removedInput schema / properties / description / title
        Removed value: -"Description"
      • addedInput schema / properties / document_title / description
        Added value: +"The document title (shown in browser tab)."
      • removedInput schema / properties / document_title / title
        Removed value: -"Document Title"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / title / description
        Added value: +"The title of the form."
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_formArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_presentation
    • Addedcreate_reaction
    • Addedcreate_script_project
    • Changedcreate_sheet13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / insert_sheet_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / sheet_name / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / sheet_name / default
        Added value: +null
      • removedInput schema / properties / sheet_name / title
        Removed value: -"Sheet Name"
      • removedInput schema / properties / sheet_name / type
        Removed value: -"string"
      • addedInput schema / properties / source_sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id",
        -  "sheet_name"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"create_sheetArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedcreate_spreadsheet11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / sheet_names / description
        Added value: +"List of sheet names to create. If not provided, creates one sheet with default name."
      • removedInput schema / properties / sheet_names / title
        Removed value: -"Sheet Names"
      • addedInput schema / properties / title / description
        Added value: +"The title of the new spreadsheet. Required."
      • removedInput schema / properties / title / title
        Removed value: -"Title"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "title"
        -]New value: +[
        +  "user_google_email",
        +  "title"
        +]
      • removedInput schema / title
        Removed value: -"create_spreadsheetArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedcreate_table_with_data
    • Addedcreate_version
    • Addeddebug_docs_runtime_info
    • Addeddebug_table_structure
    • Removeddelete_event
    • Addeddelete_script_project
    • Addeddownload_chat_attachment
    • Changeddraft_gmail_message21 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / attachments
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional list of attachments. Each can have: 'url' (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR 'path' (file path, auto-encodes), OR 'content' (standard base64, not urlsafe) + 'filename'. Optional 'mime_type'. Optional 'content_id' (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment."
        +}
      • addedInput schema / properties / bcc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional BCC email address."
        +}
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "plain",
        +  "description": "Email body format. Use 'plain' for plaintext or 'html' for HTML content.",
        +  "enum": [
        +    "plain",
        +    "html"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / cc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional CC email address."
        +}
      • addedInput schema / properties / from_email
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email."
        +}
      • addedInput schema / properties / from_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'."
        +}
      • addedInput schema / properties / in_reply_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."
        +}
      • addedInput schema / properties / include_signature
        Added value: +{
        +  "default": true,
        +  "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / quote_original
        Added value: +{
        +  "default": false,
        +  "description": "Whether to include the original message as a quoted reply. Requires thread_id. Defaults to false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / references
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional chain of Message-IDs for proper threading."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • addedInput schema / properties / thread_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional Gmail thread ID to reply within."
        +}
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required for authentication."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "subject",
        -  "body"
        -]New value: +[
        +  "user_google_email",
        +  "subject",
        +  "body"
        +]
      • removedInput schema / title
        Removed value: -"draft_gmail_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedexport_doc_to_pdf
    • Addedfind_and_replace_doc
    • Addedformat_sheet_range
    • Addedgenerate_trigger_code
    • Addedget_contact
    • Addedget_contact_group
    • Addedget_doc_as_markdown
    • Changedget_doc_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / docs_service
        Removed value: -{
        -  "title": "docs_service",
        -  "type": "string"
        -}
      • addedInput schema / properties / document_id / description
        Added value: +"ID of the Google Doc (or full URL)"
      • removedInput schema / properties / document_id / title
        Removed value: -"Document Id"
      • removedInput schema / properties / drive_service
        Removed value: -{
        -  "title": "drive_service",
        -  "type": "string"
        -}
      • addedInput schema / properties / suggestions_view_mode
        Added value: +{
        +  "default": "DEFAULT_FOR_CURRENT_ACCESS",
        +  "description": "How to render suggestions in the returned content:\n- \"DEFAULT_FOR_CURRENT_ACCESS\": Default based on user's access level\n- \"SUGGESTIONS_INLINE\": Suggested changes appear inline in the document\n- \"PREVIEW_SUGGESTIONS_ACCEPTED\": Preview as if all suggestions were accepted\n- \"PREVIEW_WITHOUT_SUGGESTIONS\": Preview as if all suggestions were rejected",
        +  "type": "string"
        +}
      • addedInput schema / properties / user_google_email / description
        Added value: +"User's Google email address"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "drive_service",
        -  "docs_service",
        -  "user_google_email",
        -  "document_id"
        -]New value: +[
        +  "user_google_email",
        +  "document_id"
        +]
      • removedInput schema / title
        Removed value: -"get_doc_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_drive_file_content9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / file_id / description
        Added value: +"Drive file ID."
      • removedInput schema / properties / file_id / title
        Removed value: -"File Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user’s Google email address."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "file_id"
        -]New value: +[
        +  "user_google_email",
        +  "file_id"
        +]
      • removedInput schema / title
        Removed value: -"get_drive_file_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_drive_file_download_url
    • Addedget_drive_file_permissions
    • Addedget_drive_shareable_link
    • Changedget_events19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / calendar_id / description
        Added value: +"The ID of the calendar to query. Use 'primary' for the user's primary calendar. Defaults to 'primary'. Calendar IDs can be obtained using `list_calendars`."
      • removedInput schema / properties / calendar_id / title
        Removed value: -"Calendar Id"
      • addedInput schema / properties / detailed
        Added value: +{
        +  "default": false,
        +  "description": "Whether to return detailed event information including description, location, colour (colorId), attendees, and attendee details (response status, organizer, optional flags). Recurring instances also report the parent series ID needed to edit the whole series, and events that are not ordinary confirmed meetings report their event type (outOfOffice, workingLocation, focusTime) and status. Defaults to False.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / event_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The ID of a specific event to retrieve. If provided, retrieves only this event and ignores time filtering parameters."
        +}
      • addedInput schema / properties / include_attachments
        Added value: +{
        +  "default": false,
        +  "description": "Whether to include attachment information in detailed event output. When True, shows attachment details (fileId, fileUrl, mimeType, title) for events that have attachments. Only applies when detailed=True. Set this to True when you need to view or access files that have been attached to calendar events, such as meeting documents, presentations, or other shared files. Defaults to False.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / max_results / description
        Added value: +"The maximum number of events to return. Defaults to 25. Ignored if event_id is provided."
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • addedInput schema / properties / query
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "A keyword to search for within event fields (summary, description, location). Ignored if event_id is provided."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / time_max / description
        Added value: +"The end of the time range (exclusive) in RFC3339 format. If omitted, events starting from `time_min` onwards are considered (up to `max_results`). Ignored if event_id is provided."
      • removedInput schema / properties / time_max / title
        Removed value: -"Time Max"
      • addedInput schema / properties / time_min / description
        Added value: +"The start of the time range (inclusive) in RFC3339 format (e.g., '2024-05-12T10:00:00Z' or '2024-05-12'). If omitted, defaults to the current time. Ignored if event_id is provided."
      • removedInput schema / properties / time_min / title
        Removed value: -"Time Min"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_eventsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_form9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form to retrieve."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"get_formArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_form_response11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / response_id / description
        Added value: +"The ID of the response to retrieve."
      • removedInput schema / properties / response_id / title
        Removed value: -"Response Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id",
        -  "response_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id",
        +  "response_id"
        +]
      • removedInput schema / title
        Removed value: -"get_form_responseArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_gmail_attachment_content
    • Changedget_gmail_message_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "text",
        +  "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.",
        +  "enum": [
        +    "text",
        +    "html",
        +    "raw"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / full
        Added value: +{
        +  "default": false,
        +  "description": "When True, return the COMPLETE untruncated message: saved to local storage and referenced by download URL/file path instead of the body text, or inlined in the response when the server has no file storage (stateless mode). Use for messages large enough to hit the truncation limit, or when byte-exact fidelity is needed (pair with body_format='raw' for a .eml export).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / message_id / description
        Added value: +"The unique ID of the Gmail message to retrieve."
      • removedInput schema / properties / message_id / title
        Removed value: -"Message Id"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "message_id",
        -  "user_google_email"
        -]New value: +[
        +  "message_id",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_message_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_gmail_messages_content_batch12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "text",
        +  "description": "Body output format (only applies when format='full'). 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches the full raw MIME message and returns the base64url-decoded content.",
        +  "enum": [
        +    "text",
        +    "html",
        +    "raw"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / format / description
        Added value: +"Message format. \"full\" includes body, \"metadata\" only headers."
      • removedInput schema / properties / format / title
        Removed value: -"Format"
      • addedInput schema / properties / message_ids / description
        Added value: +"List of Gmail message IDs to retrieve (max 25 per batch)."
      • removedInput schema / properties / message_ids / title
        Removed value: -"Message Ids"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "message_ids",
        -  "user_google_email"
        -]New value: +[
        +  "message_ids",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_messages_content_batchArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedget_gmail_thread_content11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "text",
        +  "description": "Body output format. 'text' (default) returns plaintext (HTML converted to text as fallback). 'html' returns the raw HTML body as-is without conversion. 'raw' fetches each message's full raw MIME content and returns the base64url-decoded body.",
        +  "enum": [
        +    "text",
        +    "html",
        +    "raw"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / include_analysis
        Added value: +{
        +  "default": false,
        +  "description": "When True, the return value is a dict with both the formatted thread content AND structured ownership analysis (last sender, ball-in-court verdict, per-sender message counts, participants). Defaults to False, in which case the existing string return shape is preserved.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / thread_id / description
        Added value: +"The unique ID of the Gmail thread to retrieve."
      • removedInput schema / properties / thread_id / title
        Removed value: -"Thread Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "thread_id",
        -  "user_google_email"
        -]New value: +[
        +  "thread_id",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"get_gmail_thread_contentArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_gmail_threads_content_batch
    • Changedget_messages10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / message_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional filter string using the Chat API filter syntax.\n            Supports createTime and thread.name.\n            Examples:\n              'createTime > \"2026-03-18T00:00:00-03:00\"'\n              'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'\n              'thread.name = spaces/X/threads/Y'"
        +}
      • removedInput schema / properties / order_by / title
        Removed value: -"Order By"
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "space_id"
        -]New value: +[
        +  "user_google_email",
        +  "space_id"
        +]
      • removedInput schema / title
        Removed value: -"get_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_page
    • Addedget_page_thumbnail
    • Addedget_presentation
    • Addedget_script_content
    • Addedget_script_metrics
    • Addedget_script_project
    • Addedget_search_engine_info
    • Changedget_spreadsheet_info9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet to get info for. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"get_spreadsheet_infoArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedget_task
    • Addedget_task_list
    • Addedget_version
    • Addedimport_to_google_doc
    • Addedimport_to_google_sheets
    • Addedimport_to_google_slides
    • Addedinsert_doc_elements
    • Addedinsert_doc_image
    • Addedinspect_doc_structure
    • Changedlist_calendars7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_calendarsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_contact_groups
    • Addedlist_contacts
    • Addedlist_deployments
    • Changedlist_docs_in_folder8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / folder_id / title
        Removed value: -"Folder Id"
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_docs_in_folderArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_document_comments
    • Addedlist_drive_items
    • Changedlist_form_responses13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of responses to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token / description
        Added value: +"Token for retrieving next page of results."
      • removedInput schema / properties / page_token / title
        Removed value: -"Page Token"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"list_form_responsesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_gmail_filters
    • Changedlist_gmail_labels7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_gmail_labelsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_presentation_comments
    • Addedlist_script_processes
    • Addedlist_script_projects
    • Addedlist_sheet_tables
    • Changedlist_spaces8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_type / title
        Removed value: -"Space Type"
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_spacesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_spreadsheet_comments
    • Changedlist_spreadsheets9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_results / description
        Added value: +"Maximum number of spreadsheets to return. Defaults to 25."
      • removedInput schema / properties / max_results / title
        Removed value: -"Max Results"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"list_spreadsheetsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedlist_task_lists
    • Addedlist_tasks
    • Addedlist_versions
    • Addedmanage_conditional_formatting
    • Addedmanage_contact
    • Addedmanage_contact_group
    • Addedmanage_contacts_batch
    • Addedmanage_deployment
    • Addedmanage_doc_tab
    • Addedmanage_document_comment
    • Addedmanage_drive_access
    • Addedmanage_event
    • Addedmanage_focus_time
    • Addedmanage_gmail_filter
    • Changedmanage_gmail_label17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / action / description
        Added value: +"Action to perform on the label."
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / label_id / description
        Added value: +"Label ID. Required for update and delete operations."
      • removedInput schema / properties / label_id / title
        Removed value: -"Label Id"
      • addedInput schema / properties / label_list_visibility / description
        Added value: +"Whether the label is shown in the label list."
      • removedInput schema / properties / label_list_visibility / title
        Removed value: -"Label List Visibility"
      • addedInput schema / properties / message_list_visibility / description
        Added value: +"Whether the label is shown in the message list."
      • removedInput schema / properties / message_list_visibility / title
        Removed value: -"Message List Visibility"
      • addedInput schema / properties / name / description
        Added value: +"Label name. Required for create, optional for update."
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "action"
        -]New value: +[
        +  "user_google_email",
        +  "action"
        +]
      • removedInput schema / title
        Removed value: -"manage_gmail_labelArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedmanage_out_of_office
    • Addedmanage_presentation_comment
    • Addedmanage_spreadsheet_comment
    • Addedmanage_task
    • Addedmanage_task_list
    • Addedmodify_doc_text
    • Removedmodify_event
    • Changedmodify_gmail_message_labels17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / add_label_ids / description
        Added value: +"List of label IDs to add to the message."
      • addedInput schema / properties / add_label_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / add_label_ids / title
        Removed value: -"Add Label Ids"
      • addedInput schema / properties / add_label_ids / type
        Added value: +"array"
      • addedInput schema / properties / message_id / description
        Added value: +"The ID of the message to modify."
      • removedInput schema / properties / message_id / title
        Removed value: -"Message Id"
      • addedInput schema / properties / remove_label_ids / description
        Added value: +"List of label IDs to remove from the message."
      • addedInput schema / properties / remove_label_ids / items
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / remove_label_ids / title
        Removed value: -"Remove Label Ids"
      • addedInput schema / properties / remove_label_ids / type
        Added value: +"array"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "message_id"
        -]New value: +[
        +  "user_google_email",
        +  "message_id"
        +]
      • removedInput schema / title
        Removed value: -"modify_gmail_message_labelsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedmodify_sheet_values18 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / clear_values / description
        Added value: +"If True, clears the range instead of writing values. Defaults to False."
      • removedInput schema / properties / clear_values / title
        Removed value: -"Clear Values"
      • addedInput schema / properties / range_name / description
        Added value: +"The range to modify (e.g., \"Sheet1!A1:D10\", \"A1:D10\"). Required."
      • removedInput schema / properties / range_name / title
        Removed value: -"Range Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • addedInput schema / properties / value_input_option / description
        Added value: +"How to interpret input values (\"RAW\" or \"USER_ENTERED\"). Defaults to \"USER_ENTERED\"."
      • removedInput schema / properties / value_input_option / title
        Removed value: -"Value Input Option"
      • changedInput schema / properties / values / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / values / description
        Added value: +"2D array of values to write/update. Can be a JSON string or Python list. Required unless clear_values=True."
      • removedInput schema / properties / values / title
        Removed value: -"Values"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id",
        -  "range_name"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id",
        +  "range_name"
        +]
      • removedInput schema / title
        Removed value: -"modify_sheet_valuesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedmove_sheet_rows
    • Addedquery_freebusy
    • Changedread_sheet_values14 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / include_formulas
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch raw formula strings for cells that\ncontain formulas. Useful for identifying cross-sheet references before writing\nback to a range. Defaults to False to avoid an extra API request.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_hyperlinks
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch hyperlink metadata for the range.\nDefaults to False to avoid expensive includeGridData requests.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_notes
        Added value: +{
        +  "default": false,
        +  "description": "If True, also fetch cell notes for the range.\nDefaults to False to avoid expensive includeGridData requests.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / range_name / description
        Added value: +"The range to read (e.g., \"Sheet1!A1:D10\", \"A1:D10\").\nDefaults to \"A1:Z1000\". Open-ended or oversized ranges are clamped to\nat most 1000 rows before the Sheets API request to bound memory use."
      • removedInput schema / properties / range_name / title
        Removed value: -"Range Name"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / spreadsheet_id / description
        Added value: +"The ID of the spreadsheet. Required."
      • removedInput schema / properties / spreadsheet_id / title
        Removed value: -"Spreadsheet Id"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "spreadsheet_id"
        -]New value: +[
        +  "user_google_email",
        +  "spreadsheet_id"
        +]
      • removedInput schema / title
        Removed value: -"read_sheet_valuesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedresize_sheet_dimensions
    • Addedrun_script_function
    • Addedsearch_contacts
    • Addedsearch_custom
    • Changedsearch_docs8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email",
        +  "query"
        +]
      • removedInput schema / title
        Removed value: -"search_docsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_drive_files22 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / corpora / description
        Added value: +"Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').\n                     If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.\n                     Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency."
      • removedInput schema / properties / corpora / title
        Removed value: -"Corpora"
      • addedInput schema / properties / detailed
        Added value: +{
        +  "default": true,
        +  "description": "Whether to include size, modified time, and link in results. Defaults to True.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / drive_id / description
        Added value: +"ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`."
      • removedInput schema / properties / drive_id / title
        Removed value: -"Drive Id"
      • addedInput schema / properties / file_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Restrict results to a specific file type. Accepts a friendly\n                       name ('folder', 'document'/'doc', 'spreadsheet'/'sheet',\n                       'presentation'/'slides', 'form', 'drawing', 'pdf', 'shortcut',\n                       'script', 'site', 'jam'/'jamboard') or any raw MIME type\n                       string (e.g. 'application/pdf'). Defaults to None (all types)."
        +}
      • addedInput schema / properties / include_items_from_all_drives / description
        Added value: +"Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`."
      • removedInput schema / properties / include_items_from_all_drives / title
        Removed value: -"Include Items From All Drives"
      • addedInput schema / properties / include_trashed
        Added value: +{
        +  "default": false,
        +  "description": "Whether to include files in the trash. Defaults to False, matching\n                    the Drive web UI and `list_drive_items`. Ignored when `query` already\n                    contains its own `trashed` clause (`=` or `!=`), which always wins.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / order_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Sort order. Comma-separated list of sort keys with optional 'desc' modifier.\n                      Valid keys: 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime',\n                      'name', 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime',\n                      'starred', 'viewedByMeTime'. Example: 'modifiedTime desc' or 'folder,modifiedTime desc,name'.\n                      Defaults to None (Drive API default ordering)."
        +}
      • addedInput schema / properties / page_size / description
        Added value: +"The maximum number of files to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Page token from a previous response's nextPageToken to retrieve the next page of results."
        +}
      • addedInput schema / properties / query / description
        Added value: +"The search query string. Supports Google Drive search operators.\n         NOTE: Owner-based queries ('user@example.com' in owners) DO NOT WORK in Shared Drives\n         because files are owned by the shared drive itself, not individual users.\n         For recent files by a specific user in Shared Drives, search by modifiedTime\n         and use order_by='modifiedTime desc' instead."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email",
        +  "query"
        +]
      • removedInput schema / title
        Removed value: -"search_drive_filesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_gmail_messages12 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / page_size / description
        Added value: +"The maximum number of messages to return. Defaults to 10."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / page_token
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Token for retrieving the next page of results. Use the next_page_token from a previous response."
        +}
      • addedInput schema / properties / query / description
        Added value: +"The search query. Supports standard Gmail search operators."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "query",
        -  "user_google_email"
        -]New value: +[
        +  "query",
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"search_gmail_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsearch_messages17 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / max_spaces
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum number of spaces to search when space_id is not provided (default 10).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / page_size / description
        Added value: +"Maximum number of messages to return per space."
      • removedInput schema / properties / page_size / title
        Removed value: -"Page Size"
      • addedInput schema / properties / query / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / default
        Added value: +null
      • addedInput schema / properties / query / description
        Added value: +"Optional text to search for. If omitted, only time_filter is applied."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / query / type
        Removed value: -"string"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / space_id / description
        Added value: +"Optional space to restrict the search to."
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • addedInput schema / properties / time_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional filter using Chat API createTime syntax.\n         Examples:\n           'createTime > \"2026-03-18T00:00:00-03:00\"'\n           'createTime > \"2026-03-18T00:00:00-03:00\" AND createTime < \"2026-03-19T00:00:00-03:00\"'"
        +}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "query"
        -]New value: +[
        +  "user_google_email"
        +]
      • removedInput schema / title
        Removed value: -"search_messagesArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsend_gmail_message30 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / attachments
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional list of attachments. Each can have: \"url\" (fetch from URL — works with MCP attachment URLs from get_drive_file_download_url / get_gmail_attachment_content), OR \"path\" (file path, auto-encodes), OR \"content\" (standard base64, not urlsafe) + \"filename\". Optional \"mime_type\". Optional \"content_id\" (string) makes the attachment inline-rendered: it lands in a multipart/related part with `Content-ID: <content_id>` and `Content-Disposition: inline`, and the HTML body can reference it via `<img src=\"cid:<content_id>\">` (RFC 2392). Without `content_id` the attachment is a regular multipart/mixed attachment. Example: [{\"url\": \"https://host/attachments/abc-123\", \"filename\": \"report.pdf\"}]"
        +}
      • addedInput schema / properties / bcc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional BCC email address."
        +}
      • addedInput schema / properties / body / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / default
        Added value: +null
      • changedInput schema / properties / body / description
        Previous value: -"Email body (plain text)."New value: +"Email body content (plain text or HTML). Required when sending. When forwarding, this is an optional note prepended above the quoted original."
      • removedInput schema / properties / body / title
        Removed value: -"Body"
      • removedInput schema / properties / body / type
        Removed value: -"string"
      • addedInput schema / properties / body_format
        Added value: +{
        +  "default": "plain",
        +  "description": "Format of the body content (and of the prepended note when forwarding). Use 'plain' for plaintext or 'html' for HTML content.",
        +  "enum": [
        +    "plain",
        +    "html"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / cc
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional CC email address."
        +}
      • addedInput schema / properties / forward_message_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Set to a Gmail message ID to forward that message instead of composing a new one. The original subject, body, and (optionally) attachments are carried over; 'body' becomes an optional note prepended to the forward."
        +}
      • addedInput schema / properties / from_email
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional 'Send As' alias email address. Must be configured in Gmail settings (Settings > Accounts > Send mail as). If not provided, uses the authenticated user's email."
        +}
      • addedInput schema / properties / from_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional sender display name (e.g., 'Peter Hartree'). If provided, the From header will be formatted as 'Name <email>'."
        +}
      • addedInput schema / properties / in_reply_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional RFC Message-ID of the message being replied to (e.g., '<message123@gmail.com>')."
        +}
      • addedInput schema / properties / include_forwarded_attachments
        Added value: +{
        +  "default": true,
        +  "description": "When forwarding, whether to include the original message's attachments. Ignored unless forward_message_id is set.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include_signature
        Added value: +{
        +  "default": true,
        +  "description": "Whether to append the Gmail signature from Settings > Signature when available. Defaults to true.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / references
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional chain of Message-IDs for proper threading."
        +}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / subject / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / subject / default
        Added value: +null
      • changedInput schema / properties / subject / description
        Previous value: -"Email subject."New value: +"Email subject. Required when sending; optional when forwarding (defaults to 'Fwd: <original subject>')."
      • removedInput schema / properties / subject / title
        Removed value: -"Subject"
      • removedInput schema / properties / subject / type
        Removed value: -"string"
      • addedInput schema / properties / thread_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional Gmail thread ID to reply within."
        +}
      • removedInput schema / properties / to / title
        Removed value: -"To"
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required for authentication."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "to",
        -  "subject",
        -  "body"
        -]New value: +[
        +  "user_google_email",
        +  "to"
        +]
      • removedInput schema / title
        Removed value: -"send_gmail_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedsend_message11 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / message_text / title
        Removed value: -"Message Text"
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • removedInput schema / properties / space_id / title
        Removed value: -"Space Id"
      • addedInput schema / properties / thread_key / description
        Added value: +"Reply in a thread by app-defined key (creates thread if not found)."
      • removedInput schema / properties / thread_key / title
        Removed value: -"Thread Key"
      • addedInput schema / properties / thread_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Reply in an existing thread by its resource name (e.g. spaces/X/threads/Y)."
        +}
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "space_id",
        -  "message_text"
        -]New value: +[
        +  "user_google_email",
        +  "space_id",
        +  "message_text"
        +]
      • removedInput schema / title
        Removed value: -"send_messageArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedset_drive_file_permissions
    • Changedset_publish_settings13 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / form_id / description
        Added value: +"The ID of the form to update publish settings for."
      • removedInput schema / properties / form_id / title
        Removed value: -"Form Id"
      • addedInput schema / properties / is_accepting_responses
        Added value: +{
        +  "default": true,
        +  "description": "Whether the form accepts responses. Only takes effect when the form is published. Defaults to True.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / is_published
        Added value: +{
        +  "default": true,
        +  "description": "Whether the form is published and visible to responders. Defaults to True.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / publish_as_template
        Removed value: -{
        -  "default": false,
        -  "title": "Publish As Template",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / require_authentication
        Removed value: -{
        -  "default": false,
        -  "title": "Require Authentication",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / service
        Removed value: -{
        -  "title": "service",
        -  "type": "string"
        -}
      • addedInput schema / properties / user_google_email / description
        Added value: +"The user's Google email address. Required."
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "service",
        -  "user_google_email",
        -  "form_id"
        -]New value: +[
        +  "user_google_email",
        +  "form_id"
        +]
      • removedInput schema / title
        Removed value: -"set_publish_settingsArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Changedstart_google_auth8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / mcp_session_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Mcp Session Id"
        -}
      • removedInput schema / properties / service_name / title
        Removed value: -"Service Name"
      • addedInput schema / properties / user_google_email / default
        Added value: +null
      • removedInput schema / properties / user_google_email / title
        Removed value: -"User Google Email"
      • changedInput schema / required
        Previous value: -[
        -  "user_google_email",
        -  "service_name"
        -]New value: +[
        +  "service_name"
        +]
      • removedInput schema / title
        Removed value: -"start_google_authArguments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "type": "object",
        +  "x-fastmcp-wrap-result": true
        +}
    • Addedupdate_doc_headers_footers
    • Addedupdate_drive_file
    • Addedupdate_paragraph_style
    • Addedupdate_script_content
  4. 36 tool updatesv1.0.0
    • First observedcreate_doc
    • First observedcreate_event
    • First observedcreate_form
    • First observedcreate_sheet
    • First observedcreate_spreadsheet
    • First observeddelete_event
    • First observeddraft_gmail_message
    • First observedget_doc_content
    • First observedget_drive_file_content
    • First observedget_events
    • First observedget_form
    • First observedget_form_response
    • First observedget_gmail_message_content
    • First observedget_gmail_messages_content_batch
    • First observedget_gmail_thread_content
    • First observedget_messages
    • First observedget_spreadsheet_info
    • First observedlist_calendars
    • First observedlist_docs_in_folder
    • First observedlist_form_responses
    • First observedlist_gmail_labels
    • First observedlist_spaces
    • First observedlist_spreadsheets
    • First observedmanage_gmail_label
    • First observedmodify_event
    • First observedmodify_gmail_message_labels
    • First observedmodify_sheet_values
    • First observedread_sheet_values
    • First observedsearch_docs
    • First observedsearch_drive_files
    • First observedsearch_gmail_messages
    • First observedsearch_messages
    • First observedsend_gmail_message
    • First observedsend_message
    • First observedset_publish_settings
    • First observedstart_google_auth

TDQS

B3.2/5.0
Disambiguation3/5

While tools are mostly grouped by service (Gmail, Drive, Docs), there is significant overlap within services. For example, get_drive_file_content, get_drive_file_download_url, and get_doc_content all retrieve file content in slightly different ways; similarly, manage_drive_access, set_drive_file_permissions, and share_drive_file overlap in permission management. This can confuse agents about which tool to use.

Naming Consistency4/5

Tool names predominantly follow a clear verb_noun pattern (get_, list_, create_, update_, manage_, search_, send_), which is consistent across services. A few exceptions like debug_docs_runtime_info, inspect_doc_structure, and start_google_auth deviate from this pattern, but they are minor and still readable.

Tool Count2/5

With 122 tools covering multiple Workspace services, the count is extremely high for an MCP server. While it aims to be a comprehensive Workspace integration, the sheer number makes the tool surface unwieldy and harder for agents to navigate. Typically, a server with this breadth would be split into smaller service-specific servers.

Completeness4/5

The server provides extensive coverage across Gmail, Drive, Calendar, Docs, Sheets, Chat, Forms, Slides, Tasks, Contacts, Apps Script, and Custom Search. It includes CRUD operations, search, batch processing, and comments. Minor gaps exist (e.g., Gmail vacation responder, Calendar sharing), but overall the surface is very complete for the stated scope.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

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/taylorwilsdon/google_workspace_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server