GroundEffect

Indexación hiperrápida y local de Gmail y Google Calendar para Claude Code, disponible como Skill o MCP Server.

Documentación

GroundEffect

Indexación local y ultrarrápida de Gmail y Google Calendar para Claude Code.

GroundEffect es un cliente IMAP/CalDAV local sin interfaz gráfica, una habilidad de Claude Code y un servidor MCP construido en Rust con LanceDB.

Características

  • Búsqueda híbrida: BM25 de texto completo + búsqueda semántica vectorial con fusión de rango recíproco (Reciprocal Rank Fusion)
  • Embeddings locales: Ejecuta nomic-embed-text-v1.5 localmente mediante Candle con aceleración Metal
  • Multi-cuenta: Conecta cuentas ilimitadas de Gmail/GCal con sincronización independiente
  • Integración MCP: Expone herramientas de correo y calendario directamente a Claude Code
  • Sincronización en tiempo real: IMAP IDLE para notificaciones instantáneas de correo, sondeo CalDAV para calendario
  • Extracción de texto HTML: Convierte automáticamente correos HTML a texto plano limpio usando html2text
  • Almacenamiento de tokens conectable: Basado en archivos (predeterminado) o PostgreSQL con cifrado AES-256-GCM

Inicio rápido

1. Instalar

brew tap jamiequint/groundeffect
brew install groundeffect

Esto automáticamente:

  • Instala el daemon (se inicia al iniciar sesión)
  • Instala la habilidad de Claude Code
  • Añade permisos para ejecutar comandos de groundeffect

2. Configurar OAuth

Crea un proyecto de Google Cloud con credenciales OAuth:

  1. Ve a Google Cloud Console
  2. Crea un proyecto y habilita Gmail API y Google Calendar API
  3. Ve a APIs & Services > Credenciales
  4. Crea ID de cliente OAuth (tipo de aplicación de escritorio)
  5. Añade tus credenciales:
echo 'export GROUNDEFFECT_GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"' >> ~/.zshrc
echo 'export GROUNDEFFECT_GOOGLE_CLIENT_SECRET="your-client-secret"' >> ~/.zshrc
source ~/.zshrc

3. Añadir una cuenta

groundeffect account add

Esto abre un navegador para OAuth de Google. Después de la autenticación, el daemon se sincroniza automáticamente.

¡Eso es todo! Pide a Claude Code que busque en tus correos y calendario.

Referencia de CLI

Todos los comandos generan JSON por defecto. Añade --human para una salida legible.

Comandos de cuenta

ComandoDescripción
account listListar todas las cuentas conectadas
account show <account>Mostrar detalles de la cuenta y estado de sincronización
account addAñadir nueva cuenta de Google mediante OAuth
account reauth <account>Reautenticar una cuenta existente mediante OAuth
account delete <account>Eliminar cuenta y todos los datos sincronizados
account configure <account>Actualizar configuración de la cuenta (alias, adjuntos)

Parámetros para add:

ParámetroDescripciónPredeterminado
--yearsAños de historial de correo a sincronizar (1-20 o "all")1
--attachmentsHabilitar descarga automática de adjuntosoff
--aliasNombre amigable para la cuenta-

Comandos de correo

ComandoDescripción
email search <query>Búsqueda híbrida BM25 + semántica
email listListar correos recientes
email show <id>Mostrar contenido completo del correo
email thread <thread_id>Mostrar todos los correos en un hilo
email sendRedactar y enviar correo
email attachment <id>Obtener contenido de adjuntos
email foldersListar carpetas IMAP

Parámetros para search:

ParámetroDescripciónPredeterminado
--accountFiltrar a cuenta específicaall
--limitMáximo de resultados (máx: 100)10
--fromFiltrar por remitente-
--toFiltrar por destinatario-
--date-fromFiltrar después de fecha (YYYY-MM-DD)-
--date-toFiltrar antes de fecha (YYYY-MM-DD)-
--has-attachmentFiltrar correos con adjuntos-

Parámetros para send:

ParámetroDescripción
--fromCuenta desde la que enviar (obligatorio)
--toDestinatario(s) (obligatorio)
--subjectAsunto del correo (obligatorio)
--bodyCuerpo del correo (obligatorio)
--ccDestinatarios en CC
--bccDestinatarios en CCO
--reply-toID del correo al que responder (para hilos)
--htmlForzar formato HTML (auto-detectado desde markdown/URLs)
--save-as-draftGuardar como borrador en lugar de enviar
--confirmEnviar inmediatamente (sin: solo vista previa)

