Supabase + AI Agents: MCP Server y automatización inteligente
Le pedí a Claude que revisara las tablas de mi proyecto de Supabase y me dijera cuáles no tenían RLS. Sin copiar el schema, sin pegar SQL. Treinta segundos después tenía el listado y una migración lista para aplicar. Yo solo había escrito una frase.
Eso hace el MCP Server de Supabase: conecta tu base de datos con agentes como Claude o Cursor para que trabajen con tus datos reales. En este post lo vas a configurar paso a paso y verás hasta dónde llega: leer tu schema, hacer queries y generar migraciones.
Qué es MCP Server
MCP (Model Context Protocol) es un protocolo que permite a los agentes de AI comunicarse con herramientas externas. El MCP Server de Supabase conecta tu base de datos con agentes como:
- Claude (Anthropic)
- Cursor
- GitHub Copilot
- Cualquier agente compatible con MCP
Esto significa que puedes preguntarle a tu agente de AI sobre tu base de datos, y él puede:
- Leer el schema de tus tablas
- Hacer queries SELECT
- Generar migraciones SQL
- Escribir código que coincide con tu DB
Configurar el MCP Server
Instalar
// terminal
npm install -g @supabase/mcp-server-supabase
Obtener tu Access Token
- Ve a supabase.com/dashboard/account/tokens
- Crea un nuevo token con permisos de lectura
- Copia el token
Configurar en Claude Desktop
Edita ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"supabase": {
"command": "npx",
"args": [
"-y",
"@supabase/mcp-server-supabase@latest",
"--access-token",
"TU_ACCESS_TOKEN"
]
}
}
}
Configurar en Cursor
En .cursor/mcp.json:
{
"mcpServers": {
"supabase": {
"command": "npx",
"args": [
"-y",
"@supabase/mcp-server-supabase@latest",
"--access-token",
"TU_ACCESS_TOKEN"
]
}
}
}
Configurar proyecto específico
Para limitar el MCP a un proyecto específico:
{
"mcpServers": {
"supabase": {
"command": "npx",
"args": [
"-y",
"@supabase/mcp-server-supabase@latest",
"--access-token",
"TU_ACCESS_TOKEN",
"--project-ref",
"tu-project-ref"
]
}
}
}
Qué puede hacer el MCP Server
Leer el schema
Puedes preguntar:
- "¿Qué tablas tengo en mi base de datos?"
- "Muéstrame el schema de la tabla users"
- "¿Qué columnas tiene la tabla orders?"
El agente ejecuta list_tables y list_extensions para obtener esta información.
Hacer queries
Puedes pedir:
- "¿Cuántos usuarios tengo?"
- "Muéstrame los últimos 10 pedidos"
- "¿Qué productos están sin stock?"
El agente ejecuta execute_sql para hacer queries SELECT.
Generar código
Puedes pedir:
- "Genera un componente Angular para mostrar usuarios"
- "Crea una función para insertar pedidos"
- "Escribe el servicio de Supabase para esta tabla"
El agente usa el schema para generar código tipado que coincide con tu base de datos.
Generar migraciones
Puedes pedir:
- "Necesito una tabla para comentarios con relación a posts"
- "Agrega un campo de email_verified a la tabla users"
- "Crea un índice en created_at para la tabla orders"
El agente genera SQL de migración basado en tu schema actual.
Ejemplo práctico
Pregunta 1: "¿Qué tablas tengo?"
El agente ejecuta:
list_tables → Devuelve lista de tablas con columnas y tipos
Respuesta: "Tienes 5 tablas:
- users (id, email, name, created_at)
- tasks (id, user_id, title, completed, created_at)
- projects (id, name, owner_id)
- project_members (id, project_id, user_id, role)
- comments (id, task_id, user_id, content, created_at)"
Pregunta 2: "¿Cuántas tareas completadas hay?"
El agente ejecuta:
SELECT COUNT(*) FROM tasks WHERE completed = true
Respuesta: "Hay 47 tareas completadas."
Pregunta 3: "Genera un servicio para manejar tareas"
El agente genera:
// src/services/task.service.ts
import { supabase } from '../lib/supabase'
export interface Task {
id: string
user_id: string
title: string
completed: boolean
created_at: string
}
export class TaskService {
async getTasks(userId: string) {
const { data, error } = await supabase
.from('tasks')
.select('*')
.eq('user_id', userId)
.order('created_at', { ascending: false })
if (error) throw error
return data as Task[]
}
async createTask(userId: string, title: string) {
const { data, error } = await supabase
.from('tasks')
.insert({ user_id: userId, title })
.select()
.single()
if (error) throw error
return data as Task
}
async toggleTask(taskId: string, completed: boolean) {
const { data, error } = await supabase
.from('tasks')
.update({ completed })
.eq('id', taskId)
.select()
.single()
if (error) throw error
return data as Task
}
}
Seguridad
¿Es seguro dar acceso a mi base de datos?
El MCP Server usa tu access token de Supabase, que tiene los mismos permisos que tu cuenta. Recomendaciones:
- Usa un token con permisos de solo lectura si no necesitas writes
- Limita a un proyecto específico con
--project-ref - No compartas el token
¿Puede el agente modificar mi base de datos?
Por defecto, el MCP Server solo permite queries SELECT. Para writes:
- Necesitas habilitar explícitamente los permisos de escritura
- Las migraciones generadas son solo SQL - no se ejecutan automáticamente
Casos de uso reales
1. Desarrollo rápido
Pide al agente que genere componentes, servicios, y APIs basados en tu schema existente.
2. Documentación
Pide al agente que documente tu schema, relaciones, y políticas de RLS.
3. Debugging
Pide al agente que investigue problemas:
- "¿Por qué esta query es lenta?"
- "¿Hay datos inconsistentes en la tabla X?"
- "¿Qué políticas de RLS aplican a esta tabla?"
4. Migraciones
Pide al agente que genere migraciones para nuevas features:
- "Necesito un sistema de comentarios con likes"
- "Agrega soporte para tags en las tareas"
Referencia de Codea Bien
Para más sobre AI agents y Angular, revisa: RAG en Angular: Búsqueda inteligente con embeddings y Gemini
Qué sigue
En el próximo artículo vamos con De MVP a Producción: cómo llevar tu app de Supabase del desarrollo al mundo real. Vamos a ver performance, seguridad, monitoring, y costos.