Skip to main content
Glama
dipseth

google-workspace-unlimited

🚀 Plataforma Google Workspace de GoogleUnlimited

docs pypi license privacy terms

google_workspace_fastmcp2 MCP server

GoogleUnlimited es un framework MCP integral que proporciona una integración perfecta con Google Workspace mediante una arquitectura de middleware avanzada. Permite a los asistentes de IA y a los clientes MCP interactuar con los servicios de Gmail, Google Drive, Docs, Sheets, Slides, Calendar, Forms, Chat, Photos y Contacts (People API) mediante una API unificada y segura.

Lo que lo hace diferente:

  • ⚡ Code Mode por defecto — en lugar de inundar tu cliente con más de 90 esquemas de herramientas, el servidor expone 7 metaherramientas ligeras; la IA descubre las herramientas bajo demanda y encadena llamadas reales a la API dentro de un único bloque execute en espacio aislado

  • 🚀 Arranque sin configuración — el servidor se ejecuta inmediatamente sin archivo .env; OAuth se realiza de forma diferida en el primer uso

  • 🔧 Control de herramientas por sesión — filtrado de servicios basado en URL y habilitación/deshabilitación con ámbito de sesión, de modo que cada cliente conectado ve exactamente las herramientas que necesita

  • 🎨 Sistema de DSL de plantillas y tarjetas — las macros de Jinja2 y una notación compacta de tarjetas convierten los datos brutos de la API en correos electrónicos enriquecidos, paneles y tarjetas de Google Chat

  • 🧠 Memoria semántica — cada respuesta de herramienta se incrusta en Qdrant y se puede buscar posteriormente con lenguaje natural

📋 Tabla de contenidos

Related MCP server: mcp-google-workspace

⚡ Instrucciones de instalación rápida

¿Qué es GoogleUnlimited?

GoogleUnlimited proporciona a los asistentes de IA acceso a los servicios de Google Workspace a través del Model Context Protocol (MCP). Admite más de 92 herramientas en 9 servicios de Google, lo que permite una integración perfecta entre los flujos de trabajo de IA y las aplicaciones de Google Workspace con mejoras de rendimiento revolucionarias.

🛠️ Métodos de instalación

Método 1: Instalación rápida mediante uvx (recomendado)

La forma más rápida de empezar: instala directamente desde PyPI:

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

⚡ ¡Eso es todo! El servidor se ejecuta en modo stdio por defecto, perfecto para clientes MCP como Claude Desktop, Cursor, Roo, etc. Code Mode está activado de serie, por lo que tu cliente ve 7 metaherramientas ligeras en lugar de más de 90 esquemas.

Método 1b: Plugin de Claude Code (servidor + habilidades)

Los usuarios de Claude Code pueden instalar el servidor y las habilidades que enseñan a Claude su DSL de tarjetas/correos, Code Mode y la búsqueda en Qdrant con dos comandos:

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

Consulta plugins/google-workspace-unlimited para más detalles.

Método 2: Clonación y configuración de desarrollo

Para desarrollo o personalización:

  1. Clona y configura:

    git clone https://github.com/dipseth/google_workspace_fastmcp2.git
    cd google_workspace_fastmcp2
    uv sync
  2. Inicia el servidor:

    uv run python server.py

    El servidor se inicia inmediatamente sin necesidad de configuración. No se necesitan credenciales OAuth al arrancar: la autenticación se gestiona de forma diferida cuando interactúas por primera vez con un servicio de Google.

  3. Autentícate cuando estés listo:

    Cuando llames a cualquier herramienta de Google Workspace, el servidor te pedirá que te autentiques mediante la herramienta start_google_auth. Esto abre un flujo OAuth basado en navegador. Una vez completado, las credenciales se almacenan localmente y se reutilizan entre sesiones.

    Para preconfigurar las credenciales OAuth (opcional), crea un archivo .env:

    cp .env.example .env

    Luego añade tus credenciales de Google Cloud Console:

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

    Consulta los pasos de configuración de Google Cloud Console para crear credenciales OAuth y habilitar las API.

📚 Recursos de configuración:

📋 Referencia de variables de entorno

Todas las variables de entorno son opcionales: el servidor se inicia con valores predeterminados sensatos y no requiere archivo .env. Las credenciales OAuth solo son necesarias al iniciar un nuevo flujo de autenticación mediante start_google_auth.