Comandos de borradores

ComandoDescripción
email draft createCrear un nuevo borrador de correo
email draft listListar todos los borradores de una cuenta
email draft show <id>Mostrar contenido completo del borrador
email draft update <id>Actualizar un borrador existente
email draft send <id>Enviar un borrador
email draft delete <id>Eliminar un borrador

Parámetros para draft create:

ParámetroDescripción
--fromCuenta en la que crear el borrador (obligatorio)
--toDestinatario(s)
--subjectAsunto del correo
--bodyCuerpo del correo
--ccDestinatarios en CC
--bccDestinatarios en CCO
--htmlForzar formato HTML
--reply-toID del correo al que responder (para hilos)

Comandos de calendario

ComandoDescripción
calendar eventsListar eventos en un rango de fechas (sin consulta requerida)
calendar search <query>Buscar eventos con búsqueda semántica
calendar show <id>Mostrar detalles del evento
calendar createCrear nuevo evento

Parámetros para events:

ParámetroDescripciónPredeterminado
--fromFecha de inicio (YYYY-MM-DD)hoy
--toFecha de fin (YYYY-MM-DD)7 días desde el inicio
--accountFiltrar a cuenta(s) específica(s)all
--limitMáximo de resultados (máx: 200)50
--humanSalida legible para humanos agrupada por fecha-

Usa calendar events para responder preguntas como "¿qué tengo en mi calendario mañana?" o "muéstrame mis reuniones de la próxima semana" sin requerir una consulta de búsqueda.

Parámetros para create:

ParámetroDescripciónPredeterminado
--accountCuenta en la que crear el evento (obligatorio)-
--summaryTítulo del evento (obligatorio)-
--startHora de inicio (ISO 8601) (obligatorio)-
--endHora de fin (ISO 8601) (obligatorio)-
--descriptionDescripción del evento-
--locationUbicación del evento-
--attendeesCorreos de asistentes (repetible)-
--calendarID de calendarioprimary

Comandos de sincronización

ComandoDescripción
sync statusMostrar estado de sincronización de todas las cuentas
sync reset --account <a> --confirmBorrar todos los datos sincronizados
sync extend --account <a> --target-date <d>Sincronizar correos antiguos hasta una fecha
sync resume-from --account <a> --target-date <d>Forzar reanudación de sincronización desde una fecha
sync download-attachments --account <a>Descargar adjuntos pendientes

Comandos del daemon

ComandoDescripción
daemon installInstalar agente launchd (inicio automático al iniciar sesión)
daemon uninstallEliminar agente launchd
daemon statusComprobar si el daemon está en ejecución
daemon restartReiniciar el daemon

Comandos de configuración

ComandoDescripción
config settingsVer/modificar configuración del daemon
config add-permissionsAñadir a la lista de permitidos de Claude Code
config remove-permissionsEliminar de la lista de permitidos de Claude Code

Parámetros para settings:

ParámetroDescripciónPredeterminado
--loggingHabilitar/deshabilitar registro en archivooff
--email-intervalIntervalo de sondeo de correo en segundos (60-3600)300
--calendar-intervalIntervalo de sondeo de calendario en segundos (60-3600)300
--max-fetchesMáximo de descargas concurrentes (1-50)10
--timezoneZona horaria del usuario para análisis de fechas (p. ej., America/Los_Angeles)UTC
--embedding-providerBackend de embeddings: local, openrouter, remotelocal
--embedding-batch-sizeTamaño de lote de embeddings + descarga IMAP (1-1024)128
--openrouter-modelID del modelo de embeddings de OpenRouteropenai/text-embedding-3-small
--openrouter-api-key-envNombre de variable de entorno con clave API de OpenRouterOPENROUTER_API_KEY

Ejemplos de backend de embeddings:

# Use local embeddings (default)
groundeffect config settings --embedding-provider local

# Use OpenRouter embeddings
export OPENROUTER_API_KEY="your-key"
groundeffect config settings --embedding-provider openrouter

# Set embedding + IMAP fetch batch size (128 recommended for Gmail/OpenRouter stability)
groundeffect config settings --embedding-batch-size 128

# Optional: set a different OpenRouter model
groundeffect config settings --openrouter-model "openai/text-embedding-3-large"

Integración MCP (Alternativa)

Si prefieres MCP sobre la habilidad CLI, añade a ~/.claude.json:

