Skip to main content
Glama
leomeirae

Supabase MCP Server

by leomeirae
README.md
# 🚀 Supabase MCP Server - Deploy no Coolify

Este repositório contém a configuração completa para deploy do **Supabase MCP Server** no Coolify, permitindo que agentes de IA acessem e gerenciem projetos Supabase através do Model Context Protocol (MCP).

## 🌐 **Servidor Ativo**

**URL do Servidor**: http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/

### 📡 **Endpoints Disponíveis**

- **Root**: `GET /` - Informações do servidor
- **Health**: `GET /health` - Verificação de saúde
- **Status**: `GET /status` - Status detalhado
- **Test**: `GET /test` e `POST /test` - Testes de conectividade
- **MCP**: `POST /mcp` - **Endpoint principal para agentes de IA**

## 🛠️ **Tools Disponíveis para Agentes de IA**

### 🗄️ **Database Tools**

#### `list_tables`
Lista todas as tabelas no banco de dados.
```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_tables",
    "arguments": {
      "schemas": ["public"]
    }
  }
}
```

#### `execute_sql`
Executa SQL raw no banco de dados.
```json
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "execute_sql",
    "arguments": {
      "query": "SELECT * FROM leads WHERE phone_number = '5511999999999'"
    }
  }
}
```

#### `apply_migration`
Aplica migrações DDL no banco.
```json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "apply_migration",
    "arguments": {
      "name": "create_new_table",
      "query": "CREATE TABLE new_table (id SERIAL PRIMARY KEY, name VARCHAR(255))"
    }
  }
}
```

### 📊 **Gestão de Leads (Tabela: `leads`)**

#### Consultar Leads
```sql
-- Buscar lead por telefone
SELECT * FROM leads WHERE phone_number = '5511999999999';

-- Buscar leads por cidade
SELECT * FROM leads WHERE city = 'São Paulo';

-- Buscar leads qualificados
SELECT * FROM leads WHERE qualification_status = 'QUALIFIED';
```

#### Inserir/Atualizar Lead
```sql
-- Inserir novo lead
INSERT INTO leads (phone_number, name, city, state, client_type, additional_data)
VALUES ('5511999999999', 'João Silva', 'São Paulo', 'SP', 'RESIDENTIAL', '{"source": "whatsapp", "campaign": "energia"}');

-- Atualizar lead existente
UPDATE leads 
SET name = 'João Silva Santos', 
    additional_data = additional_data || '{"last_contact": "2024-01-15"}'
WHERE phone_number = '5511999999999';
```

#### Campos da Tabela `leads`:
- `id` (SERIAL PRIMARY KEY)
- `phone_number` (VARCHAR, UNIQUE)
- `name` (VARCHAR)
- `city` (VARCHAR)
- `state` (VARCHAR)
- `invoice_amount` (NUMERIC)
- `client_type` (VARCHAR)
- `qualification_status` (VARCHAR, DEFAULT 'NEW')
- `conversation_state` (VARCHAR, DEFAULT 'INITIAL')
- `additional_data` (JSONB, DEFAULT '{}')
- `created_at` (TIMESTAMP)
- `updated_at` (TIMESTAMP)

### 📸 **Gestão de Imagens (Tabelas: `energy_bills`, `image_metadata`)**

#### Tabela `energy_bills`:
- `id` (SERIAL PRIMARY KEY)
- `lead_id` (INTEGER, FK para leads)
- `phone` (VARCHAR)
- `image_path` (VARCHAR)
- `extracted_data` (TEXT)
- `created_at` (TIMESTAMP)

#### Tabela `image_metadata`:
- `id` (UUID PRIMARY KEY)
- `wamid` (TEXT, UNIQUE)
- `sender_phone` (TEXT)
- `storage_path` (TEXT)
- `mime_type` (TEXT, DEFAULT 'image/jpeg')
- `file_size_kb` (INTEGER)
- `original_caption` (TEXT)
- `lead_id` (INTEGER, FK para leads)
- `processing_status` (TEXT, DEFAULT 'completed')
- `error_message` (TEXT)
- `created_at` (TIMESTAMPTZ)

