Enables automated tailoring of resume documents by programmatically updating bookmarked sections through the LibreOffice UNO interface.
Facilitates the generation of customized .odt resume files from a master template, allowing for targeted updates to specific sections like skills, projects, and work experience.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ResumeTailorTailor my resume for this Data Scientist role focusing on Python and ML."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ResumeTailor
A toolkit for automatically tailoring your resume to specific job applications using LibreOffice. The system allows you to maintain a single resume template and quickly generate customized versions for different job applications.
Features
Update specific sections of your resume (skills, projects, work experience) for targeted job applications
Maintain a master template with all your achievements and experiences
Create new tailored resume files without modifying your original template
Use with Claude AI to automatically generate tailored content based on job descriptions
Command-line tools for direct customization
Containerized deployment for consistent execution across macOS and Linux
Prerequisites
LibreOffice installed (tested with LibreOffice Writer)
Python 3.10+ with venv support
libreoffice-script-provider-pythonsystem package installedA properly formatted
.odtresume with bookmarksFor containerized deployment: Docker and Docker Compose
Setup
Clone the repository
git clone https://github.com/yourusername/ResumeTailor.git cd ResumeTailorCreate and activate a virtual environment
python -m venv .venv source .venv/bin/activate # Linux/MacInstall dependencies
pip install -r requirements.txtSet up the UNO environment
Create symbolic links to the system's UNO modules:
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.pyReplace
python3.*with your actual Python version (e.g.,python3.12)
Prepare your resume template
Open your resume in LibreOffice Writer
Follow the instructions in
setup_resume_bookmarks.mdto add bookmarks
Usage
Method 1: Direct Python Script Usage
Start LibreOffice in headless mode
soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &Run one of the test scripts
# Update just the skills section ./test_skill_update.py # Update a project description ./test_canova_update.py ./test_project_update.py # Update multiple sections for a specific job ./tailor_for_job.pyCheck the output
The scripts create new
.odtfiles with names likeAdityak_For_TechCompany_DataScientist_20250401.odtOpen these files in LibreOffice Writer to see the changes
Method 2: Using with Claude AI (MCP)
Start the resume editor service
./start_resume_editor_service.shThis script starts LibreOffice in headless mode and runs the MCP server.
Configure Claude Desktop
Make sure you have Claude Desktop installed
Create or edit
claude_desktop_config.jsonin your home directory:
{ "mcpServers": { "libreOfficeResumeEditor": { "command": "/home/adi235/ResumeTailor/.venv/bin/python", "args": [ "resume_editor_server.py" ], "cwd": "/home/adi235/ResumeTailor" } } }Adjust paths as needed for your setup
Restart Claude Desktop
Close and reopen Claude Desktop to load the new configuration
Ask Claude to update your resume
Example prompts:
"What sections of my resume can you update?"
"Update my Skills section to focus on machine learning and Python for this data science role."
"Tailor my Project1 (Cannabis app) description to highlight the technical aspects for a Senior Developer position."
See CLAUDE_MCP_USAGE.md for more detailed instructions on using with Claude.
Method 3: Containerized Deployment (Cross-Platform)
The containerized deployment provides consistent execution across macOS and Linux systems without the need to install LibreOffice or UNO libraries on the host system. The container includes both the Resume Editor service and the JD Keyword Extractor service.
Ensure Docker and Docker Compose are installed
Docker Compose typically comes with Docker Desktop (macOS/Windows) or can be installed separately on Linux
Run the containerized application
./run_container.shThis script will:
Build the Docker image if it doesn't exist
Start the container in the background
Start both the Resume Editor (port 5001) and JD Keyword Extractor (port 5002) services
Map the ports to the host system
Create an
Outputdirectory on your host that maps to the container's output directory
Accessing the services
Resume Editor service:
http://localhost:5001JD Keyword Extractor service:
http://localhost:5002Generated resume files will appear in the
./Outputdirectory
Managing the container
# View container logs docker logs resume-tailor # Stop the container docker-compose down # Restart the container docker-compose restart resume-tailorConfigure Claude Desktop for containerized use
Use the provided
claude_desktop_config_docker.jsonfile:
# For macOS (adjust path as needed) cp claude_desktop_config_docker.json ~/claude_desktop_config.json # For Linux (adjust path as needed) cp claude_desktop_config_docker.json ~/.claude_desktop_config.jsonThis configuration points Claude Desktop to both services running in the container:
{ "mcpServers": { "LibreOfficeResumeEditor": { "url": "http://localhost:5001" }, "JDKeywordExtractor": { "url": "http://localhost:5002" } } }Restart Claude Desktop to apply the changes
How the services work together
The JD Keyword Extractor service analyzes job descriptions to extract key requirements and skills
The Resume Editor service then uses this information to tailor your resume specifically for the job
Claude can leverage both services to automate your job application process
Available Resume Sections
When asking Claude to update your resume, use these section names:
Skills: Technical skills section
Summary: Professional summary
Project1: Cannabis Tracking app (Canova)
Project2: RAG-Based-Brainstorming-Archive
Project3: Ethereum AI Agent
WorkExp1: IMPROSYS work experience
Troubleshooting
LibreOffice Connection Issues
Make sure LibreOffice is running in headless mode:
nc -z localhost 2002 || soffice --accept="socket,host=localhost,port=2002;urp;" --headless --norestore --nologo --nodefault &
UNO Module Errors
If you get
ModuleNotFoundError: No module named 'uno', check your symlinks:ls -la .venv/lib/python3.*/site-packages/uno.pyIf they're missing or incorrect, recreate them using the setup steps above
MCP Server Not Showing in Claude
Check if your
claude_desktop_config.jsonis correctly formattedVerify the paths in the config file are correct
Make sure both LibreOffice and the MCP server are running
Restart Claude Desktop completely
Bookmark Not Found Errors
Open your resume in LibreOffice Writer
Press F5 to open the Navigator
Verify that all required bookmarks exist
Check
setup_resume_bookmarks.mdfor the correct naming convention
Container Issues
Container fails to start:
Check Docker logs:
docker logs resume-tailorEnsure port 5001 isn't already in use:
netstat -tuln | grep 5001Verify Docker is running:
docker info
Cannot access the service:
Verify the container is running:
docker ps | grep resume-tailorCheck if the service is listening:
curl -v http://localhost:5001Restart the container:
docker-compose restart resume-tailor
Output files not appearing:
Check permissions on the
./OutputdirectoryVerify the volume mapping:
docker inspect resume-tailor | grep -A 10 Mounts
Project Structure
edit_resume_uno.py- Core LibreOffice UNO API interactionresume_editor_server.py- MCP server for Claude integrationstart_resume_editor_service.sh- Script to start LibreOffice and the MCP servertest_*.py- Test scripts for different resume sectionssetup_resume_bookmarks.md- Guide for adding bookmarks to your resumeCLAUDE_MCP_USAGE.md- Detailed instructions for using with Claude
License
MIT # ResumeTailor