Google OAuth (necesario para la primera autenticación):

Variable

Default

Description

GOOGLE_CLIENT_ID

(empty)

ID de cliente OAuth 2.0 de Google Cloud Console

GOOGLE_CLIENT_SECRET

(empty)

Secreto de cliente OAuth 2.0

GOOGLE_CLIENT_SECRETS_FILE

(empty)

Alternativa: ruta al archivo JSON de OAuth descargado

OAUTH_REDIRECT_URI

http://localhost:8002/oauth2callback

Debe coincidir con el URI de redirección de Google Console

Proporciona o bien GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET o bien GOOGLE_CLIENT_SECRETS_FILE antes de tu primer flujo OAuth. Una vez autenticado, las credenciales se almacenan localmente y estas variables ya no son necesarias.

Servidor:

Variable

Default

Description

SERVER_HOST

localhost

Dirección de enlace del servidor

SERVER_PORT

8002

Puerto del servidor

ENABLE_HTTPS

false

Habilitar HTTPS/SSL

SSL_CERT_FILE

-

Ruta al certificado SSL (obligatorio si HTTPS está habilitado)

SSL_KEY_FILE

-

Ruta a la clave privada SSL (obligatorio si HTTPS está habilitado)

LOG_LEVEL

INFO

DEBUG, INFO, WARNING, ERROR

Seguridad y sesiones:

Variable

Default

Description

CREDENTIAL_STORAGE_MODE

FILE_ENCRYPTED

FILE_ENCRYPTED, FILE_PLAINTEXT, MEMORY_ONLY

CREDENTIALS_DIR

./credentials

Directorio para las credenciales almacenadas

MCP_API_KEY

(empty)

Clave API del servidor: también se usa para el cifrado de credenciales vinculado a criptografía (HKDF-SHA256) y la generación de claves por usuario

SESSION_TIMEOUT_MINUTES

60

Tiempo de espera de inactividad de la sesión

GMAIL_ALLOW_LIST

(empty)

Direcciones de correo electrónico de confianza separadas por comas

Gestión de herramientas:

Variable

Default

Description

MINIMAL_TOOLS_STARTUP

true

Iniciar con solo 5 herramientas protegidas habilitadas

MINIMAL_STARTUP_SERVICES

(empty)

Servicios separados por comas para habilitar al inicio (p. ej., drive,gmail)

ENABLE_CODE_MODE

true

Code Mode (predeterminado): reemplaza el catálogo completo de herramientas por 7 metaherramientas + execute en espacio aislado; establece false para el catálogo clásico

ENABLE_SKILLS_PROVIDER

false

Habilita FastMCP SkillsDirectoryProvider para la generación dinámica de habilidades

SKILLS_DIRECTORY

~/.claude/skills

Directorio para los documentos de habilidades generados

RESPONSE_LIMIT_MAX_SIZE

500000

Tamaño máximo de respuesta de herramienta en bytes (0 = deshabilitado)

RESPONSE_LIMIT_TOOLS

(empty)

Nombres de herramientas a limitar separados por comas (vacío = todas)

Base de datos vectorial Qdrant:

Variable

Default

Description

QDRANT_URL

http://localhost:6333

URL de la base de datos vectorial Qdrant

QDRANT_KEY

NONE

Clave API de Qdrant (usa NONE para no autenticación)

QDRANT_AUTO_LAUNCH

true

Iniciar Qdrant automáticamente mediante Docker si no está accesible

QDRANT_DOCKER_IMAGE

qdrant/qdrant:latest

Imagen de Docker para el inicio automático

QDRANT_DOCKER_CONTAINER_NAME

mcp-qdrant

Nombre del contenedor para el Qdrant iniciado automáticamente

Otros:

Variable

Default

Description

MCP_CHAT_WEBHOOK

(empty)

URL de webhook predeterminada para las herramientas de tarjetas de Google Chat

FASTMCP_CLOUD

false

Habilita el modo de despliegue en la nube (cambia automáticamente al almacenamiento MEMORY_WITH_BACKUP)

🔗 Conexiones de clientes

GoogleUnlimited admite múltiples métodos de conexión. Estas son las dos formas más populares de empezar:

🎯 Opciones de Configuración Rápida

Opción 1: Cursor IDE (STDIO - Verificado por la Comunidad ✅):

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

Opción 2: HTTP Streamable (VS Code Roo, Claude Code, Claude Desktop, etc.):

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

