aarangop/resume-mcp
If you are the rightful owner of resume-mcp and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
A Model Context Protocol (MCP) server designed for AI-powered resume tailoring, offering automated customization for job descriptions and optimized outputs for ATS systems.
Resume MCP Server
A Model Context Protocol (MCP) server for AI-powered resume tailoring. This service lets you tailor your resume/CV for specific job descriptions automatically, creating both Markdown and LaTeX/PDF versions optimized for ATS systems.
🚀 Features
- Resume Tailoring: Generate custom resumes targeting specific job descriptions
- LaTeX Support: Export to professional PDF format using LaTeX templates
- Obsidian Integration: Search and manage files from your Obsidian vault
- Career Guidance: Get feedback on your resume and career options
- MCP Protocol: Follows the Model Context Protocol for seamless AI integration
📋 Prerequisites
- Python 3.10 or higher
- Docker or Podman (for LaTeX compilation service)
- Node.js/npm (for MCP Inspector)
- Obsidian (optional, for vault integration)
- If not using Obsidian, you can use any directory on your file system, just
make sure to set the
OBSIDIAN_VAULT
variable in your.env
file.
- If not using Obsidian, you can use any directory on your file system, just
make sure to set the
⚙️ Installation
-
Clone the repository:
git clone https://github.com/yourusername/resume-mcp.git cd resume-mcp
-
Install the required Python dependencies:
pip install -r requirements.txt # Or using uv (recommended for better dependency resolution) uv pip install -e .
-
Start the LaTeX compilation server (required for PDF generation):
# Using Docker cd latex-compilation-server docker-compose up -d cd .. # OR using Podman cd latex-compilation-server podman-compose up -d cd ..
You can verify the server is running with:
curl http://localhost:7474/health
-
Install the MCP Inspector (for debugging/development):
npm install -g @modelcontextprotocol/inspector
Initial Repository Setup
If you cloned the repository without the --recursive
flag, you might need to
initialize the LaTeX compilation server submodule:
git submodule init
git submodule update
This ensures that you have the complete LaTeX compilation server code in the
latex-compilation-server
directory.
🔧 Configuration
Create a .env
file in the root directory with the following variables (or
configure them in your environment):
# Server configuration
SERVER_NAME="Resume Tailoring Server"
# File paths
BASELINE_RESUME_PATH="./templates/baseline_resume.md"
PROMPT_TEMPLATE_PATH="./templates/prompt_template.md"
LATEX_TEMPLATE_PATH="./templates/latex_template.tex"
OUTPUT_DIRECTORY="./templates/tailored_resumes"
# Obsidian vault configuration (optional)
OBSIDIAN_VAULT="/path/to/your/obsidian/vault"
# LaTeX compilation server configuration
LATEX_SERVER_URL="http://localhost:7474"
LATEX_OUTPUT_DIR="./templates/latex_output"
# Logging
LOG_LEVEL="INFO"
# Anthropic API key (if using Anthropic models)
ANTHROPIC_API_KEY="your_anthropic_api_key"
🏃♂️ Running the Server
Standard Mode
To run the server in standard mode:
python main.py
The server will start in stdio transport mode, which allows it to be connected to any MCP-compatible client.
With Inspector (Development/Debug Mode)
For development and testing, you can run the server with the MCP Inspector:
# Using the provided script
./inspect.sh
# Or manually
npx @modelcontextprotocol/inspector uv run main.py
Debugging Issues
If you're experiencing server problems, you can run the debug script:
python debug_server.py
This will perform various checks on your setup and help identify any issues.
🧠 Using the Resume MCP Server
The server provides several prompts and tools for resume tailoring:
Prompts
The easiest way to interact with the server is through the provided prompts:
- Tailor CV - Create a customized resume based on a job description
- Career Guidance - Get career advice and resume feedback
These prompts need templates to be present in your system, and configured through an .env file.
Alternatively, you can modify the prompts to make the LLM ask you for the required input. You can also make use of the MCP tools to access files in your file system with relevant information, such as your baseline resume or job descriptions.
Tools
-
Management Tools:
list_templates
: List available templatesget_baseline_resume
: Retrieve your baseline resume
-
Validation Tools:
validate_latex_template
: Check if your LaTeX template is validcheck_latex_server
: Check if the LaTeX compilation server is availablecheck_latex_server_status
: Get detailed status of the LaTeX serverstart_latex_server_help
: Get instructions for starting the LaTeX server
-
Obsidian Tools:
search_obsidian
: Search files in your Obsidian vaultread_obsidian_file
: Read content from an Obsidian file
-
CV Tools:
save_tailored_cv
: Save a tailored CV in Markdown formatgenerate_latex_cv
: Convert a tailored CV to LaTeX/PDF using the secure containerized LaTeX compilation server
🖨️ LaTeX Compilation Server
This project includes a containerized LaTeX compilation service that securely
generates PDF files from LaTeX documents without requiring LaTeX installation on
your local system. The service runs as a separate microservice in a Docker
container and is included in this repository as a submodule in the
latex-compilation-server
directory.
Benefits:
- Security: Isolates LaTeX compilation in a Docker container, preventing potential system command exploitation
- Consistency: Works the same across all platforms (macOS, Windows, Linux)
- Simplified Setup: No need to install LaTeX and its dependencies locally
How it Works:
- The MCP server sends LaTeX content to the containerized HTTP service
- The service compiles the document in an isolated environment
- The compiled PDF is returned to the MCP server
- The PDF is saved to your specified output directory
For detailed architecture information, see
Management:
Start/stop the service with Docker:
cd latex-compilation-server
docker-compose up -d # Start server
docker-compose down # Stop server
docker-compose logs -f # View logs
Or with Podman:
cd latex-compilation-server
podman-compose up -d # Start server
podman-compose down # Stop server
podman-compose logs -f # View logs
🛡️ Security Considerations
LaTeX Compilation Security
This project uses a containerized LaTeX compilation service rather than direct system calls for several security reasons:
- Isolation: The LaTeX compilation process runs in a Docker container, isolated from the host system
- No Shell Commands: The MCP server never executes shell commands directly, preventing potential command injection
- Sandboxed Environment: LaTeX code runs in a controlled environment with limited permissions
- API-based Interaction: All communication happens through a well-defined HTTP API rather than shell execution
- Stateless Processing: Files are not persisted in the container beyond compilation
This architecture ensures that even if a malicious LaTeX document were to be submitted, it would not be able to access or affect your host system.
📄 Template Files
Baseline Resume
Your starting resume in Markdown format from which tailored versions are created. The project includes a sample baseline resume that you can modify with your information.
LaTeX Template
LaTeX template for generating professional PDFs. The template must include
required placeholders (like $name
, $profile
, $technical_skills
, etc.) that
will be replaced with the corresponding sections from your tailored resume.
📚 Example Workflow
- Set up your baseline resume in
templates/baseline_resume.md
- Configure your LaTeX template in
templates/latex_template.tex
- Start the LaTeX compilation server:
cd latex-compilation-server docker-compose up -d cd ..
- Run the MCP server:
python main.py
- Connect with an MCP client (such as an integrated LLM)
- Submit a job description to the "Tailor CV" prompt
- Generate a LaTeX/PDF version using the CV tools
- Review and use your tailored resume!
🔍 Troubleshooting
Common Issues & Solutions
LaTeX Template Issues
If you see warnings about missing placeholders in your LaTeX template, check
that it includes all required fields like $name
, $profile
,
$technical_skills
, etc.
Initialization Problems
If you encounter
RuntimeError: Received request before initialization was complete
:
- Add a small delay after importing components
- Check your import structure in
resume_mcp/mcp/__init__.py
- make sure all components are properly imported - Try running with the debug server to identify specific issues:
python debug_server.py
MCP Connection Issues
If clients cannot connect to the server:
- Check that stdio transport is working correctly
- Verify that all required components are imported
- Run with the inspector for detailed logs:
./inspect.sh
Obsidian Integration Issues
If Obsidian integration isn't working:
- Verify the
OBSIDIAN_VAULT
path in your.env
file - Check file permissions for the Obsidian vault directory
- Test basic Obsidian operations through the debug server
LaTeX Compilation Server Issues
If PDF generation is failing:
-
Check if the LaTeX server is running:
curl http://localhost:7474/health
-
If not running, start it:
cd latex-compilation-server docker-compose up -d
-
Check server logs if you encounter issues:
docker-compose logs latex-server
-
If you need to restart the server:
docker-compose restart latex-server
-
Verify your
.env
file has the correct server URL:LATEX_SERVER_URL="http://localhost:7474"
Advanced Debugging
For more detailed debugging:
- Set
LOG_LEVEL="DEBUG"
in your.env
file - Run the server with the inspector to get detailed logs
- Check
inspect.log
for error messages and execution flow - Use the
debug_server.py
script to verify component initialization
🧩 Extending the Server
Adding New Prompts
Create new prompt files in the resume_mcp/mcp/prompts
directory:
from resume_mcp.mcp.base import mcp
@mcp.prompt(name="My Custom Prompt")
def my_custom_prompt():
return {
"description": "Description of what this prompt does",
"prompt": "Your prompt template here"
}
Adding New Tools
Create new tool files in the resume_mcp/mcp/tools
directory:
from resume_mcp.mcp.base import mcp
@mcp.tool()
def my_custom_tool(param1, param2=None):
"""Documentation for the tool.
Args:
param1: Description of param1
param2: Description of param2
"""
# Tool implementation
return {"result": "Tool output"}
Custom Templates
You can create custom LaTeX templates in the templates/
directory. Make sure
to:
- Include all required placeholders
- Test with the validation tool
- Update your
.env
configuration to use the new template
📜 License
This project is licensed under the MIT License - see the LICENSE file for details.