Cvlac
FreeNot checkedMCP server that syncs a MinCiencias CvLAC profile with a personal portfolio, via Playwright
About
MCP server that syncs a MinCiencias CvLAC profile with a personal portfolio, via Playwright
README
Servidor MCP (stdio) para sincronizar tu perfil de CvLAC (MinCiencias) con tu portafolio web, usando TypeScript + Playwright.
No trae datos de nadie: tus credenciales, tus valores por defecto y tus proyectos curados viven en archivos locales que el repo ignora. Sirve para cualquier persona con una hoja de vida en CvLAC.
Permite:
- leer datos en vivo del CvLAC (
read_cvlac) - leer el portafolio (
read_portfolio) - calcular diferencias (
diff): faltantes, a actualizar, parecidos y al día - aplicar cambios por sección (
update_section:add/update/delete) - sincronizar de forma masiva (
sync, condry_run)
Dos garantías al escribir: nunca crea un duplicado sin preguntar (si ya hay algo igual o parecido devuelve needs_confirmation en vez de escribir) y siempre dice qué campo falló cuando CvLAC rechaza un formulario.
Uso responsable. Esto automatiza un sitio gubernamental con tu propia cuenta. Úsalo con supervisión humana, revisa cada
dry_runantes de aplicar y no lo dejes corriendo sin mirar.
Qué está verificado, qué falta y las limitaciones conocidas: ROADMAP.md.
Tabla de contenido
- Inicio rápido: instalar y configurar el MCP (Linux, Windows, macOS)
- Arquitectura
- Tools MCP disponibles
- Variables de entorno
- Uso local
- Flujo recomendado
- Pruebas y build
- Troubleshooting
- Seguridad y buenas prácticas
- Estado y roadmap
Inicio rápido: instalar y configurar el MCP (Linux, Windows, macOS)
Esta es la guía oficial de instalación y configuración. Sigue los pasos en orden; cada uno incluye una verificación para no avanzar con un entorno roto.
Paso 0 - Prerrequisitos (todas las plataformas)
Necesitas Node.js 20 o superior, npm 10+ y git.
| Plataforma | Cómo instalar Node 20+ |
|---|---|
| Linux (Debian/Ubuntu) | curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs git |
| Linux (cualquier distro, recomendado) | Instalar nvm y luego nvm install 20 && nvm use 20 |
| macOS | brew install node@20 git (con Homebrew) o nvm |
| Windows | winget install OpenJS.NodeJS.LTS y winget install Git.Git (o instalador desde nodejs.org) |
Verifica (sirve igual en bash, zsh o PowerShell):
node --version # debe mostrar v20.x o superior
npm --version # debe mostrar 10.x o superior
git --version
Paso 1 - Clonar el repositorio
Linux / macOS (bash o zsh):
cd ~/dev # o la carpeta que prefieras
git clone https://github.com/stivenson/cvlac-mcp.git
cd cvlac-mcp
Windows (PowerShell):
cd $HOME\dev # crea la carpeta antes si no existe: mkdir $HOME\dev
git clone https://github.com/stivenson/cvlac-mcp.git
cd cvlac-mcp
Paso 2 - Instalar dependencias y compilar
Igual en las tres plataformas:
npm install
npm run build
Verifica: debe existir el archivo de entrada compilado dist/index.js.
# Linux / macOS
ls dist/index.js
# Windows (PowerShell)
Test-Path dist\index.js # debe imprimir True
Paso 3 - Instalar el navegador de Playwright
El servidor automatiza CvLAC con Chromium headless. Descárgalo explícitamente (robusto en cualquier SO):
npx playwright install chromium
En Linux, si faltan librerías del sistema, instala también las dependencias nativas:
npx playwright install-deps chromium # requiere sudo en algunas distros
Paso 4 - Configurar variables de entorno (.env)
Copia la plantilla y edita los valores:
Linux / macOS:
cp .env.example .env
Windows (PowerShell):
Copy-Item .env.example .env
Edita .env con tus datos:
CVLAC_NOMBRE=TuNombre
CVLAC_CEDULA=TuDocumento
CVLAC_PASSWORD=TuPassword
CVLAC_SESSION_PATH=/ruta/a/tu/.cvlac-session.json
PORTFOLIO_URL=https://tu-usuario.github.io
Restringe los permisos del archivo (Linux/macOS):
chmod 600 .env
CVLAC_SESSION_PATH por plataforma (ejemplos):
- Linux:
/home/TU_USUARIO/.cvlac-session.json - macOS:
/Users/TU_USUARIO/.cvlac-session.json - Windows:
C:\\Users\\TU_USUARIO\\.cvlac-session.json
Paso 4b - Configurar tus valores por defecto (cvlac.config.json)
Varios formularios de CvLAC exigen campos que tu portafolio no tiene (municipio, intensidad horaria, idioma). Se declaran una vez aquí:
cp cvlac.config.example.json cvlac.config.json
{
"portfolioUrl": "https://tu-usuario.github.io",
"ownerNamePattern": "Tu Nombre",
"defaults": {
"municipio": { "nombre": "Bogotá", "codigoDane": "11001" },
"institucionFallback": "Universidad Nacional de Colombia",
"horasSemanales": 1,
"idioma": "ES",
"pais": "CO"
}
}
Todo es opcional. Si un valor falta, el campo se deja vacío y la respuesta trae un warning — el servidor no inventa datos para tu hoja de vida.
Paso 4c - Curar proyectos, software y eventos (data/portfolio-extra.json)
Estas tres secciones no se pueden leer del portafolio: necesitan metadatos que solo existen en CvLAC (tipo de proyecto, código DANE, códigos de enum). Se mantienen a mano:
cp data/portfolio-extra.example.json data/portfolio-extra.json
El archivo se valida al cargarse; si un ítem está mal formado, el servidor lo reporta y sigue con las demás secciones.
Paso 5 - Registrar el MCP en Cursor
El servidor corre por stdio y su entrypoint real es dist/index.js. Añádelo al archivo de configuración MCP de Cursor.
Ubicación del archivo mcp.json:
- Global — Linux/macOS:
~/.cursor/mcp.json· Windows:%USERPROFILE%\.cursor\mcp.json - Por proyecto —
<proyecto>/.cursor/mcp.json
Contenido (ajusta la ruta de args a tu sistema):
{
"mcpServers": {
"cvlac-mcp": {
"command": "node",
"args": ["/home/TU_USUARIO/dev/cvlac-mcp/dist/index.js"]
}
}
}
Ruta de args según el SO:
- Linux:
"/home/TU_USUARIO/dev/cvlac-mcp/dist/index.js" - macOS:
"/Users/TU_USUARIO/dev/cvlac-mcp/dist/index.js" - Windows:
"C:\\Users\\TU_USUARIO\\dev\\cvlac-mcp\\dist\\index.js"(usa dobles barras invertidas en JSON)
Deja las credenciales solo en
.env. El servidor lo carga desde su propio directorio, así que no hace falta repetirlas enmcp.json— y ese archivo suele estar en tu home sin permisos restringidos, o sincronizado entre máquinas. Si aun así las pones en el bloqueenv, ganan sobre.env.
Paso 6 - Verificar la instalación
Build y tests en verde:
npm run build npm testArranque del servidor (sanity check; queda esperando por stdio, ciérralo con
Ctrl+C):node dist/index.jsEn Cursor: reinicia/recarga, abre los ajustes de MCP y confirma que
cvlac-mcpaparece activo (indicador verde) y lista sus tools.Prueba funcional mínima desde el chat de Cursor, en este orden:
login(debe autenticar y persistir sesión)read_portfolio(debe devolver datos del portafolio)diff(debe reportarmissing/upToDate)
Si los tres responden sin error, el MCP quedó correctamente instalado y configurado.
Arquitectura
src/
├── index.ts # Entry point (dotenv + stdio transport)
├── server.ts # Registro de tools MCP
├── types.ts # Tipos de portfolio/CvLAC/diff/update
├── diff.ts # Motor de comparación (normalize + nameMatches)
├── browser/
│ ├── session.ts # Login, sesión persistente, Playwright context
│ └── navigation.ts # URLs de listas y formularios CvLAC
├── tools/
│ ├── login.ts
│ ├── read-cvlac.ts
│ ├── read-portfolio.ts
│ ├── diff.ts
│ ├── update-section.ts # add/update/delete por sección
│ ├── sync.ts
│ └── screenshot.ts
└── extractors/
├── portfolio.ts
└── cvlac/
formacion.ts experiencia.ts cursos.ts reconocimientos.ts
proyectos.ts software.ts eventos.ts
Tools MCP disponibles
login: autentica en CvLAC y persiste sesión.read_cvlac: lee una sección o todas (all) desde CvLAC.read_portfolio: obtiene y parsea el portafolio.diff: compara CvLAC vs portafolio y reporta cuatro grupos:missing,toUpdate,similar(parecidos a algo existente) yupToDate.update_section: aplica cambio puntual (add,update,delete). Devuelvestatus,warningspor campo y, si detecta un posible duplicado,needs_confirmationcon los candidatos.confirm_duplicate:truefuerza la creación.sync: ejecuta diff + aplicamissingytoUpdate(condry_runopcional). Lossimilarnunca se aplican solos.screenshot: captura pantalla del estado actual.inspect_form: inspecciona campos reales (input/select/textarea) de una URL CvLAC.
Secciones soportadas:
formacion, experiencia, cursos, reconocimientos, proyectos, software, eventos.
Variables de entorno
Definidas en .env (ver Paso 4):
| Variable | Descripción |
|---|---|
CVLAC_NOMBRE |
Nombre con el que inicias sesión en CvLAC |
CVLAC_CEDULA |
Documento de identidad |
CVLAC_PASSWORD |
Contraseña de CvLAC |
CVLAC_SESSION_PATH |
Ruta donde se guarda storageState para reusar sesión |
PORTFOLIO_URL |
Portafolio a comparar. También configurable como portfolioUrl en cvlac.config.json |
Opcionales:
| Variable | Descripción |
|---|---|
CVLAC_HEADLESS |
false abre el navegador para ver qué hace |
CVLAC_LOG_LEVEL |
debug | info (default) | warn | error | silent. Los logs van a stderr |
CVLAC_LOG_FILE |
Además de stderr, agrega cada línea a este archivo |
CVLAC_USER_AGENT |
Reemplaza el user-agent del navegador |
CVLAC_CONFIG_PATH |
Ubicación alterna de cvlac.config.json |
CVLAC_PORTFOLIO_EXTRA_PATH |
Ubicación alterna de portfolio-extra.json |
Uso local
Modo desarrollo (sin compilar)
npm run dev
Modo producción local (compilado)
npm run build
npm start
Flujo recomendado
loginsynccondry_run: true- Revisar el reporte con una persona: faltantes, a actualizar, parecidos y al día
- Resolver los parecidos uno a uno —
updatesobre el existente, oaddconconfirm_duplicate:true - Aplicar el resto:
syncsindry_run, oupdate_sectionpor ítem revisando loswarnings - Verificar con
read_cvlacde las secciones tocadas, oscreenshot
Si trabajas con Claude Code, la skill cvlac-sync del workspace cliente encapsula este flujo.
Diagrama
flowchart LR
portfolio["read_portfolio"] --> diffEngine
cvlacRead["read_cvlac"] --> diffEngine["diff"]
diffEngine --> syncTool["sync (dry_run / apply)"]
syncTool --> updateSection["update_section add/update/delete"]
Pruebas y build
npm test # suite completa: sin red, sin credenciales, sin CvLAC
npm run build
Los tests cubren extractores (contra fixtures HTML anonimizados), el motor de diff, los schemas, la carga de configuración, la redacción de secretos en logs y el reporte de sync. Los fixtures llevan datos ficticios a propósito: si capturas HTML real para uno nuevo, anonimízalo antes de commitear.
Comandos disponibles:
npm run dev
npm run test:watch
npm start
Troubleshooting
El MCP usa una versión vieja del código
- Asegúrate de ejecutar
npm run buildtras cambiarsrc/. - El cliente MCP ejecuta
dist/index.js, nosrc/index.ts.
cvlac-mcp no aparece en Cursor
- Verifica la ruta absoluta en
argsdelmcp.json(Paso 5) y quedist/index.jsexista. - En Windows, usa dobles barras invertidas (
\\) en las rutas dentro del JSON. - Reinicia/recarga Cursor tras editar
mcp.json.
Errores de Playwright al iniciar el navegador
- Ejecuta
npx playwright install chromium. - En Linux, añade dependencias del sistema con
npx playwright install-deps chromium.
Redirección inesperada a login
- La sesión pudo expirar. Ejecuta
loginnuevamente. - Verifica que
.env(o elenvdelmcp.json) tenga credenciales correctas.
Cambios no aplican en formularios
- Algunos campos de CvLAC son
readonlyy se setean por JS. - Usa
inspect_formyscreenshotpara validar nombres de campo reales. - Revisa
docs/cvlac-findings.mdcomo fuente de verdad.
Falsos faltantes en diff
nameMatches()normaliza acentos y sufijos (ej.(Platzi),- Aprobado ...).experienciaestá intencionalmente fuera del diff automático.
Seguridad y buenas prácticas
- No hardcodear credenciales.
- No commitear
.envni archivos de sesión/screenshot. - Correr primero
syncendry_run. - Para pruebas de escritura real en CvLAC, usar ítems dummy y luego eliminar.
Estado del proyecto
- Lectura de las 7 secciones verificada contra navegación real.
update_sectionsoportaadd/update/delete.dist/debe regenerarse tras cambios ensrc/.
Para detalles operativos de desarrollo interno, ver CLAUDE.md.
Estado y roadmap
Lectura de las 7 secciones, diff, bloqueo de duplicados y escritura add/delete están verificados contra el CvLAC real. update está implementado pero sin probar en vivo.
Detalle completo, limitaciones conocidas y lo que sigue: ROADMAP.md.
Hallazgos de navegación en vivo (URLs, columnas de tabla, nombres de campos, comportamiento de la sesión): docs/cvlac-findings.md.
Installing Cvlac
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/stivenson/cvlac-mcpFAQ
Is Cvlac MCP free?
Yes, Cvlac MCP is free — one-click install via Unyly at no cost.
Does Cvlac need an API key?
No, Cvlac runs without API keys or environment variables.
Is Cvlac hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Cvlac in Claude Desktop, Claude Code or Cursor?
Open Cvlac on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Playwright
Browser automation, scraping, screenshots
by MicrosoftPuppeteer
Browser automation and web scraping.
by modelcontextprotocolopentabs-dev/opentabs
Plugin-based MCP server + Chrome extension that gives AI agents access to web applications through the user's authenticated browser session. 100+ plugins with a
by opentabs-devrobhunter/agentdeals
1,500+ developer infrastructure deals, free tiers, and startup programs across 54 categories. Search deals, compare vendors, plan stacks, and track pricing chan
by robhunterCompare Cvlac with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All browse MCPs
