Cómo construí una búsqueda inteligente en ~3500 contactos en 2 horas
Monté una búsqueda semántica en el CRM con Qdrant Cloud y Claude Code. Ahora en vez de filtros — simplemente pregunto en lenguaje natural.
Acumulé ~3500 contactos de diferentes chats de Telegram. Founders, creadores, desarrolladores — todo en un JSON. Encontrar algo concreto era un suplicio.
Antes abría el archivo, escribía queries con jq, filtraba por campos. ¿Quieres encontrar “founders en Berlín interesados en AI”? Suerte con la lógica booleana.
Hoy construí una solución que permite simplemente preguntar: “Encuentra founders en Berlín que trabajan con AI”. Y obtener una lista.
Qué quedó listo
Un servidor MCP local que:
- Toma mi CRM (JSON con contactos)
- Convierte cada contacto en un vector mediante embeddings
- Almacena todo en Qdrant Cloud
- Permite buscar desde Claude Desktop en lenguaje natural
Ahora en Claude Desktop simplemente escribo:
“Encuentra personas similares a este contacto”
“¿Qué contactos trabajan en marketing y viven en EE.UU.?”
“Creadores con gran audiencia”
Y obtengo resultados relevantes. Sin jq, sin filtros, sin dolor.
Stack
- Qdrant Cloud — tier gratuito, 1GB de almacenamiento
- Embedding API —
text-embedding-3-smallpara embeddings - MCP (Model Context Protocol) — integración con Claude Desktop
- TypeScript — para el servidor MCP
Arquitectura
┌─────────────────────────────────────────────────────┐
│ Mac │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │Claude Desktop│ ───▶ │ MCP-сервер (node) │ │
│ └──────────────┘ └──────────┬───────────┘ │
└───────────────────────────────────┼────────────────┘
│
┌───────────────┴───────────────┐
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ Qdrant Cloud │ │ Embedding API │
│ (vectores) │ │ (embeddings) │
└───────────────────┘ └───────────────────┘
El servidor MCP corre localmente, pero los datos están en la nube. Esto significa:
- Búsqueda rápida (Qdrant está optimizado para vectores)
- Se puede usar desde cualquier dispositivo
- Gratuito en los volúmenes actuales
Cómo lo construí
1. Parseo de contactos
Recopilé contactos de varios chats de Telegram via MTProto API. Parseé alrededor de 8 comunidades de diferentes temáticas — desde técnicas hasta creativas. Obtuve ~3500 contactos únicos.
2. Enriquecimiento de datos
A partir de los username + first_name en bruto, extraje:
- Roles (founder, developer, creator)
- Empresas
- Ubicaciones
- Cohortes por intereses
Tras el enriquecimiento, ~1500 contactos tenían suficientes datos para una búsqueda de calidad.
3. Qdrant Cloud
Creé un clúster en cloud.qdrant.io — tardé 2 minutos. El tier gratuito ofrece 1GB, suficiente para decenas de miles de contactos.
4. Indexación
Cargué los contactos enriquecidos en Qdrant — ~90 segundos para toda la base. Coste de los embeddings: menos de un centavo.
5. Servidor MCP
Escribí un servidor MCP en TypeScript y lo conecté a Claude Desktop. El servidor recibe una consulta de texto, genera un embedding y busca los vecinos más cercanos en Qdrant.
La configuración es la estándar de claude_desktop_config.json con tres variables de entorno (claves de API y URL del clúster).
Reinicié Claude Desktop — listo.
Por qué búsqueda semántica
La búsqueda clásica busca coincidencias exactas de palabras. La semántica — por significado.
Escribo: “personas que construyen productos”
Encuentro:
- “founder of startup X”
- “building my own project”
- “indie hacker”
- “запускаю свой сервис”
Aunque la palabra “producto” no aparezca en ningún lado — lo encontrará por el significado. Los embeddings codifican el sentido, no las letras.
Qué sigue
Ahora los datos son estáticos — después del parseo hay que reindexar. Planeo:
- Reindexación automática al actualizar el CRM
- Filtros — combinar semántica con condiciones exactas (por ejemplo, por rol y ciudad)
- Integración con outreach — buscar similares a los que ya respondieron
Resumen
| Qué | Cuánto |
|---|---|
| Tiempo de configuración | ~2 horas |
| Contactos en la base | ~3.500 |
| Contactos con datos | ~1.500 |
| Coste de indexación | < $0,01 |
| Qdrant Cloud | gratuito |
Vibe coding en estado puro: en lugar de escribir filtros complejos, enseñé a la IA a entender mis consultas. Ahora el CRM es una conversación, no SQL.