Resume Builder MCP

Crea, adapta y exporta currículums desde el chat: datos estructurados de CV, coincidencia con descripciones de empleo y renderizado compatible con ATS.

Documentación

mcp-resume

Servidor MCP para redacción de currículums y cartas de presentación, documentos CV en formato Word. Currículums y cartas de presentación como archivos Word desde un solo perfil, nunca inventados.

Funciona con Claude Desktop, Claude Code, Cursor y cualquier cliente del Model Context Protocol. Se ejecuta en tu propia máquina, o alojado sin instalación.

Página del producto: https://mcp.zovo.one/s/resume — qué hace, las herramientas que expone y un endpoint de token en vivo.

Instalación

Alojado, nada que instalar. Obtén un token de https://mcp.zovo.one/mcp/connect (la página de conexión) o https://mcp.zovo.one/mcp/token (el mismo token como JSON); se emite uno anónimo gratuito al instante y una clave Pro funciona igual. Luego apunta un cliente MCP a https://mcp.zovo.one/mcp/resume a través de streamable-http y envía el token como Authorization: Bearer <token>.

Si tu cliente no puede configurar cabeceras, coloca el token en la ruta en su lugar: https://mcp.zovo.one/mcp/resume/t/<token>. Ambas formas funcionan. La URL sin token responde 401 en tools/call, por lo que el token no es opcional.

Claude Desktop, un clic. Descarga resume.mcpb desde la última versión y haz doble clic en él.

