Skip to main content
Glama

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 API

Claude 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

update_resume_section

Editor de documentos

Reemplaza el contenido en una única sección delimitada por marcadores

update_multiple_resume_sections

Editor de documentos

Actualiza múltiples secciones de forma atómica en una sola pasada

get_available_sections

Editor de documentos

Lista todas las regiones de marcadores editables en la plantilla actual

extract_jd_keywords

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

Skills_StartSkills_End

Summary

Summary_StartSummary_End

WorkExperience1

WorkExperience1_StartWorkExperience1_End

WorkExperience2

WorkExperience2_StartWorkExperience2_End

WorkExperience3

WorkExperience3_StartWorkExperience3_End

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 .odt con 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.py

Iniciar 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 --build

Configurar 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

Guía de uso de Claude MCP

Integración paso a paso de Claude Desktop con ejemplos de prompts

Despliegue en Docker

Configuración contenerizada, mapeo de puertos y gestión de servicios

Configuración de macOS

Instalación específica de la plataforma y configuración de UNO

Flujo de trabajo optimizado

Pipeline de dos etapas: extracción de palabras clave de JD seguida de adaptación dirigida

Configuración de marcadores

Cómo añadir regiones de pares de marcadores a una plantilla .odt en LibreOffice


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 guide

-
security - not tested
F
license - not found
-
quality - not tested

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