Configuración básica de conexión única:

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

Configuración multi-conexión — conecta el mismo cliente (o varios clientes) al mismo servidor con diferentes conjuntos de herramientas usando parámetros de consulta en la URL:

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

Cada conexión obtiene su propia sesión aislada con solo las herramientas de servicio solicitadas habilitadas. También puedes fijar un ID de sesión con ?uuid= para reanudar el mismo estado de sesión entre reconexiones:

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

Consulta Filtrado de Servicios por URL para ver la lista completa de parámetros de consulta.

🤖 Claude Code y Claude Desktop

Claude Code (CLI) — un solo comando, usando el paquete PyPI publicado:

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

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

Claude Desktop (ruta de desarrollo local) — añade a claude_desktop_config.json (Configuración → Desarrollador → Editar Config):

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

Claude.ai / Claude Desktop (conector alojado) — ejecuta el servidor detrás de un endpoint HTTPS público (por ejemplo, un túnel de Cloudflare o ngrok), luego añádelo en Configuración → Conectores → Añadir conector personalizado con tu URL https://your-domain/mcp. El flujo OAuth 2.1 + PKCE del servidor gestiona la autenticación, incluida la redirección https://claude.ai/api/mcp/auth_callback. Consulta la Guía de Integración con Claude.ai para ver el tutorial completo.

📚 Guía Completa de Conexión

Para instrucciones detalladas de configuración, solución de problemas y configuraciones para todos los clientes compatibles, incluyendo:

  • Claude Code CLI (HTTP y STDIO)

  • Claude Desktop

  • VS Code / Roo / GitHub Copilot

  • Claude.ai con Cloudflare Tunnel

  • Y más...

🔗 Guía Completa de Conexión de Clientes - Instrucciones completas de configuración, solución de problemas y configuraciones avanzadas para todos los clientes de IA y entornos de desarrollo compatibles

⚡ Modo Código (Predeterminado)

El Modo Código es la función insignia de GoogleUnlimited — y está activado por defecto. En lugar de cargar más de 90 esquemas de herramientas por adelantado (costoso en tokens), tu cliente MCP ve solo 7 meta-herramientas. La IA descubre herramientas bajo demanda y luego encadena cualquier número de llamadas API reales dentro de un único bloque execute de Python en sandbox.

Meta-Herramienta

Propósito

tags

Explorar herramientas por categoría de servicio (Gmail, Drive, Calendar, etc.)

search

Búsqueda de palabras clave con BM25 en nombres y descripciones de herramientas

get_schema

Obtener esquemas de parámetros completos para las herramientas seleccionadas

semantic_search

Búsqueda en lenguaje natural sobre respuestas de herramientas almacenadas previamente (respaldada por Qdrant)

fetch_document

Recuperar una respuesta almacenada completa por ID de punto desde los resultados de búsqueda

tool_activity

Resumir patrones de uso recientes y actividad de herramientas

execute

Ejecutar un bloque de Python en sandbox que encadena llamadas reales a herramientas mediante await call_tool(name, params)

Por qué es importante:

  • 💰 Ahorro masivo de tokens — 7 esquemas en lugar de más de 90, con esquemas completos obtenidos solo para las herramientas realmente utilizadas

  • 🔗 Un solo viaje de ida y vuelta en lugar de muchos — buscar → filtrar → actuar ocurre dentro de un único bloque execute, no en una cadena de viajes de ida y vuelta del cliente

  • 🧰 Sandbox con todo incluido — más de 40 ayudantes integrados (now(), days_ago(), to_json(), re_find(), gather_tools(), …) cubren fechas, JSON, URLs, regex, matemáticas y llamadas por lotes sin necesidad de importaciones

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

¿Prefieres el catálogo clásico? Opta por no participar y cada herramienta se expone directamente al cliente:

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

El Modo Código y el catálogo clásico son mutuamente excluyentes — cuando el Modo Código está activo, las llamadas directas a herramientas se reemplazan por el patrón de búsqueda + execute. Las herramientas de descubrimiento siempre ven el catálogo completo, independientemente del filtrado a nivel de sesión.

🎯 Capacidades del Servicio

GoogleUnlimited admite 10 servicios de Google Workspace con más de 90 herramientas especializadas:

Servicio

Icono

Herramientas

Características Clave

Documentación

Gmail

📧

14

Enviar, responder, etiquetas, filtros, búsqueda, lista blanca

