Resume Tailor MCP Server
Click on "Deploy 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., "@Resume Tailor MCP ServerTailor my resume for this senior software engineer JD and list gaps."
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.
Resume Tailor MCP Server π
An open-source, local-first Model Context Protocol (MCP) server that tailors your resume to any job description. It extracts Job Description (JD) keywords, performs deterministic gap and ATS compliance analysis, manages versioned resume states, and compiles publication-quality PDFs (with LaTeX source) directly inside your AI chat contextβwith zero external API keys or recurring subscription fees.
π Table of Contents
Related MCP server: Resume Generator MCP Server
π‘ What It Does
resume-tailor-mcp connects your favorite AI agent (Claude Desktop, Claude Code, Codex, Cursor, Windsurf) to a local resume optimization engine:
Deterministic JD Keyword Extraction: Automatically scans job postings for required skills, frameworks, tools, seniority level, and years of experience without hallucinations.
Gap Analysis & Proof Matching: Categorizes keywords into:
Matched: Validated with quantifiable proof in your experience or project bullets.
Weak: Listed in your skills section but absent from your actual project/work achievements.
Missing: Completely absent from your current resume.
Automated ATS & Etiquette Auditing: Scrutinizes resume structure against Ivy League career-center guidelines (action verbs, quantifiable metrics, bullet length, eliminating cliches like "responsible for" or "team player", and stripping risky personal identifiers).
Intelligent Layout Recommendation: Scores and selects the optimal resume template based on the JD's seniority and domain requirements.
Direct In-Chat PDF & LaTeX Delivery: Compiles the popular "Jake's Resume" LaTeX format via a bundled offline TeX engine (
tectonic), streaming both the raw.texsource and binary.pdfstraight into the conversation window.Local-First & Private: Your resume and job history remain stored locally on your machine in human-readable YAML.
βοΈ How It Works
When connected via the Model Context Protocol over stdio, the server acts as an intelligent intermediary between your local filesystem and the AI LLM:
State Exposure via URIs: The server exposes your canonical master resume (
resume://master), saved variations (resume://versions/{id}), templates (resume://templates), and career writing rules (resume://etiquette) as browsable MCP resources.Deterministic Tool Pipeline: Instead of letting an LLM guess your ATS compatibility, the server uses deterministic Python algorithms (
lib/matching.py,lib/keywords.py,lib/ats.py) to compute reproducible scores and concrete keyword deltas.Contextual In-Chat Rewrite: The LLM uses the gap analysis and writing rules to rewrite relevant bulletsβpreserving factual accuracy while maximizing JD alignment.
Instant Compilation & Delivery: Once validated, the server compiles the updated resume using
tectonicinto an ATS-friendly, single/two-page PDF and provides the downloadable artifact directly inside the chat.
ποΈ Architecture
flowchart TB
subgraph Clients["MCP Clients (LLM Interface)"]
CD["Claude Desktop"]
CC["Claude Code CLI"]
CX["OpenAI Codex / Agents"]
IDE["Cursor / Windsurf / Cline"]
end
subgraph FastMCPServer["Resume Tailor MCP Server (server.py)"]
direction TB
subgraph ResourcesLayer["MCP Resources"]
R1["resume://master"]
R2["resume://sections/{name}"]
R3["resume://versions/{id}"]
R4["resume://templates"]
R5["resume://etiquette"]
R6["jd://history/{id}"]
end
subgraph ToolsLayer["MCP Tools & Prompts"]
T1["parse_resume"]
T2["extract_jd_keywords"]
T3["match_resume_to_jd"]
T4["tailor_resume"]
T5["score_ats"]
T6["recommend_template"]
T7["export_resume"]
T8["diff_versions"]
P1["tailor_resume_workflow"]
P2["quick_ats_check"]
end
subgraph CoreEngine["Deterministic Core Engine (lib/)"]
PARSER["lib/parsing.py\n(PDF/DOCX/MD/TXT)"]
NLP["lib/keywords.py & matching.py\n(Deterministic Gap Analysis)"]
ATS["lib/ats.py\n(Etiquette & ATS Rules)"]
TMPL["lib/templates.py\n(Template Scorer)"]
LATEX["lib/latex.py & export.py\n(LaTeX & Docx Generator)"]
end
end
subgraph LocalStorage["Local Storage (data/ & resources/)"]
MR["resources/master_resume.yaml"]
ET["resources/resume_etiquette.yaml"]
VH["data/versions/*.yaml"]
JH["data/jd_history/*.json"]
EXP["data/exports/ (*.pdf, *.tex, *.docx)"]
end
subgraph BinaryEngine["Typesetting Engine (bin/)"]
TEC["bin/tectonic (Standalone TeX Engine)"]
end
Clients <-->|MCP stdio Protocol| FastMCPServer
ToolsLayer --> CoreEngine
ResourcesLayer --> LocalStorage
CoreEngine --> LocalStorage
LATEX --> TEC
TEC --> EXPSubsystem Breakdown
Module | Location | Purpose |
Server Controller |
| FastMCP entrypoint exposing resources, tools, and guided prompts. |
Parsing Pipeline |
| Multi-format parser supporting Markdown, |
Keyword & Matching Engine |
| Deterministic token extraction, seniority parsing, and 3-way proof matching. |
ATS & Etiquette Validator |
| Structural validation enforcing Ivy-League bullet conventions, character counts, and eliminating buzzwords. |
Template Scorer |
| Scored matrix matching candidate profile and JD demands to 5 specialized layouts. |
Typesetting & Exporter |
| Renders clean LaTeX code and invokes |
π Installation & Quick Start
Prerequisites
Python 3.10+
macOS, Linux, or Windows (WSL / Native)
1. Install Python Dependencies
Clone the repository and install the required dependencies:
git clone https://github.com/priyanshu-arya/Resume-Tailor-MCP.git
cd Resume-Tailor-MCP
# Recommended: Create a virtual environment
python3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install requirements
pip install -r requirements.txt2. Download the Tectonic LaTeX Engine
PDF export uses Tectonic, a self-contained LaTeX engine that requires no system TeX Live or MacTeX installation:
# macOS (Apple Silicon - M1/M2/M3/M4):
curl -L -o /tmp/tectonic.tar.gz "https://github.com/tectonic-typesetting/tectonic/releases/download/tectonic%400.17.0/tectonic-0.17.0-aarch64-apple-darwin.tar.gz"
mkdir -p bin && tar -xzf /tmp/tectonic.tar.gz -C bin && chmod +x bin/tectonic
# macOS (Intel x86_64):
curl -L -o /tmp/tectonic.tar.gz "https://github.com/tectonic-typesetting/tectonic/releases/download/tectonic%400.17.0/tectonic-0.17.0-x86_64-apple-darwin.tar.gz"
mkdir -p bin && tar -xzf /tmp/tectonic.tar.gz -C bin && chmod +x bin/tectonic
# Linux (x86_64):
curl -L -o /tmp/tectonic.tar.gz "https://github.com/tectonic-typesetting/tectonic/releases/download/tectonic%400.17.0/tectonic-0.17.0-x86_64-unknown-linux-musl.tar.gz"
mkdir -p bin && tar -xzf /tmp/tectonic.tar.gz -C bin && chmod +x bin/tectonicNote on First PDF Run: The first time you export a PDF, Tectonic will download and cache the necessary LaTeX packages (requires internet access once). Subsequent compilations run completely offline in milliseconds.
3. Add Your Master Resume
You have two options:
Automated Import: Place your existing
.pdf,.docx, or.mdresume on your machine and ask your AI assistant to runparse_resume(file_path="/path/to/resume.pdf").Direct YAML Editing: Edit
resources/master_resume.yamldirectly using any text editor.
π Client Integration Guides
1. Claude Desktop
Open Claude Desktop.
Navigate to Settings -> Developer -> Edit Config to open
claude_desktop_config.json:macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Add
resume-tailorto themcpServersblock (use the absolute path to your repo and virtualenv python):
{
"mcpServers": {
"resume-tailor": {
"command": "/absolute/path/to/resume-tailor-mcp/.venv/bin/python",
"args": [
"/absolute/path/to/resume-tailor-mcp/server.py"
]
}
}
}Completely restart Claude Desktop (Cmd+Q on macOS or exit from system tray on Windows).
Open a new chat. You will see the π icon with
resume-tailortools and resources active!
2. Claude Code (CLI)
Add resume-tailor directly to your Claude Code environment using the claude mcp add command:
# Add the server using your virtualenv Python interpreter
claude mcp add resume-tailor -- /absolute/path/to/resume-tailor-mcp/.venv/bin/python /absolute/path/to/resume-tailor-mcp/server.pyAlternatively, add it to your project-level .mcp.json or global Claude Code settings:
{
"mcpServers": {
"resume-tailor": {
"command": "/absolute/path/to/resume-tailor-mcp/.venv/bin/python",
"args": ["/absolute/path/to/resume-tailor-mcp/server.py"]
}
}
}Using it in Claude Code:
claude "Tailor my master resume to the job description in job_posting.txt and export as a PDF."3. OpenAI Codex & Custom MCP Clients
For OpenAI Codex CLI, custom agents, or Python MCP host runners, start the server as a subprocess via standard input/output (stdio):
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
server_params = StdioServerParameters(
command="/absolute/path/to/resume-tailor-mcp/.venv/bin/python",
args=["/absolute/path/to/resume-tailor-mcp/server.py"],
env=None
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Call deterministic matching or gap analysis
match_result = await session.call_tool(
"match_resume_to_jd",
arguments={"jd_text": "Looking for a Senior Python / FastAPI engineer with AWS experience."}
)
print(match_result)4. Cursor / Windsurf / Cline / VS Code IDEs
To enable resume-tailor in modern AI-integrated IDEs:
Cursor (~/.cursor/mcp.json or .cursor/mcp.json)
{
"mcpServers": {
"resume-tailor": {
"command": "/absolute/path/to/resume-tailor-mcp/.venv/bin/python",
"args": ["/absolute/path/to/resume-tailor-mcp/server.py"]
}
}
}Windsurf (~/.codeium/windsurf/mcp_config.json)
{
"mcpServers": {
"resume-tailor": {
"command": "/absolute/path/to/resume-tailor-mcp/.venv/bin/python",
"args": ["/absolute/path/to/resume-tailor-mcp/server.py"]
}
}
}Cline (VS Code Extension)
Open Cline Settings -> MCP Servers -> Edit cline_mcp_settings.json and paste the resume-tailor definition above.
π» How to Use This Repository (Step-by-Step Guide)
Repository Layout & Where Files Live
resume-tailor-mcp/
βββ server.py # Main MCP server (FastMCP entrypoint)
βββ requirements.txt # Python dependencies (mcp, pyyaml, python-docx, pdfplumber)
βββ bin/
β βββ tectonic # Bundled standalone TeX compiler (downloaded once)
βββ resources/
β βββ master_resume.yaml # π YOUR CANONICAL RESUME (edit or parse into this)
β βββ resume_etiquette.yaml # Ivy League / ATS formatting rules & quality gates
β βββ templates/ # Layout definitions (Classic Minimalist, etc.)
βββ data/
β βββ versions/ # Saved tailored resume versions (*.yaml)
β βββ jd_history/ # Saved job descriptions & keyword caches
β βββ exports/ # Generated PDFs, LaTeX (.tex), and Word (.docx) files
βββ lib/ # Deterministic scoring, parsing, matching, and LaTeX modulesCore Workflows & Example Prompts
Once resume-tailor is connected to your MCP client (Claude Desktop, Claude Code, Cursor, Windsurf, or Codex), you interact with it using natural language. Here are the core user flows:
Workflow 1: Import Your Existing Resume
If you have an existing resume in .pdf, .docx, .md, or .txt:
You prompt: "Please import my resume from
/path/to/my_resume.pdfas my master resume."What happens: The server executes
parse_resume, extracts your contact details, summary, experience bullets, education, skills, and projects, and writes the structured data toresources/master_resume.yaml.
Workflow 2: Tailor Resume to a Job Posting (Full End-to-End Flow)
When you have a target job posting and want a tailored, compiled PDF:
You prompt:
"Tailor my master resume to this Job Description for the Staff Software Engineer role at Stripe. Extract keywords, score the gap, rewrite the bullets honestly, run an ATS check, and export the final PDF:[Paste Job Description Here]"
What happens step-by-step:
The agent reads
resume://etiquettefor bullet rewriting and ATS rules.The agent runs
match_resume_to_jdto identify Missing and Weak keywords.The agent retrieves
get_master_resumeand rewrites bullet points to highlight your relevant experience using the Google XYZ formula.The agent calls
tailor_resume(save_as="stripe-staff-eng-2026", ...)to persist the new version.The agent runs
score_atsto confirm zero formatting or etiquette violations.The agent calls
export_resumewithformat="pdf". Tectonic compiles the LaTeX template and returns both the binary PDF directly in chat and the LaTeX source code.
Workflow 3: Quick ATS & Keyword Gap Check (Audit Only)
If you just want to see how well your master resume matches a JD before making changes:
You prompt:
"Perform a quick ATS and keyword gap analysis of my master resume against this job posting without modifying anything yet:[Paste Job Description Here]"
What happens: The server executes
match_resume_to_jdandscore_ats, returning your keyword match percentage, missing must-haves, weak skills, and structural ATS checklist.
Workflow 4: Review Diffs Between Tailored Versions
To see exactly what changed between your original master resume and a tailored version:
You prompt: "Show me the diff between my 'master' resume and the 'stripe-staff-eng-2026' version."
What happens: The server runs
diff_versions(version_a="master", version_b="stripe-staff-eng-2026")and outputs a color-coded unified diff showing line-by-line bullet changes.
Workflow 5: Export to Other Formats (DOCX, Markdown, TeX)
To export an existing tailored version to Microsoft Word or plain Markdown:
You prompt: "Export version 'stripe-staff-eng-2026' as a docx file."
What happens: The server generates the Word document and saves it under
data/exports/stripe-staff-eng-2026.docx.
Developer & Standalone Python Usage
You can also run, test, and develop with this repository directly without an LLM:
1. Test Server with MCP Inspector
Inspect and interactively test all tools and resources in your browser:
npx @modelcontextprotocol/inspector .venv/bin/python server.py2. Run Direct Python Scripts
You can import the core libraries directly in Python scripts:
from lib import storage, matching, ats, export
# 1. Load your master resume
resume = storage.load_master()
print(f"Loaded resume for: {resume.get('name')}")
# 2. Score ATS compliance
ats_report = ats.score_ats(resume)
print(f"ATS Score: {ats_report['score']}/{ats_report['max_score']}")
if ats_report['issues']:
print("Issues found:", ats_report['issues'])
# 3. Match against a sample job description
sample_jd = """
We are looking for a Senior Backend Engineer proficient in Python, FastAPI,
PostgreSQL, Docker, Kubernetes, and AWS to lead our microservices architecture.
"""
gap_analysis = matching.match_resume_to_jd(resume, sample_jd)
print(f"Keyword Score: {gap_analysis['score']}%")
print(f"Matched: {gap_analysis['matched']}")
print(f"Missing: {gap_analysis['missing']}")
print(f"Weak (skills only): {gap_analysis['weak']}")
# 4. Compile directly to PDF using Tectonic
pdf_path = export.to_pdf(resume, "data/exports/manual_build.pdf", "classic-minimalist")
print(f"Compiled PDF to: {pdf_path}")π How to Achieve Maximum Value
The 5-Step Optimal Tailoring Cycle
ββββββββββββββββββββββββ
β 1. Ingest Master β βββ Import your complete career history
ββββββββββββ¬ββββββββββββ
βΌ
ββββββββββββββββββββββββ
β 2. Analyze JD Gap β βββ Identify Missing & Weak keywords
ββββββββββββ¬ββββββββββββ
βΌ
ββββββββββββββββββββββββ
β 3. Guided Rewrite β βββ Apply Action Verbs + Google XYZ formula
ββββββββββββ¬ββββββββββββ
βΌ
ββββββββββββββββββββββββ
β 4. ATS Audit β βββ Verify character density & formatting
ββββββββββββ¬ββββββββββββ
βΌ
ββββββββββββββββββββββββ
β 5. LaTeX Compile β βββ Export publication-ready PDF + .tex
ββββββββββββββββββββββββMaintain a Rich Master Resume (
resume://master): Store every project, tool, accomplishment, and metric you've ever achieved in your master resume. The more raw material available, the more effectively the agent can pull authentic evidence.Execute the Workflow Prompt: Use the built-in
tailor_resume_workflowprompt:"Tailor my resume for the Senior Software Engineer position at Stripe using this job description..."
Target 85%+ Proof Match: Move critical keywords from "Missing" or "Weak" into "Matched" by rephrasing past accomplishments to highlight the tools requested by the employer.
Run
score_atsQuality Check: Ensure zero weak openers ("helped with", "worked on") and verify bullets are under 220 characters.Receive Direct PDF Artifact: The server compiles and presents the
.pdfand.texsource directly inside the chat window.
The "Proof vs. Mention" Rule
Many ATS scanners and technical recruiters dismiss keywords that only appear in a skills list without supporting context:
β Weak (Skills-Only): Listing
Kubernetesin your Skills section without mentioning it anywhere in your job bullet points.β Matched (Proven): "Architected and deployed multi-region Kubernetes clusters on AWS EKS, reducing deployment latency by 45%."
resume-tailor-mcp automatically detects this distinction and provides both an ats_visible_score and a real score (proof-backed).
The Harvard/Ivy Action Verb Bullet Formula
Every bullet point should follow the proven Google XYZ / Harvard Career Service model:
$$\text{Accomplished } [X] \text{ as measured by } [Y] \text{ by doing } [Z]$$
Weak: "Responsible for improving web application performance."
Strong: "Engineered full-stack Redis caching layer and optimized SQL query plans, cutting p99 API response latency by 35% across 2M daily active users."
The No-Fabrication Golden Rule
As codified in resume://etiquette:
Never fabricate metrics, certifications, titles, or technical competencies. Tailoring is about surfacing the most relevant authentic truth, re-ordering sections for impact, and aligning your genuine terminology with the employer's vocabulary.
Diffing & Version Management
Keep tailored resumes organized per company and date. You can review the exact unified diff at any time:
# In chat: "Show diff between master and stripe-senior-swe"
# Calls diff_versions(version_a="master", version_b="stripe-senior-swe")π MCP Surface Reference
Resources (URI-Addressable)
URI | Description | Output Format |
| Canonical master resume. | YAML |
| Individual section ( | YAML |
| Previously saved tailored resume version. | YAML |
| List of all available layout templates and matching notes. | YAML |
| Detailed metadata and configuration for a specific template. | YAML |
| Standard resume rules, bullet formulas, and quality gates. | Markdown/YAML |
| Saved job description and extracted keywords. | YAML |
Tools (Deterministic Actions)
Tool Name | Parameters | Description |
|
| Parses a |
| None | Retrieves the complete master resume dictionary for editing. |
|
| Deterministically extracts must-have/nice-to-have keywords, seniority, and years of experience. |
|
| Computes keyword gap analysis ( |
|
| Validates and saves a new tailored resume version. |
|
| Computes a unified diff between two saved resume versions. |
|
| Audits structural ATS compliance, formatting, bullet length, and etiquette rules. |
| None | Lists all available resume layout templates. |
|
| Scores each layout template against JD requirements to pick the best match. |
|
| Compiles and returns binary PDF + LaTeX source directly in the chat, or exports DOCX/MD/TXT. |
| None | Returns a list of all saved tailored resume version IDs. |
| None | Returns a list of all saved job description IDs. |
Prompts (Guided Workflows)
tailor_resume_workflow(jd_text, company, role): Complete multi-step agent flow that reads etiquette rules, performs keyword matching, executes truthful bullet rewrites, audits ATS scoring, and compiles the final PDF.quick_ats_check(jd_text, version): Instant diagnostic that scores keyword coverage and checks ATS formatting without altering any resume text.
π¨ Resume Layout Templates
Template ID | Name | Best Suited For | LaTeX/PDF Output |
| Classic Minimalist ("Jake's Resume") | Software Engineers, Data Scientists, General Tech Roles. Maximizes information density and ATS parse rate. | Yes (Bundled TeX) |
| Full-Stack Modern | Full-Stack/Web Developers with notable certifications and dense technical skills. | DOCX / MD / TXT |
| Student / Early Career | Internships, New Grads, coursework, and competitive programming achievements. | DOCX / MD / TXT |
| Generic Minimal | Safe, clean, content-agnostic fallback for non-technical or hybrid roles. | DOCX / MD / TXT |
| Metrics Driven | Senior, Staff, Lead, and Product Engineering roles highlighting scale and business impact. | DOCX / MD / TXT |
π οΈ Troubleshooting
Verify that
claude_desktop_config.jsoncontains valid JSON (ensure no trailing commas).Verify the Python executable path points to your virtualenv (
.venv/bin/python).Fully restart Claude Desktop (use
Cmd+Qon macOS or kill the process from Task Manager).
Check that the executable exists at
bin/tectonicand has execute permissions (chmod +x bin/tectonic).Run
./bin/tectonic --versionfrom the repository root to verify compatibility.
Tectonic downloads minimal LaTeX packages on its very first run. Ensure you have internet access for the initial compile. Subsequent compiles are instantaneous and 100% offline.
Run
python3 server.pydirectly from your terminal inside the virtual environment to identify any missing packages:source .venv/bin/activate pip install -r requirements.txt
π€ Contributing & Community
Contributions are welcome! Whether you are adding a new LaTeX resume template, improving keyword extraction heuristics, or adding support for additional MCP clients:
Fork the Repository
Create a Feature Branch (
git checkout -b feature/amazing-template)Commit Your Changes (
git commit -m "Add modern sidebar LaTeX template")Push to the Branch (
git push origin feature/amazing-template)Open a Pull Request
Areas for Contribution
Additional LaTeX templates (e.g., Deedy Resume, Modern CV).
Multilingual keyword matching and JD parsing.
Integration plugins for additional developer IDEs and agents.
π License
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2026 Priyanshu Arya
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
...This server cannot be deployed
Maintenance
Related MCP Connectors
Resume builder with native MCP β create and edit resumes from your AI assistant.
Generate tailored, ATS-optimized resume PDFs and cover letters from a job description, over MCP.
Tailor resumes, generate cover letters, render CVs as PDF, and browse 22+ templates.
Analyze job listings against your resume, track applications, and generate cover letters.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAutomates resume tailoring by formatting job descriptions, using AI to customize resumes for specific positions, and saving both jobs and tailored resumes to organized folders.-
- AlicenseAqualityCmaintenanceGenerates professional PDF resumes using LaTeX templates through natural language descriptions. Supports 9 professional templates, AI-powered resume tailoring, and organized folder management for job applications.423MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to fetch a master resume, tailor it to a job description, and generate a polished PDF resume using headless Chromium.-
- FlicenseAqualityCmaintenanceEnables tailoring resumes to job descriptions by scraping JDs, applying rules, and generating optimized DOCX resumes.11-