### 🔍 **Debug & Monitoring**

#### `get_logs`
Obtém logs do projeto Supabase.
```json
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "get_logs",
    "arguments": {
      "service": "api"
    }
  }
}
```

#### `get_advisors`
Obtém avisos de segurança e performance.
```json
{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "get_advisors",
    "arguments": {
      "type": "security"
    }
  }
}
```

### 📚 **Documentação**

#### `search_docs`
Busca na documentação Supabase.
```json
{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "search_docs",
    "arguments": {
      "graphql_query": "query { searchDocs(query: \"authentication\", limit: 5) { nodes { title href content } } }"
    }
  }
}
```

### ⚡ **Edge Functions**

#### `list_edge_functions`
Lista todas as edge functions.
```json
{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "list_edge_functions",
    "arguments": {}
  }
}
```

#### `deploy_edge_function`
Deploy de nova edge function.
```json
{
  "jsonrpc": "2.0",
  "id": 8,
  "method": "tools/call",
  "params": {
    "name": "deploy_edge_function",
    "arguments": {
      "name": "process-lead",
      "files": [
        {
          "name": "index.ts",
          "content": "Deno.serve(async (req) => { return new Response('Hello from edge function!') })"
        }
      ]
    }
  }
}
```

### 🗄️ **Storage**

#### `list_storage_buckets`
Lista buckets de storage.
```json
{
  "jsonrpc": "2.0",
  "id": 9,
  "method": "tools/call",
  "params": {
    "name": "list_storage_buckets",
    "arguments": {}
  }
}
```

## 🎯 **Casos de Uso Específicos**

### 1. **Gestão Completa de Lead**

```bash
# 1. Buscar lead existente
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "execute_sql",
      "arguments": {
        "query": "SELECT * FROM leads WHERE phone_number = '\''5511999999999'\''"
      }
    }
  }'

# 2. Inserir novo lead se não existir
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "execute_sql",
      "arguments": {
        "query": "INSERT INTO leads (phone_number, name, city, state, client_type, additional_data) VALUES ('\''5511999999999'\'', '\''Maria Silva'\'', '\''São Paulo'\'', '\''SP'\'', '\''RESIDENTIAL'\'', '\''{\"source\": \"whatsapp\", \"campaign\": \"energia\"}'\'') ON CONFLICT (phone_number) DO UPDATE SET name = EXCLUDED.name, updated_at = CURRENT_TIMESTAMP"
      }
    }
  }'
```

### 2. **Processamento de Imagem de Conta de Energia**

```bash
# 1. Salvar metadados da imagem
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 3,
    "method": "tools/call",
    "params": {
      "name": "execute_sql",
      "arguments": {
        "query": "INSERT INTO image_metadata (wamid, sender_phone, storage_path, mime_type, file_size_kb, original_caption, lead_id) VALUES ('\''wamid_123'\'', '\''5511999999999'\'', '\''energy_bills/2024/01/bill_123.jpg'\'', '\''image/jpeg'\'', 256, '\''Conta de energia'\'', 1)"
      }
    }
  }'

# 2. Registrar conta processada
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 4,
    "method": "tools/call",
    "params": {
      "name": "execute_sql",
      "arguments": {
        "query": "INSERT INTO energy_bills (lead_id, phone, image_path, extracted_data) VALUES (1, '\''5511999999999'\'', '\''energy_bills/2024/01/bill_123.jpg'\'', '\''{\"valor\": 150.50, \"vencimento\": \"2024-01-15\", \"consumo\": 250}\'')"
      }
    }
  }'
```

### 3. **Atualização de Dados Adicionais**