api-reference/gmail/

Drive

📁

9

Subir, descargar, compartir, documentos de Office, gestión de archivos

api-reference/drive/

Docs

📄

4

Crear, editar, formatear, operaciones por lotes

api-reference/docs/

Sheets

📊

7

Leer, escribir, fórmulas, formato

api-reference/sheets/

Slides

🎯

5

Presentaciones, plantillas, exportación

api-reference/slides/

Calendar

📅

9

Eventos, programación, asistentes, zonas horarias

api-reference/calendar/

Forms

📝

8

Creación, respuestas, validación, publicación

api-reference/forms/

Chat

💬

24

Mensajería, tarjetas, espacios, webhooks, tarjetas unificadas

api-reference/chat/

Photos

📷

12

Álbumes, subida, búsqueda, metadatos, búsqueda inteligente

api-reference/photos/

People

👤

4

Búsqueda nombre→correo (contactos + directorio de la organización), etiquetas de contacto

people/

📚 Recursos de Documentación de API:

🧠 Arquitectura de Middleware

GoogleUnlimited utiliza una arquitectura de middleware que proporciona integración de servicios sin fisuras, gestión inteligente de recursos y potentes capacidades de plantillas.

Arquitectura de Middleware

🔧 Componentes Centrales del Middleware

  • 🏷️ TagBasedResourceMiddleware: Descubrimiento inteligente de recursos mediante patrones URI (service://gmail/messages, user://current/email)

  • 🧠 QdrantUnifiedMiddleware: Búsqueda semántica impulsada por IA en todas las respuestas de herramientas con incrustaciones vectoriales

  • 🎨 TemplateMiddleware: Sistema avanzado de plantillas Jinja2 para un formato de salida hermoso y estructurado

✨ Beneficios de la Arquitectura

  • 🔄 Acceso Unificado a Recursos: Acceso basado en URI a los datos del servicio sin llamadas API

  • 🧠 Inteligencia Semántica: Búsqueda en lenguaje natural en todas las respuestas almacenadas

  • 🎨 Excelencia Visual: Formato de salida consistente y hermoso para un consumo óptimo por parte de la IA

  • 💰 Eficiencia de Tokens: Las macros de plantillas reducen el uso de tokens en un 60-80% mediante la representación estructurada de datos

  • ⚡ Rendimiento: 30 veces más rápido que los enfoques tradicionales gracias al almacenamiento en caché inteligente

📚 Recursos de Documentación del Middleware:

🚀 Inicio con Herramientas Mínimas

Por defecto, GoogleUnlimited se inicia con solo 5 herramientas protegidas habilitadas para un rendimiento y seguridad óptimos. Esto permite a los clientes habilitar solo las herramientas que necesitan.

Herramientas Protegidas (Siempre Disponibles):

  • manage_tools - Habilitar/deshabilitar herramientas globalmente o por sesión

  • manage_tools_by_analytics - Gestión de herramientas basada en análisis

  • health_check - Estado de salud del servidor y estado de configuración

  • start_google_auth - Iniciar autenticación OAuth

  • check_drive_auth - Verificar estado de autenticación

Configuración:

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

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

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

Habilitando Herramientas en Tiempo de Ejecución:

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

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

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

🔧 Gestión de Herramientas con Alcance de Sesión

GoogleUnlimited admite la funcionalidad de habilitar/deshabilitar herramientas por sesión, lo que permite que diferentes clientes MCP tengan diferente disponibilidad de herramientas sin afectar a otros clientes conectados.

Características Clave:

  • Aislamiento de Sesión: Deshabilita herramientas para una sesión de cliente sin afectar a otras

  • No Invasivo: Las operaciones con alcance de sesión nunca modifican el registro global de herramientas

  • Herramientas Protegidas: Las herramientas de gestión centrales (manage_tools, health_check, etc.) siempre permanecen disponibles

  • Basado en Middleware: Utiliza SessionToolFilteringMiddleware para el filtrado a nivel de protocolo

Ejemplos de Uso:

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

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

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

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

Estructura de Respuesta:

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

📚 Proveedor de Habilidades

Cuando se habilita con ENABLE_SKILLS_PROVIDER=true, GoogleUnlimited genera documentos de habilidades a partir de instancias de ModuleWrapper y los sirve a través del SkillsDirectoryProvider de FastMCP. Las habilidades proporcionan conocimiento estructurado que los LLM pueden consultar para tareas complejas de múltiples pasos.

Módulos actualmente compatibles:

  • card_framework → habilidad gchat-cards (referencia del DSL de tarjetas de Google Chat, jerarquía de componentes, ejemplos)

Configuración:

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

Las habilidades se regeneran automáticamente en cada inicio y están disponibles inmediatamente a través del sistema de habilidades de FastMCP.

🖥️ Panel de Gestión de Herramientas

GoogleUnlimited incluye un Panel de Gestión de Herramientas integrado que se sirve a través del esquema de recursos ui:// de las Apps MCP. Esto proporciona una interfaz visual para monitorear y gestionar la disponibilidad de herramientas entre sesiones.

Panel de Gestión de Herramientas

Características:

  • Vista de herramientas agrupadas por servicio — herramientas organizadas por servicio de Google (Gmail, Drive, Sheets, etc.) con contadores

  • Visibilidad del estado de sesión — ve qué herramientas están habilitadas, deshabilitadas o deshabilitadas por sesión de un vistazo

  • Chips de filtro — filtra rápidamente por servicio para enfocarte en las herramientas relevantes

  • Datos en vivo — impulsado por DashboardCacheMiddleware que almacena en caché los resultados de list-tool para acceso instantáneo al recurso ui://data-dashboard

El panel se conecta automáticamente a todas las herramientas de listado mediante wire_dashboard_to_list_tools() — sin necesidad de configuración por herramienta.

🔗 Filtrado de Servicios por URL (Transporte HTTP)

Cuando se usa transporte HTTP/SSE, puedes filtrar herramientas por servicio directamente mediante parámetros de consulta en la URL — sin necesidad de código:

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

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

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

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

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

Parámetros de URL Disponibles:

Parámetro

Ejemplo

Descripción

service o services

?service=gmail,drive

Lista de servicios separados por comas para habilitar

uuid

?uuid=abc123

Reanudar una sesión anterior por ID

minimal

?minimal=false

Anular el modo de inicio mínimo

Servicios disponibles: gmail, drive, calendar, docs, sheets, slides, photos, chat, forms, people

📚 Recursos de gestión de herramientas de sesión:

🎨 Sistema de plantillas

GoogleUnlimited incluye potentes macros de plantilla Jinja2 que transforman datos sin procesar de Google Workspace en formatos visualmente atractivos y optimizados para IA.

🎯 Macros de plantilla disponibles

Archivo de plantilla

Macro

Propósito

Características clave

email_card.j2

render_gmail_labels_chips()

Visualización de etiquetas de Gmail

Chips interactivos, recuentos de no leídos, enlaces directos a Gmail

calendar_dashboard.j2

render_calendar_dashboard()

Panel de calendario y eventos

Calendarios principales/compartidos, próximos eventos, tema oscuro

dynamic_macro.j2

render_calendar_events_dashboard()

Panel de eventos de calendario

Tarjetas de eventos, detalles de hora/ubicación, enlaces clicables, tema oscuro

document_templates.j2

generate_report_doc()

Informes profesionales

Métricas, tablas, gráficos, marca de la empresa

colorfuL_email.j2

render_beautiful_email3()

Correos electrónicos HTML enriquecidos

Múltiples firmas, degradados, diseño adaptable

💡 Ejemplos de macros de plantilla

Visualización de etiquetas de Gmail - Transforma listas de etiquetas en hermosos chips interactivos:

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

Panel de calendario - Crea vistas generales completas del calendario:

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

Panel de eventos de calendario - Transforma eventos de calendario en hermosas tarjetas de eventos interactivas:

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

Ejemplo de panel de eventos de calendario

Esta macro crea un impresionante panel con tema oscuro que incluye:

  • 📅 Tarjetas de eventos interactivas: Cada evento se muestra como una tarjeta clicable que se abre en Google Calendar

  • 🕐 Visualización inteligente de la hora: Formatea automáticamente eventos de día completo frente a eventos con hora, con soporte de zona horaria

  • 📍 Integración de ubicación: Muestra ubicaciones de reuniones y enlaces de reuniones virtuales

  • 👥 Información de asistentes: Muestra recuentos de asistentes y detalles de participantes

  • ✅ Indicadores de estado: Estado codificado por colores (confirmado, tentativo, cancelado) con retroalimentación visual

  • 📱 Diseño adaptable: Diseño optimizado para móviles con interacciones táctiles

  • 🎨 Estilo de tema oscuro: Apariencia profesional con fondos degradados y efectos de desplazamiento

Documentos profesionales - Genera informes con métricas y gráficos:

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

🔍 Descubrimiento de macros y creación dinámica

Explora todas las macros disponibles mediante el sistema de recursos de plantillas:

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

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

🎯 Creación dinámica de macros

Crea macros personalizadas en tiempo de ejecución con la herramienta create_template_macro:

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

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

Macros basadas en DSL — las macros dinámicas también pueden incorporar notación DSL de tarjetas de Google Chat para generar tarjetas enriquecidas y estructuradas. Los símbolos DSL definen el diseño de la tarjeta mientras que Jinja2 gestiona el contenido dinámico:

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

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

Welcome back, {{ username | title }}!

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

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

La línea DSL §[δ×3, ℊ[ǵ×4], §[δ×2, Ƀ[ᵬ×3]]] define la estructura de la tarjeta: una Sección con 3 widgets DecoratedText, una Cuadrícula con 4 elementos, y una Sección anidada con 2 widgets DecoratedText y una Lista de botones con 3 botones. La plantilla Jinja2 rellena el contenido dinámicamente — y como se guarda en templates/dynamic/, está disponible inmediatamente para send_dynamic_card y otras herramientas.

Características clave:

  • ⚡ Disponibilidad inmediata: Las macros están disponibles al instante después de su creación

  • 🎯 Integración de recursos: Disponibles automáticamente mediante template://macros/macro_name

  • 💾 Persistencia opcional: Guarda macros en disco para disponibilidad permanente

  • 🔄 Procesamiento de plantillas: Validación completa de sintaxis Jinja2 y gestión de errores

  • 💬 Integración DSL: Las macros pueden generar notación DSL de tarjetas para tarjetas enriquecidas de Google Chat

🚀 Uso en el mundo real

Las plantillas se pueden usar directamente en llamadas de herramientas para obtener resultados hermosos y estructurados:

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

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

📚 Recursos del sistema de plantillas:

🗂️ Descubrimiento de recursos

GoogleUnlimited proporciona un potente sistema de recursos MCP que permite un acceso a datos ultrarrápido sin llamadas a la API mediante patrones de URI inteligentes.

Descubrimiento de recursos

🎯 Patrones de URI de recursos

Patrón

Propósito

Ejemplo

Devuelve

user://profile/{email}

Estado de autenticación del usuario

user://profile/john@gmail.com

Perfil + estado de autenticación

service://{service}/lists

Listas de servicios disponibles

service://gmail/lists

[filtros, etiquetas]

service://{service}/{list_type}

Todos los elementos de la lista

service://gmail/labels

Todas las etiquetas de Gmail

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

Detalles de un elemento específico

service://gmail/labels/INBOX

Detalles de la etiqueta INBOX

recent://{service}

Elementos recientes

recent://drive

Archivos recientes de Drive

qdrant://search/{query}

Búsqueda semántica

qdrant://search/gmail errors

Respuestas relevantes

🏗️ Archivos de recursos clave

⚡ Acceso ultrarrápido

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

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

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

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

📚 Documentación del sistema de recursos:

🧪 Marco de pruebas

GoogleUnlimited incluye pruebas exhaustivas con pruebas de cliente que validan el uso de MCP exactamente como lo experimentaría un LLM, además de suites de pruebas adicionales. 559 pruebas superadas con una tasa de éxito del 100 %.

🎯 Enfoque de pruebas de cliente

Marco de pruebas

Las pruebas de cliente son el componente más importante: proporcionan pruebas deterministas de las operaciones MCP mediante integración de recursos reales y patrones estandarizados en las más de 92 herramientas y 9 servicios de Google. Estas pruebas validan tanto la autenticación explícita por correo electrónico como los patrones de inyección de middleware.

🚀 Comandos rápidos de prueba

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

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

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

🔬 Integración de ID de recursos reales

El marco de pruebas obtiene IDs reales de los recursos de servicios para realizar pruebas realistas:

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

🔄 Canal de CI/CD

Pruebas y publicación automatizadas mediante GitHub Actions:

  • Flujo de trabajo de CI: Se ejecuta en cada PR y push a main

    • Pruebas en matriz de Python 3.11 y 3.12

    • Linting con ruff check y formato con ruff format

    • Ejecución completa de la suite de pruebas

  • Publicación en TestPyPI: Publicación automatizada de paquetes para pruebas

📚 Recursos de pruebas:

🔒 Seguridad y autenticación

GoogleUnlimited implementa seguridad de nivel empresarial con OAuth 2.1 + PKCE, gestión avanzada de sesiones y capacidades de auditoría exhaustivas.

Arquitectura de seguridad

🛡️ Flujos de autenticación

  1. 🌐 OAuth de MCP Inspector: Cumple con la especificación MCP con registro dinámico de clientes

  2. 🖥️ OAuth directo del servidor: Autenticación basada en web para acceso directo

  3. 🔧 JWT de desarrollo: Modo de prueba con tokens generados

  4. 📁 Credenciales de archivo mejoradas: Almacenamiento persistente con opciones de cifrado

  5. 🔑 Clientes OAuth personalizados: Usa tus propias credenciales OAuth con respaldo automático

  6. 🪪 Claves de API por usuario: Claves individuales generadas al completar OAuth con aislamiento de credenciales

✨ Características de seguridad

  • 🔐 OAuth 2.1 + PKCE: Autenticación moderna con intercambio de clave de prueba (compatible con clientes públicos)

  • 🔑 Claves de API por usuario: Claves únicas y revocables por usuario con almacenamiento solo de hash y búsqueda segura en tiempo

  • 🛡️ Aislamiento de credenciales: Control de acceso basado en procedencia de autenticación que evita la herencia de credenciales entre usuarios

  • 🔗 Vinculación de cuentas: Vinculación bidireccional de cuentas para acceso multi-cuenta con clave por usuario

  • 🔒 Cifrado criptográfico: Claves de cifrado derivadas de HKDF-SHA256 vinculadas a MCP_API_KEY

  • 🔒 Aislamiento de sesiones: Soporte multi-tenant que evita fugas de datos

  • 🏷️ Más de 27 ámbitos de API: Gestión granular de permisos en todos los servicios

  • 📊 Registro de auditoría: Seguimiento completo de eventos de seguridad con procedencia de autenticación

  • 🔐 Cifrado AES-256: Almacenamiento de credenciales con soporte de migración de claves heredadas

  • 🔄 Respaldo de tres niveles: Persistencia robusta de credenciales entre reinicios del servidor (State Map → UnifiedSession → Context Storage)

  • 🧹 Eliminación de datos sensibles: Los metadatos de autenticación se eliminan de los embeddings de Qdrant antes del almacenamiento

⚙️ Configuración de seguridad

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

📚 Recursos de documentación de seguridad:


🚀 ¿Listo para revolucionar tu integración con Google Workspace?

📚 Documentación • 🔧 Configuración • 🎯 Referencia de API • 🧪 Pruebas

Available Tools

7 tools
executeExecuteA

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

SANDBOX RESTRICTIONS — these produce SandboxError, avoid them:

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

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

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

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

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

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

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

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

  • parse_date(iso_str) → normalized ISO datetime

  • timestamp() → current unix timestamp (int)

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

  • from_json(s) → parsed object

  • url_encode(s) → URL-encoded string

  • url_decode(s) → URL-decoded string

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

  • query_string(params) → URL query string from dict

  • re_find(pattern, text) → list of matches

  • re_match(pattern, text) → bool

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

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

  • dedent(text) → remove common leading whitespace

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

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

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

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

  • html_escape(s) → HTML-safe string

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

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

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

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

  • flatten(lists) → flat list from nested lists

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

  • chunk(items, size) → list of chunks

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

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

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

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

  • sleep(seconds) → async sleep

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

TDQS

A5/5.0
Behavior5/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters5/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

fetch_documentFetch DocumentA

Preview one stored tool response by its Qdrant point ID.

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

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

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

TDQS

A4.7/5.0
Behavior5/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

get_schemaGet SchemaA

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

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

TDQS

A4.5/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

tagsTagsA

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

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

TDQS

A4.9/5.0
Behavior5/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters4/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

tool_activityTool ActivityA

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

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

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

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

TDQS

A4.5/5.0
Behavior4/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters3/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

Tool Schema Changelog

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

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

TDQS

A4.4/5.0

Scored across 7 tools

Disambiguation4/5

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

Naming Consistency3/5

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

Tool Count5/5

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

Completeness4/5

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

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers