Supabase + AI Agents: MCP Server y automatización inteligente
Kevin Dávila
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-supabaseObtener tu Access Token
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 tiposRespuesta: "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 = trueRespuesta: "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.