{
  "mcpServers": {
    "groundeffect": {
      "type": "stdio",
      "command": "groundeffect-mcp",
      "env": {
        "GROUNDEFFECT_GOOGLE_CLIENT_ID": "${GROUNDEFFECT_GOOGLE_CLIENT_ID}",
        "GROUNDEFFECT_GOOGLE_CLIENT_SECRET": "${GROUNDEFFECT_GOOGLE_CLIENT_SECRET}"
      }
    }
  }
}

La habilidad es más rápida (llamadas CLI directas vs sobrecarga JSON-RPC de MCP) pero MCP funciona con otros clientes compatibles con MCP.

Compilar desde el código fuente

git clone https://github.com/jamiequint/groundeffect.git
cd groundeffect
cargo build --release

Binarios:

  • target/release/groundeffect - CLI
  • target/release/groundeffect-daemon - Daemon de sincronización en segundo plano
  • target/release/groundeffect-mcp - Servidor MCP

Instalar manualmente:

# Install binaries
sudo cp target/release/groundeffect* /usr/local/bin/

# Install skill
cp -r skill ~/.claude/skills/groundeffect

# Install daemon
groundeffect daemon install

# Add permissions
groundeffect config add-permissions

Almacenamiento de datos

~/.config/groundeffect/
├── config.toml            # Main configuration
├── daemon.toml            # Daemon configuration
└── tokens/                # OAuth tokens (file provider)

~/.local/share/groundeffect/
├── lancedb/               # LanceDB database
├── attachments/           # Downloaded attachments
├── models/                # Embedding model files
├── logs/                  # Log files
└── cache/
    └── sync_state/        # Sync state

~/.claude/skills/groundeffect/   # Claude Code skill

Almacenamiento de tokens

Por defecto, los tokens OAuth se almacenan en ~/.config/groundeffect/tokens/ como archivos JSON cifrados.

Para despliegues de servidor o contenedores efímeros, puedes almacenar tokens en PostgreSQL en su lugar. Esto requiere la característica postgres.

Almacenamiento de tokens en PostgreSQL

  1. Compila con la característica postgres:

    cargo build --release --features postgres
    
  2. Crea la tabla de tokens:

    CREATE TABLE IF NOT EXISTS groundeffect_tokens (
        email VARCHAR(255) PRIMARY KEY,
        encrypted_tokens BYTEA NOT NULL,
        created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
    );
    
  3. Configura en ~/.config/groundeffect/config.toml:

    [tokens]
    provider = "postgres"
    database_url_env = "DATABASE_URL"
    encryption_key_env = "GE_TOKEN_ENCRYPTION_KEY"
    # table_name = "groundeffect_tokens"  # optional
    
  4. Establece variables de entorno:

    export DATABASE_URL="postgres://user:pass@localhost/mydb"
    export GE_TOKEN_ENCRYPTION_KEY="your-secret-key-here"
    

Los tokens se cifran en reposo usando AES-256-GCM con una clave derivada de tu clave de cifrado mediante HKDF-SHA256.

Solución de problemas

"Token OAuth expirado"

Reautentica:

groundeffect account reauth <email-or-alias>

El daemon no se está ejecutando

Comprueba el estado y reinicia:

groundeffect daemon status
groundeffect daemon restart

O comprueba launchd:

launchctl list | grep groundeffect

Ver registros

tail -f ~/.local/share/groundeffect/logs/daemon.log

Habilita el registro si está deshabilitado:

groundeffect config settings --logging true
groundeffect daemon restart

Alto uso de memoria

El modelo de embeddings usa ~500MB-1GB durante la incrustación activa. Normal cuando está inactivo.

Arquitectura

┌──────────────┐      ┌──────────────────┐
│ Claude Code  │─────►│ groundeffect-mcp │────────┐
│ (MCP Host)   │stdio │                  │        │
└──────────────┘      └──────────────────┘        │
                                                  ▼
┌──────────────┐      ┌──────────────────┐    ┌─────────┐
│ Claude Code  │─────►│ groundeffect     │───►│ LanceDB │
│ (Skill/Bash) │      │ (CLI)            │    └─────────┘
└──────────────┘      └──────────────────┘         ▲
                                                   │
                      ┌──────────────────┐         │
                      │ groundeffect-    │─────────┘
                      │ daemon           │◄──── IMAP/CalDAV
                      └──────────────────┘

Licencia

MIT