Supabase MCP permet à Claude Code d'interroger directement votre base de données Postgres en langage naturel. Combinée à l'enrichissement par recherche, votre agent IA peut répondre à des questions comme « quels clients correspondent à des entreprises récemment financées ? » en joignant les données internes avec des résultats web en direct. Ce tutoriel configure Supabase MCP, définit un accès en lecture seule pour la sécurité, et ajoute une étape d'enrichissement par recherche qui améliore les résultats de requêtes avec des données web fraîches. Coût : $0.005 par requête d'enrichissement par recherche.
Prérequis
- Un projet Supabase avec des données
- Clé de rôle de service Supabase ou clé en lecture seule
- Claude Code installé
- Python 3.9+ et la bibliothèque requests
Parcours
Étape 1: Configurer Supabase MCP dans Claude Code
Ajoutez le serveur Supabase MCP à votre .mcp.json. Utilisez une clé en lecture seule pour éviter les écritures accidentelles.
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.')Étape 2: Interroger Supabase depuis Python pour l'enrichissement
Utilisez le client Python Supabase pour extraire les données que vous souhaitez enrichir avec les résultats de recherche. Cet exemple extrait les entreprises clientes à étudier.
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"]}')Étape 3: Enrichir les enregistrements de la base de données avec des recherches en direct
Pour chaque entreprise provenant de Supabase, recherchez sur le web des actualités récentes, des financements ou des signaux de recrutement, puis réécrivez l'enrichissement.
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}')Exemple 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}')Exemple 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();Sortie attendue
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