```bash
# Atualizar dados adicionais do lead
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 5,
    "method": "tools/call",
    "params": {
      "name": "execute_sql",
      "arguments": {
        "query": "UPDATE leads SET additional_data = additional_data || '\''{\"last_bill_amount\": 150.50, \"last_bill_date\": \"2024-01-15\", \"processing_status\": \"completed\"}'\''::jsonb WHERE phone_number = '\''5511999999999'\''"
      }
    }
  }'
```

## 🔧 **Configuração Técnica**

### **Variáveis de Ambiente (Coolify)**

| Variável | Descrição | Exemplo |
|----------|-----------|---------|
| `SUPABASE_ACCESS_TOKEN` | Token de acesso Supabase | `sbp_...` |
| `PROJECT_REF` | Referência do projeto | `ynyvrnasvcxyvjzhzbwf` |
| `FEATURES` | Features habilitadas | `database,docs,functions,storage,debug,development` |
| `PORT` | Porta do servidor | `45678` |

### **Features Habilitadas**
- ✅ `database` - Acesso completo ao banco de dados
- ✅ `docs` - Busca na documentação
- ✅ `functions` - Deploy de edge functions
- ✅ `storage` - Gerenciamento de storage
- ✅ `debug` - Logs e debugging
- ✅ `development` - Ferramentas de desenvolvimento

### **Configuração de Porta**
- **Interna**: 45678 (container)
- **Externa**: Gerenciada automaticamente pelo Coolify
- **Acesso**: Via proxy reverso do Coolify (sem configuração manual de porta)

## 🚀 **Deploy no Coolify**

### **Pré-requisitos**
1. Conta no Coolify
2. Projeto Supabase ativo
3. Personal Access Token (PAT) do Supabase
4. Repositório Git configurado

### **Passos para Deploy**
1. **Clone o repositório** no Coolify
2. **Configure as variáveis de ambiente**:
   - `SUPABASE_ACCESS_TOKEN`: Seu PAT do Supabase
   - `PROJECT_REF`: ID do seu projeto Supabase
   - `FEATURES`: `database,docs,functions,storage,debug,development`
3. **Deploy automático** via Coolify

### **Verificação do Deploy**
```bash
# Testar conectividade
curl http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/health

# Testar endpoint MCP
curl -X POST http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
```

## 🔒 **Segurança**

### **⚠️ Avisos Importantes**
- **Modo Write**: Este servidor está configurado para **acesso completo** (não read-only)
- **Permissões**: O agente de IA terá acesso total ao banco de dados
- **Monitoramento**: Recomenda-se monitorar logs regularmente
- **Backup**: Mantenha backups regulares do banco de dados

### **Recomendações de Segurança**
1. **Use RLS (Row Level Security)** no Supabase
2. **Monitore logs** regularmente
3. **Configure alertas** para operações críticas
4. **Mantenha tokens seguros** e rotacione periodicamente

## 🐛 **Troubleshooting**

### **Problemas Comuns**

#### **"Bad Gateway" no endpoint /mcp**
- Verifique se as variáveis de ambiente estão configuradas
- Confirme se o projeto Supabase está ativo
- Verifique logs do container no Coolify

#### **"Unknown method"**
- Use métodos válidos: `tools/list`, `tools/call`
- Verifique a sintaxe JSON-RPC 2.0

#### **Erro de conexão com banco**
- Confirme se o `PROJECT_REF` está correto
- Verifique se o `SUPABASE_ACCESS_TOKEN` é válido
- Teste conectividade com o projeto Supabase

### **Logs Úteis**
```bash
# Verificar status do servidor
curl http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/status

# Testar conectividade básica
curl http://hwg4ks4ooooc04wsosookoog.157.180.32.249.sslip.io/test
```

## 📞 **Suporte**

Para suporte técnico ou dúvidas sobre o uso do MCP Server:

1. **Verifique os logs** do container no Coolify
2. **Teste os endpoints** de diagnóstico
3. **Consulte a documentação** Supabase
4. **Use as tools de debug** disponíveis

---

**🎉 O Supabase MCP Server está funcionando plenamente e pronto para uso com agentes de IA!**