Desde el código fuente. El espejo es autocontenido: cada dependencia @theluckystrike/* está incluida, por lo que un clon nuevo se compila sin configuración adicional.

git clone https://github.com/theluckystrike/mcp-resume.git
cd mcp-resume
npm install && npm run build

Luego apunta tu cliente al punto de entrada compilado:

{
  "mcpServers": {
    "resume": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-resume/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-resume aún no está publicado en npm, por lo que un comando npx -y @theluckystrike/mcp-resume fallará. Las tres rutas anteriores son las que funcionan y cada una es probada por CI.

resume demo

Espejo de solo lectura de mcp-servers/servers/resume. Consulta MIRROR.md.

Guarda los datos de tu CV una sola vez. Luego di "adapta mi currículum a esta oferta y escribe la carta de presentación" y obtén dos archivos .docx reales: un currículum cuyas viñetas se reordenan por relevancia a la oferta, recortadas para ajustarse al número de páginas que pediste, con las palabras clave de la oferta en negrita donde realmente las tienes, y una carta de presentación de una página que no afirma nada que no hayas puesto en tu perfil. Cuando falta un dato, la carta deja un aviso entre corchetes como [add: metric] en lugar de inventar un número. También lee un currículum existente .docx de vuelta a la forma del perfil, exporta markdown para un campo de ATS y escribe HTML imprimible. Todo se ejecuta localmente: sin subidas, sin cuenta, sin dependencias nativas.

En el Registro oficial de MCP (io.github.theluckystrike/resume-cover-letter-docx-generator).

Listado en el AI Product Index — endpoint remoto en vivo en mcp.zovo.one/s/resume, plan gratuito, sin registro.

Instalación en 60 segundos

La publicación en npm para @theluckystrike/mcp-resume está pendiente. Hasta entonces, el paquete de un clic .mcpb o un clon+compilación es la ruta que funciona, ambas verificadas abajo.

Un clic (.mcpb): descarga resume.mcpb desde la última versión y haz doble clic en Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

{
  "mcpServers": {
    "resume": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-resume"]
    }
  }
}

Claude Code:

claude mcp add resume -- npx -y @theluckystrike/mcp-resume

(.cursor/mcp.json):

{
  "mcpServers": {
    "resume": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-resume"]
    }
  }
}

La forma npx anterior empieza a funcionar en cuanto se publique el paquete. Hasta entonces, usa el paquete .mcpb de arriba, o compila desde el código fuente con exactamente estos tres comandos:

git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/docx -w servers/resume

Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/resume/dist/index.js. servers/docx está en esa lista de compilación porque este servidor comparte el motor de documentos con mcp-docx en lugar de llevar una segunda copia del mismo.

Para ejecutar en modo Pro, establece MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.

Herramientas

HerramientaQué hace
profile_setAlmacena los datos de los que se construye cada salida: nombre, correo, teléfono, ubicación, enlaces, resumen, habilidades, roles con viñetas, educación, certificaciones, idiomas. Un perfil por directorio de datos; Pro añade variantes con nombre
profile_getDevuelve el perfil almacenado como JSON, exactamente como lo ven las demás herramientas
resume_createEscribe el currículum como .docx. Las viñetas se clasifican por coincidencias de palabras clave y actualidad, luego se recortan a max_pages contra un presupuesto de palabras medido; las palabras clave coincidentes se ponen en negrita, las faltantes se informan y nunca se añaden. Estilos: modern, classic, compact
cover_letter_createUna carta de una página en cuatro partes — apertura, encaje, prueba, cierre — extraída solo del perfil. Tonos: formal, direct, warm. Las incógnitas vuelven como avisos [add: ...]
tailor_to_jobAnálisis de carencias frente a una oferta: las palabras clave que realmente pide, cuáles de ellas tu perfil ya cubre, cuáles no, una cifra de cobertura y reescrituras que solo reordenan datos que ya declaraste
resume_readLee un currículum existente .docx de vuelta a la forma del perfil, sección por encabezado. Mejor esfuerzo; nada se guarda a menos que save: true
resume_to_markdownEl currículum como markdown, para un formulario de solicitud o un campo de ATS
resume_to_htmlHTML imprimible con una hoja de estilos de impresión. Ábrelo e imprime a PDF
license_statusMuestra el modo gratuito o Pro
license_activateActiva una clave Pro (verificada sin conexión)

Recurso: resume://profile devuelve el perfil almacenado como JSON. Aviso: apply_to_job encadena tailor_to_job, resume_create y cover_letter_create contra una oferta, y hace que el modelo te informe de las carencias en lugar de rellenarlas.

La carta de presentación no inventa datos

Esta es la parte que importa, por lo que se aplica en lugar de solicitarse:

  • Cada línea de prueba en la carta es una viñeta textual de tu perfil. La carta nunca parafrasea una viñeta para convertirla en una afirmación más fuerte.
  • Una entrada highlights que pases se comprueba contra el perfil primero. Si el perfil no la respalda, se imprime como [add: "..." is not in your profile - add it there or drop it], no como una afirmación.
  • Antes de escribir el archivo, cada secuencia de dígitos en la carta se comprueba contra tu perfil y los argumentos que pasaste. Un número que no proviene de ninguno es una negativa, no una advertencia: la herramienta devuelve un error y no escribe nada. La descripción del puesto se excluye deliberadamente como fuente permitida: las cifras de ingresos, plantilla y rendimiento del empleador son suyas, y la carta nunca las repetirá como tuyas. La comparación es con números enteros, por lo que un perfil que contiene 2012 no autoriza una carta que afirme 12.
  • Cada viñeta de prueba se imprime bajo el rol al que realmente pertenece. Una carta que cita trabajo de dos empleadores imprime dos encabezados; el trabajo de un empleo anterior nunca se lista bajo el actual.
  • Una viñeta sin cifra recibe [add: metric] añadido, para que la carta te pida el resultado en lugar de adivinarlo.
  • Las palabras clave faltantes de tailor_to_job nunca se convierten en habilidades. La respuesta lo dice en palabras claras.

Lo que puedes decir

Tú dicesHerramienta
"Aquí está mi CV: Ada Rowe, ingeniera backend, Acme Pay desde 2021, ..."profile_set
"Lee mi currículum antiguo en ~/Documents/cv.docx y configura mi perfil."resume_read
"¿Qué tan bien encajo con esta oferta?"tailor_to_job
"Hazme un currículum de una página para este rol de Staff Engineer."resume_create
"Escribe la carta de presentación para Zeta Systems, tono directo."cover_letter_create
"Dame la versión en texto plano para el formulario de solicitud."resume_to_markdown
"Necesito un PDF para adjuntar."resume_to_html, luego imprime a PDF
"Aplícame a este trabajo."el aviso apply_to_job

Ejemplo práctico

You: Tailor my resume to this posting and write the letter. One page.

  tailor_to_job { job_description: "...payments platform, PostgreSQL, Kubernetes..." }
  -> matched: payments, postgresql, kubernetes   missing: rust
  -> coverage 75%

  resume_create { style: "modern", target_role: "Staff Engineer",
                  keywords: ["postgresql", "kubernetes", "rust"], max_pages: 1 }
  -> estimated_pages 1, words_used 402 of a 384-word budget for bullets
  -> bullets_dropped: ["Wrote the deployment pipeline"]
  -> keywords_missing: ["rust"]  (not added anywhere)
  -> ~/.local/share/mcp-servers/resume/documents/ada-rowe-resume.docx

  cover_letter_create { company: "Zeta Systems", role: "Staff Engineer", tone: "formal" }
  -> fills_required: ["[add: metric]"]
  -> ~/.local/share/mcp-servers/resume/documents/zeta-systems-staff-engineer-cover-letter.docx

Cómo funciona el recorte de páginas

No hay un motor de maquetación de páginas en JavaScript puro, por lo que este servidor no pretende medir uno. Usa un presupuesto de palabras en su lugar: una página A4 completa a 11pt Calibri con márgenes de 2cm contiene unas 520 palabras de texto del cuerpo, y un currículum gasta aproximadamente una séptima parte de esa página en encabezados, líneas en blanco y el bloque de contacto. La cifra neta es 450 palabras por página (540 para el estilo compact). El bloque de contacto, resumen, habilidades, encabezados de roles, educación, certificaciones e idiomas se cuentan primero; el presupuesto restante va a las viñetas de experiencia, con la puntuación más alta primero. Cada rol conserva su primera viñeta antes de que cualquier rol reciba una segunda, por lo que el recorte nunca deja un trabajo en la página sin nada debajo. La respuesta informa el presupuesto, las palabras usadas, el número estimado de páginas y cada viñeta que descartó, para que veas la decisión en lugar de descubrirla en Word.

La actualidad es parte de esa puntuación, y se lee del orden del array, no del texto start/end. profile_set aplica el orden que hace eso seguro: como sea que listes los roles al llamarlo, el perfil almacenado siempre termina del más reciente al más antiguo, un rol abierto sin end primero, luego por end descendente, luego por start descendente. Introduce los roles en cualquier orden; el orden almacenado (y la clasificación de viñetas de la carta en cover_letter_create) siempre es correcto.

Gratis vs Pro

GratisPro ($19 único pago)
Perfil, resume_create, resume_to_markdown, resume_to_htmlSí, ilimitadoSí, ilimitado
Estilos de currículummodernmodern, classic, compact
Cartas de presentación3 por mes calendarioIlimitadas
tailor_to_jobOfertas de hasta 2.000 caracteresCualquier longitud
Variantes de perfilUn perfilVariantes con nombre (backend, management, ...)
Color de membretePredeterminadoTu propio accent_color
Crédito de pie de página"Generado con mcp-docx por theluckystrike"Eliminado

Obtén Pro: https://mcp.zovo.one/buy/resume ($19 único pago, o $39 por el paquete completo).

Privacidad

Todos los datos permanecen locales. Tu CV nunca sale de la máquina: el servidor lee y escribe archivos en tu computadora, almacena el perfil bajo tu directorio de datos y no hace ninguna solicitud de red de ningún tipo, ni para licencias (las claves se verifican sin conexión), ni para fuentes, ni para telemetría.

Se combina con

  • mcp-docx, este servidor importa su motor de documentos (@theluckystrike/mcp-docx/lib); instala docx también cuando quieras propuestas, contratos y markdown a Word.
  • office-suite, varios servidores detrás de una sola instalación, una entrada de configuración.

Solución de problemas

  • npx se cuelga o no encuentra el paquete: la publicación en npm para este paquete está pendiente. Usa el paquete .mcpb o la ruta de clonar y compilar de arriba hasta que llegue.
  • "no profile stored": ejecuta profile_set una vez, o resume_read {path, save: true} desde un currículum existente.
  • El currículum descartó una viñeta que quería: sube max_pages, o pasa las palabras de la oferta en keywords para que la viñeta supere a las demás. bullets_dropped en la respuesta nombra cada una que no cupo.
  • Nombres de habilidades cortos: tailor_to_job conserva habilidades de dos y un carácter, Go, C, R, C#, C++, F#, Qt, UI, UX, QA, ML, AI, AR, VR, JS, TS, K8s, AWS, GCP, SQL, iOS, más cualquier palabra corta que aparezca en tu propia lista skills, y clasifica una habilidad conocida por encima de una palabra más larga de la misma frecuencia.
  • Una palabra clave que tengo se informa como faltante: la coincidencia es por límites de palabra, por lo que go no coincide con Google y k8s no coincide con Kubernetes. Añade la palabra exacta a tus habilidades si es verdad.
  • resume_read puso un rol en unparsed: los currículums no tienen esquema. Nada se descarta silenciosamente, corrige los campos y pásalos a profile_set.
  • No hay resume_to_pdf: toda ruta de JavaScript puro de Word a PDF necesita una dependencia nativa o una API en la nube. resume_to_html escribe HTML semántico con una hoja de estilos de impresión; imprime eso a PDF.
  • Versión de Node: requiere Node >= 18. Compruébalo con node -v.

Licencia MIT. Soporte: support@zovo.one Built by theluckystrike.

Un perfil de negocio para toda la suite

Tu identidad se almacena una sola vez, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json, y cada servidor de la suite la lee: el emisor de facturas, el membrete de docx, el emisor recurrente, la tasa de IVA predeterminada de expense-tracker, la zona horaria de time-tracker y timezone, y los membretes de currículum y contrato. Configúrala una vez con business_set (factura o docx): nunca la repites en ningún otro lugar. Una dirección de correo electrónico solo se toma de ese perfil o de un argumento explícito; cuando no hay ninguna almacenada, los documentos muestran [add: email] y la herramienta lo indica en lugar de permitir que alguien improvise una dirección.

Usa estos documentos como un servidor MCP

Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP, sin instalación: