ResumeTailor
Descripción general
MCP-Resume-Tailor es un sistema de servidor del Protocolo de Contexto de Modelos (MCP) que automatiza la edición de documentos a través de la API UNO de LibreOffice. Dos servidores MCP —un editor de documentos y un extractor de palabras clave de descripciones de puestos— se conectan a Claude Desktop, permitiendo la personalización de currículums impulsada por IA a partir de una conversación natural.
El editor preserva la fidelidad total del documento al operar directamente sobre archivos .odt a través del modelo de objetos de documento interno de LibreOffice, en lugar de convertir a formatos intermedios. Las secciones delimitadas por marcadores definen las regiones editables, y el contenido se reemplaza manteniendo el formato, los estilos y el diseño de la plantilla. El extractor de palabras clave analiza las descripciones de los puestos a través de la API de Claude y devuelve una salida estructurada clasificada en 5 niveles que guía el proceso de adaptación.
Stack tecnológico
Principios de diseño
1. Fidelidad del documento a través de la API nativa
Objetivo: Preservar el formato, los estilos y el diseño completos de la plantilla en cada edición.
En lugar de convertir documentos a Markdown o HTML —una transformación con pérdida—, el editor se conecta al puente UNO de LibreOffice a través de un socket local y opera sobre el modelo de documento en vivo. Los pares de marcadores delimitan las regiones editables. El reemplazo de contenido ocurre a nivel de objeto de documento, por lo que las fuentes, los estilos de párrafo, el espaciado y la estructura de la página se conservan exactamente como los diseñó el autor de la plantilla.
2. Diseño de herramientas nativas de MCP
Objetivo: Exponer la edición de documentos y la extracción de palabras clave como herramientas MCP de primera clase, no como envoltorios REST.
Ambos servidores están construidos directamente sobre FastMCP con esquemas de herramientas tipados. Claude Desktop los invoca a través del Protocolo de Contexto de Modelos: sin código de pegamento, sin inyección de prompts, sin coreografía de API. La IA decide cuándo y cómo llamar a cada herramienta basándose en el contexto de la conversación, combinando la salida de la extracción de palabras clave con la edición de documentos en una única sesión interactiva.
3. Despliegue agnóstico al transporte
Objetivo: Ejecutar localmente para desarrollo, contenerizado para fiabilidad: la misma superficie de herramientas MCP en ambos casos.
El modo local utiliza transporte stdio: Claude Desktop inicia el proceso de Python directamente. El modo Docker ejecuta ambos servidores detrás de Nginx, con scripts proxy que conectan el protocolo stdio de Claude Desktop a endpoints HTTP/SSE dentro del contenedor. La superficie de herramientas MCP es idéntica en ambos modos: sin cambios de código, sin diferencias de funciones.
Arquitectura
Local / stdio
Claude Desktop ──stdio──▶ resume_editor_server.py ──UNO──▶ LibreOffice (port 2002) ──▶ .odt
Claude Desktop ──stdio──▶ jd_keyword_extractor_mcp.py ──API──▶ Claude APIClaude Desktop inicia cada servidor MCP como un proceso hijo. El editor de documentos se conecta a una instancia de LibreOffice sin interfaz gráfica a través del puente UNO en el puerto 2002. El extractor de palabras clave llama a la API de Anthropic directamente.
Contenerizado / HTTP
Claude Desktop ──stdio──▶ macOS proxy ──HTTP──▶ Docker (Nginx)
├─ :5001 → Resume Editor MCP (port 8000, streamable-http)
├─ :5002 → JD Extractor MCP (port 9000, streamable-http)
└─ LibreOffice headless (port 2002, internal)Los scripts proxy de macOS traducen entre el protocolo MCP stdio de Claude Desktop y los endpoints HTTP/SSE contenerizados, gestionando la gestión de ID de sesión MCP y el análisis del flujo de eventos enviados por el servidor. Nginx enruta el tráfico al servicio interno correcto.
Superficie de herramientas MCP
Herramienta | Servidor | Descripción |
| Editor de documentos | Reemplaza el contenido en una única sección delimitada por marcadores |
| Editor de documentos | Actualiza múltiples secciones de forma atómica en una sola pasada |
| Editor de documentos | Lista todas las regiones de marcadores editables en la plantilla actual |
| Extractor de palabras clave | Analiza una descripción de puesto y devuelve clasificaciones de palabras clave estructuradas |
Secciones editables
El editor de documentos opera en regiones delimitadas por pares de marcadores. La plantilla actual expone:
Sección | Rango de marcadores |
Skills |
|
Summary |
|
WorkExperience1 |
|
WorkExperience2 |
|
WorkExperience3 |
|
Salida de extracción de palabras clave
La herramienta extract_jd_keywords devuelve un JSON estructurado con:
Palabras clave clasificadas en 5 niveles — críticas, altas, medias, bajas y deseables
Resumen de requisitos y contexto del rol
Herramientas, tecnologías y metodologías extraídas de la publicación
Responsabilidades principales y resultados deseados
Nivel del rol, alcance y contexto de la empresa
Problemas más difíciles resueltos
1. Fiabilidad del puente UNO de LibreOffice
Problema: La API UNO de LibreOffice requiere una instancia en ejecución sin interfaz gráfica con un socket abierto en el puerto 2002. Las caídas de conexión, los bloqueos de documentos y las fugas de estado del proceso son modos de fallo comunes en sesiones de larga duración.
Solución: El editor gestiona el ciclo de vida completo de la conexión: estableciendo el puente UNO, cargando documentos a través del protocolo URL, gestionando el estado de apertura/cierre y escribiendo en archivos de salida con marca de tiempo para evitar sobrescribir la plantilla. El despliegue en Docker utiliza una secuencia de inicio dedicada para garantizar que LibreOffice acepte conexiones antes de que el servidor MCP comience a manejar solicitudes.
2. Puente de transporte MCP (stdio a HTTP)
Problema: Claude Desktop solo admite transporte MCP basado en stdio. Los servicios contenerizados exponen endpoints HTTP. Estos son modelos de protocolo fundamentalmente diferentes con semánticas de flujo incompatibles.
Solución: Los scripts proxy personalizados (mac_proxy_resume_editor.py, mac_proxy_jd_extractor.py) cierran la brecha: leen mensajes JSON-RPC desde stdin, los reenvían como solicitudes HTTP al contenedor, analizan el flujo de respuesta SSE de vuelta a mensajes MCP y gestionan los ID de sesión a lo largo del ciclo de vida de la conexión. Claude Desktop ve un servidor stdio local; el contenedor ve clientes HTTP estándar.
3. Reemplazo de contenido preservando marcadores
Problema: Reemplazar texto entre marcadores en un documento .odt debe preservar la estructura del documento circundante —estilos de párrafo, formato de caracteres, diseño de página— sin corromper el XML subyacente.
Solución: La API UNO opera sobre el modelo de objeto de documento en vivo de LibreOffice, no sobre XML sin procesar. replace_bookmark_range_text() enumera el rango de texto entre marcadores emparejados (Section_Start / Section_End), elimina el contenido existente párrafo por párrafo e inserta nuevo contenido heredando los estilos de párrafo y carácter predeterminados de la plantilla.
Requisitos previos
Python 3.10+
LibreOffice con soporte UNO (
libreoffice-script-provider-python)Una plantilla de currículum
.odtcon pares de marcadores (ver Guía de configuración de marcadores)Para despliegue contenerizado: Docker y Docker Compose
Para extracción de palabras clave: Clave de API de Anthropic
Configuración local
git clone https://github.com/adi2355/MCP-Resume-Tailor.git
cd MCP-Resume-Tailor
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Link system UNO modules into venv
ln -s /usr/lib/python3/dist-packages/uno.py .venv/lib/python3.*/site-packages/uno.py
ln -s /usr/lib/python3/dist-packages/unohelper.py .venv/lib/python3.*/site-packages/unohelper.pyIniciar LibreOffice
soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &Configuración de Claude Desktop (stdio)
Añadir a su configuración de Claude Desktop:
{
"mcpServers": {
"LibreOfficeResumeEditor": {
"command": "/path/to/MCP-Resume-Tailor/.venv/bin/python",
"args": ["resume_editor_server.py"],
"cwd": "/path/to/MCP-Resume-Tailor"
},
"JDKeywordExtractor": {
"command": "/path/to/MCP-Resume-Tailor/.venv/bin/python",
"args": ["jd_keyword_extractor_mcp.py"],
"cwd": "/path/to/MCP-Resume-Tailor"
}
}
}Despliegue en Docker
docker compose up --buildConfigurar Claude Desktop para uso contenerizado:
{
"mcpServers": {
"LibreOfficeResumeEditor": {
"url": "http://localhost:5001"
},
"JDKeywordExtractor": {
"url": "http://localhost:5002"
}
}
}Consulte la Guía de despliegue de Docker y la Guía de configuración de macOS para obtener detalles específicos de la plataforma.
Documentación
Documento | Descripción |
Integración paso a paso de Claude Desktop con ejemplos de prompts | |
Configuración contenerizada, mapeo de puertos y gestión de servicios | |
Instalación específica de la plataforma y configuración de UNO | |
Pipeline de dos etapas: extracción de palabras clave de JD seguida de adaptación dirigida | |
Cómo añadir regiones de pares de marcadores a una plantilla |
MCP-Resume-Tailor/
├── resume_editor_server.py # MCP server: document section editing via UNO
├── jd_keyword_extractor_mcp.py # MCP server: JD keyword extraction via Claude API
├── edit_resume_uno.py # Core LibreOffice UNO API operations
├── container_api.py # Flask REST wrapper for container mode
├── mac_proxy_resume_editor.py # stdio → HTTP proxy (document editor)
├── mac_proxy_jd_extractor.py # stdio → HTTP proxy (keyword extractor)
├── docker-compose.yml # Multi-service container orchestration
├── Dockerfile # Ubuntu 22.04 + LibreOffice + Python
├── start_container_service.sh # Docker entrypoint script
├── start_resume_tailor_services.sh # Start both MCP services locally
├── requirements.txt # Python dependencies
├── claude_desktop_config.json # Claude Desktop config (stdio mode)
├── claude_desktop_config_docker.json # Claude Desktop config (HTTP/Docker mode)
├── CLAUDE_MCP_USAGE.md # Integration guide
├── DOCKER_README.md # Docker documentation
├── MACOS_SETUP.md # macOS setup guide
├── OPTIMIZED_SYSTEM_USAGE.md # Workflow documentation
└── setup_resume_bookmarks.md # Template bookmark guideThis server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/adi2355/File-Editor-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server