GroundEffect

Indexação local e ultrarrápida do Gmail e Google Agenda para o Claude Code, disponível como Skill ou MCP Server.

Documentação

GroundEffect

Indexação local ultra-rápida de Gmail e Google Agenda para Claude Code.

GroundEffect é um cliente local headless de IMAP/CalDav, skill do Claude Code e servidor MCP construído em Rust com LanceDB.

Recursos

  • Busca Híbrida: Texto completo BM25 + busca semântica vetorial com Fusão de Rank Recíproco
  • Embeddings Locais: Executa nomic-embed-text-v1.5 localmente via Candle com aceleração Metal
  • Multi-Conta: Conecte contas ilimitadas de Gmail/GCal com sincronização independente
  • Integração MCP: Expõe ferramentas de e-mail e agenda diretamente ao Claude Code
  • Sincronização em Tempo Real: IMAP IDLE para notificações instantâneas de e-mail, polling CalDAV para agenda
  • Extração de Texto HTML: Converte automaticamente e-mails HTML em texto simples usando html2text
  • Armazenamento de Tokens Plugável: Baseado em arquivo (padrão) ou PostgreSQL com criptografia AES-256-GCM

Início Rápido

1. Instalar

brew tap jamiequint/groundeffect
brew install groundeffect

Isso automaticamente:

  • Instala o daemon (inicia no login)
  • Instala a skill do Claude Code
  • Adiciona permissões para executar comandos do groundeffect

2. Configurar OAuth

Crie um projeto no Google Cloud com credenciais OAuth:

  1. Acesse o Google Cloud Console
  2. Crie um projeto e habilite a API Gmail e a API Google Calendar
  3. Vá em APIs & Services > Credentials
  4. Crie um ID de cliente OAuth (tipo Aplicativo de desktop)
  5. Adicione suas credenciais:
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. Adicionar uma Conta

groundeffect account add

Isso abre um navegador para OAuth do Google. Após a autenticação, o daemon sincroniza automaticamente.

É isso! Peça ao Claude Code para pesquisar seus e-mails e agenda.

Referência da CLI

Todos os comandos geram saída JSON por padrão. Adicione --human para saída legível.

Comandos de Conta

ComandoDescrição
account listLista todas as contas conectadas
account show <account>Mostra detalhes da conta e status de sincronização
account addAdiciona nova conta do Google via OAuth
account reauth <account>Reautentica uma conta existente via OAuth
account delete <account>Remove conta e todos os dados sincronizados
account configure <account>Atualiza configurações da conta (alias, anexos)

Parâmetros para add:

ParâmetroDescriçãoPadrão
--yearsAnos de histórico de e-mail para sincronizar (1-20 ou "all")1
--attachmentsHabilita download automático de anexosoff
--aliasNome amigável para a conta-

Comandos de E-mail

ComandoDescrição
email search <query>Busca híbrida BM25 + semântica
email listLista e-mails recentes
email show <id>Mostra conteúdo completo do e-mail
email thread <thread_id>Mostra todos os e-mails em uma conversa
email sendRedige e envia e-mail
email attachment <id>Obtém conteúdo de anexo
email foldersLista pastas IMAP

Parâmetros para search:

ParâmetroDescriçãoPadrão
--accountFiltra para conta específicaall
--limitMáximo de resultados (máx: 100)10
--fromFiltra por remetente-
--toFiltra por destinatário-
--date-fromFiltra após data (AAAA-MM-DD)-
--date-toFiltra antes de data (AAAA-MM-DD)-
--has-attachmentFiltra e-mails com anexos-

Parâmetros para send:

ParâmetroDescrição
--fromConta para enviar (obrigatório)
--toDestinatário(s) (obrigatório)
--subjectAssunto do e-mail (obrigatório)
--bodyCorpo do e-mail (obrigatório)
--ccDestinatários em CC
--bccDestinatários em BCC
--reply-toID do e-mail para responder (para conversas)
--htmlForça formato HTML (detectado automaticamente de markdown/URLs)
--save-as-draftSalva como rascunho em vez de enviar
--confirmEnvia imediatamente (sem isso: apenas pré-visualização)

Comandos de Rascunho

ComandoDescrição
email draft createCria um novo rascunho de e-mail
email draft listLista todos os rascunhos de uma conta
email draft show <id>Mostra conteúdo completo do rascunho
email draft update <id>Atualiza um rascunho existente
email draft send <id>Envia um rascunho
email draft delete <id>Exclui um rascunho

Parâmetros para draft create:

ParâmetroDescrição
--fromConta para criar rascunho (obrigatório)
--toDestinatário(s)
--subjectAssunto do e-mail
--bodyCorpo do e-mail
--ccDestinatários em CC
--bccDestinatários em BCC
--htmlForça formato HTML
--reply-toID do e-mail para responder (para conversas)

Comandos de Agenda

ComandoDescrição
calendar eventsLista eventos em um intervalo de datas (sem consulta necessária)
calendar search <query>Busca eventos com busca semântica
calendar show <id>Mostra detalhes do evento
calendar createCria novo evento

Parâmetros para events:

ParâmetroDescriçãoPadrão
--fromData de início (AAAA-MM-DD)hoje
--toData de término (AAAA-MM-DD)7 dias a partir do início
--accountFiltra para conta(s) específica(s)all
--limitMáximo de resultados (máx: 200)50
--humanSaída legível agrupada por data-

Use calendar events para responder perguntas como "o que tenho na agenda amanhã" ou "mostre minhas reuniões na próxima semana" sem exigir uma consulta de busca.

Parâmetros para create:

ParâmetroDescriçãoPadrão
--accountConta para criar evento (obrigatório)-
--summaryTítulo do evento (obrigatório)-
--startHorário de início (ISO 8601) (obrigatório)-
--endHorário de término (ISO 8601) (obrigatório)-
--descriptionDescrição do evento-
--locationLocal do evento-
--attendeesE-mails dos participantes (repetível)-
--calendarID da agendaprimary

Comandos de Sincronização

ComandoDescrição
sync statusMostra status de sincronização de todas as contas
sync reset --account <a> --confirmLimpa todos os dados sincronizados
sync extend --account <a> --target-date <d>Sincroniza e-mails mais antigos até uma data
sync resume-from --account <a> --target-date <d>Força retomada da sincronização a partir de uma data
sync download-attachments --account <a>Baixa anexos pendentes

Comandos do Daemon

ComandoDescrição
daemon installInstala agente launchd (início automático no login)
daemon uninstallRemove agente launchd
daemon statusVerifica se o daemon está em execução
daemon restartReinicia o daemon

Comandos de Configuração

ComandoDescrição
config settingsVisualiza/modifica configurações do daemon
config add-permissionsAdiciona à lista de permissões do Claude Code
config remove-permissionsRemove da lista de permissões do Claude Code

Parâmetros para settings:

ParâmetroDescriçãoPadrão
--loggingHabilita/desabilita registro em arquivooff
--email-intervalIntervalo de polling de e-mail em segundos (60-3600)300
--calendar-intervalIntervalo de polling de agenda em segundos (60-3600)300
--max-fetchesMáximo de buscas simultâneas (1-50)10
--timezoneFuso horário do usuário para análise de datas (ex.: America/Los_Angeles)UTC
--embedding-providerBackend de embeddings: local, openrouter, remotelocal
--embedding-batch-sizeTamanho do lote de embeddings + busca IMAP (1-1024)128
--openrouter-modelID do modelo de embeddings OpenRouteropenai/text-embedding-3-small
--openrouter-api-key-envNome da variável de ambiente com a chave da API OpenRouterOPENROUTER_API_KEY

Exemplos de backends 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"

Integração MCP (Alternativa)

Se você preferir MCP em vez da skill CLI, adicione 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}"
      }
    }
  }
}

A skill é mais rápida (chamadas CLI diretas vs. overhead JSON-RPC do MCP), mas o MCP funciona com outros clientes compatíveis com MCP.

Compilar a partir do Código-Fonte

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

Binários:

  • target/release/groundeffect - CLI
  • target/release/groundeffect-daemon - Daemon de sincronização em 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

Armazenamento de Dados

~/.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

Armazenamento de Tokens

Por padrão, os tokens OAuth são armazenados em ~/.config/groundeffect/tokens/ como arquivos JSON criptografados.

Para implantações em servidores ou contêineres efêmeros, você pode armazenar tokens no PostgreSQL. Isso requer o recurso postgres.

Armazenamento de Tokens no PostgreSQL

  1. Compile com o recurso postgres:

    cargo build --release --features postgres
    
  2. Crie a tabela 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. Configure em ~/.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. Defina as variáveis de ambiente:

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

Os tokens são criptografados em repouso usando AES-256-GCM com uma chave derivada da sua chave de criptografia via HKDF-SHA256.

Solução de Problemas

"Token OAuth expirado"

Reautentique:

groundeffect account reauth <email-or-alias>

Daemon não está em execução

Verifique o status e reinicie:

groundeffect daemon status
groundeffect daemon restart

Ou verifique o launchd:

launchctl list | grep groundeffect

Ver registros

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

Habilite o registro se estiver desabilitado:

groundeffect config settings --logging true
groundeffect daemon restart

Alto uso de memória

O modelo de embeddings usa cerca de 500MB-1GB durante a geração ativa de embeddings. Normal quando ocioso.

Arquitetura

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

Licença

MIT