Supabase MCP le permite a Claude Code consultar su base de datos Postgres directamente usando lenguaje natural. Combinado con el enriquecimiento de la búsqueda, su agente de IA puede responder preguntas como "¿qué clientes coinciden con las empresas financiadas recientemente?" uniendo datos internos con resultados web en vivo. Este tutorial configura Supabase MCP, configura el acceso de solo lectura por seguridad y agrega un paso de enriquecimiento de búsqueda que aumenta los resultados de la consulta con datos web nuevos. Costo: $0,005 por consulta de enriquecimiento de búsqueda.
Requisitos previos
- Un proyecto Supabase con datos
- Clave de función de servicio Supabase o clave de solo lectura
- Código Claude instalado
- Python 3.9+ y biblioteca de solicitudes
Guia paso a paso
Paso 1: Configurar Supabase MCP en Claude Code
Agregue el servidor Supabase MCP a su .mcp.json. Utilice una clave de solo lectura para evitar escrituras accidentales.
import json
from pathlib import Path
mcp_config = {
'mcpServers': {
'supabase': {
'command': 'npx',
'args': ['-y', '@supabase/mcp-server'],
'env': {
'SUPABASE_URL': 'https://your-project.supabase.co',
'SUPABASE_KEY': 'your-read-only-key-here'
}
}
}
}
mcp_path = Path('.mcp.json')
if mcp_path.exists():
existing = json.loads(mcp_path.read_text())
existing['mcpServers']['supabase'] = mcp_config['mcpServers']['supabase']
mcp_config = existing
mcp_path.write_text(json.dumps(mcp_config, indent=2))
print('Supabase MCP configured in .mcp.json')
print('Restart Claude Code to connect.')Paso 2: Consulta Supabase desde Python para enriquecimiento
Utilice el cliente Supabase Python para extraer datos que desee enriquecer con resultados de búsqueda. Este ejemplo lleva a las empresas clientes a investigar.
import os
from supabase import create_client
SUPABASE_URL = os.environ['SUPABASE_URL']
SUPABASE_KEY = os.environ['SUPABASE_KEY']
supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
# Pull companies to research
result = supabase.table('customers').select('id, company_name, domain').limit(10).execute()
companies = result.data
print(f'Loaded {len(companies)} companies to enrich')
for c in companies[:5]:
print(f' {c["company_name"]}: {c["domain"]}')Paso 3: Enriquezca los registros de la base de datos con búsqueda en vivo
Para cada empresa de Supabase, busque en la web noticias recientes, señales de financiación o contratación y escriba el enriquecimiento.
import requests
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
def enrich_company(company: dict) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'{company["company_name"]} funding news 2026',
'country_code': 'us', 'num_results': 3})
results = resp.json().get('organic_results', [])
signals = []
for r in results:
snippet = r.get('snippet', '').lower()
if any(w in snippet for w in ['funding', 'raised', 'series', 'acquisition']):
signals.append('funding_news')
if any(w in snippet for w in ['hiring', 'job', 'careers', 'open role']):
signals.append('actively_hiring')
return {
'company_id': company['id'],
'top_result': results[0]['title'] if results else '',
'signals': list(set(signals)),
'results_count': len(results)
}
enriched = [enrich_company(c) for c in companies[:5]]
for e in enriched:
print(f' Company {e["company_id"]}: {e["signals"] or ["no signals"]} -- {e["top_result"][:50]}')
print(f'Cost: {len(enriched)} searches = ${len(enriched) * 0.005:.3f}')Ejemplo en Python
import os, requests
from supabase import create_client
supabase = create_client(os.environ['SUPABASE_URL'], os.environ['SUPABASE_KEY'])
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
companies = supabase.table('customers').select('id, company_name').limit(5).execute().data
for c in companies:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'{c["company_name"]} news 2026', 'country_code': 'us', 'num_results': 3})
top = resp.json().get('organic_results', [{}])[0].get('title', 'N/A')
print(f'{c["company_name"]}: {top}')Ejemplo en JavaScript
import { createClient } from '@supabase/supabase-js';
const supabase = createClient(process.env.SUPABASE_URL, process.env.SUPABASE_KEY);
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function enrichCompanies() {
const { data: companies } = await supabase.from('customers').select('id, company_name').limit(5);
for (const c of companies) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${c.company_name} news 2026`, country_code: 'us', num_results: 3 })
});
const top = (await resp.json()).organic_results?.[0]?.title || 'N/A';
console.log(`${c.company_name}: ${top}`);
}
}
enrichCompanies();Salida esperada
Loaded 10 companies to enrich
Acme Corp: acme.io
TechFlow: techflow.dev
Company 1: ['funding_news'] -- Acme Corp Raises $15M Series A
Company 2: ['actively_hiring'] -- TechFlow Careers - 12 Open Roles
Company 3: ['funding_news', 'actively_hiring'] -- DataSync Acquir
Cost: 5 searches = $0.025