Crear una lista de leads de negocios locales suele llevar más tiempo que el propio contacto. Aquí tienes el camino rápido: añade el servidor MCP alojado de Scavio a Claude Code y luego pide al agente que busque "<oficio> en <ciudad>" en tus ciudades objetivo. Scavio ejecuta una búsqueda real de Google por consulta y devuelve el nombre del negocio, el sitio web y el snippet. Indica al agente que recorra las ciudades, deduplique por dominio y escriba un CSV. Obtienes la capa de descubrimiento en minutos en lugar de una tarde de copiar y pegar. Un aviso honesto: esto te da nombres y sitios, no correos ni teléfonos verificados. El enriquecimiento es un paso aparte, al final.
Requisitos previos
- Una clave de API de Scavio (registro gratis, 50 créditos incluidos)
- Claude Code instalado, o cualquier cliente MCP (Cursor, VS Code, Windsurf, opencode)
- Python 3.9+ o Node 18+ si quieres el bucle REST automatizado
Guia paso a paso
Paso 1: Añade el servidor MCP de Scavio a Claude Code
Abre la configuración MCP de Claude Code y registra el servidor alojado de Scavio. Se autentica con tu clave de API en la cabecera x-api-key. Sin instalación local, sin Docker. Tras guardar, reinicia Claude Code y las herramientas de búsqueda de Scavio aparecerán en el conjunto de herramientas del agente.
{
"mcpServers": {
"scavio": {
"url": "https://mcp.scavio.dev/mcp",
"headers": {
"x-api-key": "YOUR_SCAVIO_API_KEY"
}
}
}
}Paso 2: Pide al agente un oficio en una ciudad
Empieza con una sola consulta para confirmar la conexión. Pídeselo a Claude Code en lenguaje natural. El agente llama a la herramienta de Google de Scavio, que devuelve resultados orgánicos con listados de negocios locales: nombre, enlace y snippet. Verifica la forma antes de escalar.
Prompt to Claude Code:
"Use the Scavio MCP to search Google for
'plumbers in Austin' with light_request false.
List each result's business name, website, and snippet."Paso 3: Recorre todas tus ciudades objetivo
Ahora dale al agente la lista completa. Ejecuta una búsqueda por ciudad y recopila cada negocio que encuentra. Mantén light_request en false para obtener resultados orgánicos completos con listados locales. Cada consulta cuesta 2 créditos.
Prompt to Claude Code:
"Run the Scavio Google search for 'plumbers in <city>'
for each of: Austin, Dallas, Houston, San Antonio, Fort Worth.
Collect business name, website, and snippet from every result."Paso 4: Deduplica por dominio y exporta un CSV
La misma cadena o directorio suele aparecer en varias ciudades. Indica al agente que colapse las filas que comparten dominio de sitio web y luego escriba el resultado en un archivo. Acabas con una lista limpia, una fila por negocio.
Prompt to Claude Code:
"Dedupe the results by website domain, keeping the first
occurrence. Write a CSV called leads.csv with columns:
business_name, website, city, snippet."Paso 5: Ejecútalo sin interfaz con la API REST
Para un trabajo repetible (actualización nocturna, lista de ciudades más larga), salta el chat y llama directamente al endpoint REST. Los mismos datos, programables. Los ejemplos de Python y Node abajo recorren ciudades, deduplican por dominio y escriben el CSV sin un agente en el bucle.
curl -X POST https://api.scavio.dev/api/v1/google \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"plumbers in Austin","light_request":false}'Paso 6: Enriquecer: convertir sitios en leads contactables
La búsqueda de Google de Scavio te da la capa de descubrimiento: nombre del negocio y sitio web. No devuelve correos verificados ni entregabilidad de teléfonos. Ese es un paso de enriquecimiento aparte (rastrea la página de contacto, usa un buscador de correos, verifica la entregabilidad). Si necesitas campos ricos como valoraciones, horarios y número de reseñas de una vez, un scraper de Google Maps devuelve más por fila, pero cuesta más y arriesga bloqueos de IP. Para la mayoría de listas de leads, el descubrimiento de Scavio más un enriquecimiento barato es suficiente.
# Enrichment is a separate pass, e.g.:
# 1. For each website, fetch /contact
# 2. Extract emails with a regex or finder API
# 3. Verify deliverability before outreachEjemplo en Python
import csv
import os
from urllib.parse import urlparse
import requests
API_KEY = os.environ["SCAVIO_API_KEY"]
CITIES = ["Austin", "Dallas", "Houston", "San Antonio", "Fort Worth"]
TRADE = "plumbers"
def search(query):
r = requests.post(
"https://api.scavio.dev/api/v1/google",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "light_request": False},
timeout=60,
)
r.raise_for_status()
return r.json().get("organic", [])
def domain(url):
return urlparse(url).netloc.lower().replace("www.", "")
seen = set()
rows = []
for city in CITIES:
for item in search(f"{TRADE} in {city}"):
link = item.get("link", "")
d = domain(link)
if not d or d in seen:
continue
seen.add(d)
rows.append({
"business_name": item.get("title", ""),
"website": link,
"city": city,
"snippet": item.get("snippet", ""),
})
with open("leads.csv", "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=["business_name", "website", "city", "snippet"])
w.writeheader()
w.writerows(rows)
print(f"Wrote {len(rows)} leads to leads.csv")Ejemplo en JavaScript
import fs from "node:fs";
const API_KEY = process.env.SCAVIO_API_KEY;
const CITIES = ["Austin", "Dallas", "Houston", "San Antonio", "Fort Worth"];
const TRADE = "plumbers";
async function search(query) {
const res = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST",
headers: {
"Authorization": `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query, light_request: false }),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data.organic || [];
}
function domain(url) {
try {
return new URL(url).hostname.toLowerCase().replace("www.", "");
} catch {
return "";
}
}
const seen = new Set();
const rows = [];
for (const city of CITIES) {
const results = await search(`${TRADE} in ${city}`);
for (const item of results) {
const link = item.link || "";
const d = domain(link);
if (!d || seen.has(d)) continue;
seen.add(d);
rows.push({ business_name: item.title || "", website: link, city, snippet: item.snippet || "" });
}
}
const header = "business_name,website,city,snippet\n";
const body = rows
.map((r) => [r.business_name, r.website, r.city, r.snippet].map((v) => `"${String(v).replace(/"/g, '""')}"`).join(","))
.join("\n");
fs.writeFileSync("leads.csv", header + body);
console.log(`Wrote ${rows.length} leads to leads.csv`);Salida esperada
business_name,website,city,snippet
Daniel's Plumbing & Air Conditioning,https://danielsaustin.com,Austin,"24/7 plumbing repair and water heater installation in Austin, TX."
Reliant Plumbing,https://reliantplumbing.com,Austin,"Same-day plumbers serving Austin and surrounding areas."
Baker Brothers Plumbing,https://bakerbrothersplumbing.com,Dallas,"Licensed plumbers in Dallas-Fort Worth since 1945."
Abacus Plumbing,https://abacusplumbing.net,Houston,"Award-winning plumbing, AC, and electrical in Houston."
Wrote 47 leads to leads.csv