Skip to main content

MCP server that helps an AI client tailor a CV to a job: persistent master resume, deterministic ATS gap check, and ATS-safe PDF/DOCX export.

Project description

Resume-Tailor MCP โ€” tailor your CV to any job, automatically



An open-source Model Context Protocol server that gives Claude Desktop (or any MCP client) a persistent master rรฉsumรฉ, a real ATS keyword score, and clean PDF / DOCX export.

PyPI Website CI License: MIT Python 3.11+ MCP PRs Welcome Built for Claude

๐ŸŒ View the live site โ†’

Quick start ยท Tools ยท How it works ยท Contributing ยท Releases


You: "Here's a job link โ€” tailor my CV and export a PDF."

Claude reads the posting and your master CV, rewrites it to match, checks the ATS keyword score, and hands you a clean file ready to send.

Table of Contents

Why this exists

Claude can already rewrite a CV in a normal chat. This MCP is worth installing for the three things a plain chat can't do:

Feature What it gives you
Persistent master CV Stored locally as JSON. Set it up once, reuse it for every job.
Real ATS gap score Deterministic keyword math โ€” not vibes. Tells you exactly which keywords you're missing.
Clean file export ATS-safe PDF / DOCX: single column, standard fonts, real selectable text.

[!IMPORTANT] The MCP does not rewrite your CV โ€” Claude does that. The server supplies the persistence, the job fetch, the ATS math, and the export. Claude ties it together.

How it works

 load_master_resume โ”€โ”                                                  โ”Œโ”€โ–บ  export_resume
                     โ”œโ”€โ–บ  Claude rewrites the CV  โ”€โ–บ  ats_gap_check  โ”€โ–บโ”€โ”€โ”ค
 fetch_job_posting โ”€โ–บโ”‚                                     โ–ฒ            โ””โ”€โ–บ  export_cover_letter
 extract_keywords โ”€โ”€โ”€โ”˜โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  1. Load your master CV โ€” load_master_resume
  2. Analyze the job โ€” fetch_job_posting โ†’ extract_keywords
  3. Rewrite โ€” Claude rewrites the CV to honestly surface the missing keywords
  4. Check the rewrite โ€” ats_gap_check (did the score go up?)
  5. Export โ€” export_resume โ†’ a clean PDF or DOCX
  6. Cover letter (optional) โ€” export_cover_letter โ†’ a matching PDF or DOCX

Tools

Tool Purpose
save_master_resume Store/update the base CV (structured JSON: contact, summary, experience, projects, skills, education).
load_master_resume Return the stored master CV so Claude can work from it.
fetch_job_posting Fetch a job URL โ†’ clean text. Falls back to pasted text if the site is blocked or login-walled.
extract_keywords Deterministically pull the ranked skills/tools an ATS scans for.
ats_gap_check Compare a CV against the job keywords โ†’ match score (%) + the exact missing terms.
export_resume Render finished CV content (markdown or JSON) โ†’ a clean PDF or DOCX. Returns the file path.
export_cover_letter Render a finished cover letter โ†’ a matching PDF or DOCX. Optionally adds a letterhead (name + contact) from the master CV. Returns the file path.

Installation

Option A โ€” install from PyPI (recommended)

pip install resume-tailor-mcp     # or: uvx resume-tailor-mcp

That installs a resume-tailor-mcp command that runs the MCP server.

Option B โ€” from source

git clone git@github.com:NmaaAlhawary/MCP-Resume-Tailor.git
cd MCP-Resume-Tailor

python3 -m venv .venv
source .venv/bin/activate          # fish: source .venv/bin/activate.fish
pip install -r requirements.txt

Smoke-test that all seven tools register:

python -c "import asyncio, server; print([t.name for t in asyncio.run(server.mcp.list_tools())])"

[!NOTE] PDF export uses reportlab (pure Python โ€” no system libraries needed on macOS/Windows/Linux). DOCX export uses python-docx.

Connect to Claude Desktop

Add this to your claude_desktop_config.json (~/Library/Application Support/Claude/claude_desktop_config.json on macOS).

If you installed from PyPI (simplest โ€” uvx fetches and runs it):

{
  "mcpServers": {
    "resume-tailor": {
      "command": "uvx",
      "args": ["resume-tailor-mcp"],
      "env": { "RESUME_STORE_PATH": "~/.resume-mcp/master.json" }
    }
  }
}

If you installed from source, point at your venv's Python and server.py:

{
  "mcpServers": {
    "resume-tailor": {
      "command": "/absolute/path/to/MCP-Resume-Tailor/.venv/bin/python",
      "args": ["/absolute/path/to/MCP-Resume-Tailor/server.py"],
      "env": { "RESUME_STORE_PATH": "~/.resume-mcp/master.json" }
    }
  }
}

Restart Claude Desktop โ€” the seven tools appear under the tools menu.

Usage

First-time setup โ€” store your master CV (once)

Copy master.template.json, fill in your details, then ask Claude:

"Save this as my master resume: (paste the JSON)"

Claude calls save_master_resume and it persists at RESUME_STORE_PATH.

Everyday flow โ€” tailor to a job

You: Here's a job link โ€” tailor my CV for it and export a PDF: https://example.com/careers/senior-frontend

Behind the scenes Claude runs:

1. load_master_resume()                          โ†’ your stored CV
2. fetch_job_posting(url="โ€ฆ/senior-frontend")    โ†’ clean job text
3. extract_keywords(job_text)                    โ†’ ["REST APIs", "GraphQL", "TypeScript",
                                                     "Docker", "AWS", "Next.js", "CI/CD", โ€ฆ]
4. ats_gap_check(resume_text, keywords)          โ†’ { match_score: 20.0,
                                                     missing: ["GraphQL","Docker","AWS",โ€ฆ] }
5. โ”€โ”€ Claude rewrites the CV to surface real, matching skills โ”€โ”€
6. ats_gap_check(new_resume_text, keywords)      โ†’ { match_score: 85.0 }
7. export_resume(content=<rewritten>, format="pdf")
                                                 โ†’ { path: "~/.resume-mcp/exports/โ€ฆโ€‹.pdf" }
8. export_cover_letter(content=<letter>, format="pdf")
                                                 โ†’ { path: "~/.resume-mcp/exports/โ€ฆโ€‹_cover_letter.pdf" }

Claude: Tailored your CV โ€” keyword match went from 20% โ†’ 85%. I added your Docker/AWS and testing experience to match their stack, and drafted a matching cover letter. Exported here: ~/.resume-mcp/exports/Jane_Developer_โ€ฆ.pdf ~/.resume-mcp/exports/Jane_Developer_โ€ฆ_cover_letter.pdf

Configuration

Env var Default Purpose
RESUME_STORE_PATH ~/.resume-mcp/master.json Where the master CV JSON lives. Exports go to exports/ next to it.

Everything runs locally. No secrets, no external accounts.

Safety & robustness

  • SSRF-guarded fetching โ€” fetch_job_posting only follows http/https URLs to public hosts. Requests to localhost, private/LAN ranges, or cloud metadata (169.254.169.254) are refused, and redirects are re-checked on every hop. Downloads are capped at ~3 MB.
  • Synonym-aware ATS scoring โ€” the gap check treats common equivalents as a match (e.g. K8sโ†”Kubernetes, JSโ†”JavaScript, Postgresโ†”PostgreSQL), so scores reflect real coverage.
  • Unicode-safe PDFs โ€” a bundled Unicode font renders accented names (Josรฉ, rรฉsumรฉ) correctly instead of empty boxes.
  • Master-CV backup โ€” saving over an existing master CV first writes a .bak copy.

ATS-safe export

  • Single column โ€” no text boxes or multi-column tricks that break ATS parsers
  • Standard fonts (Calibri for DOCX, a Unicode sans for PDF)
  • Real, selectable text โ€” never image-rendered
  • Plain headings and bullet lists that map cleanly to resume sections

Contributing

Contributions of any size are welcome. The quickest way in: fork the repo, make your change, and open a pull request.

# 1. Fork on GitHub, then clone your fork
git clone git@github.com:YOUR-USERNAME/MCP-Resume-Tailor.git
cd MCP-Resume-Tailor

# 2. Set up and branch
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
git checkout -b my-improvement

# 3. Change, commit, push
git commit -am "Describe your change"
git push origin my-improvement

# 4. Open a Pull Request on GitHub

Great first contributions: add skills to KNOWN_TERMS / KNOWN_PHRASES in server.py, filter a filler word in STOPLIST, or improve the export layout. See CONTRIBUTING.md for the full step-by-step guide.

License

Released under the MIT License. By contributing, you agree your contributions are licensed under the same terms.

Built by Nmaa Hawary ยท If this helped, consider giving it a star.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resume_tailor_mcp-0.1.1.tar.gz (135.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

resume_tailor_mcp-0.1.1-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file resume_tailor_mcp-0.1.1.tar.gz.

File metadata

  • Download URL: resume_tailor_mcp-0.1.1.tar.gz
  • Upload date:
  • Size: 135.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for resume_tailor_mcp-0.1.1.tar.gz
Algorithm Hash digest
SHA256 27ea6de5ac702f05eabec4c572808ef6d082e632e28556c0857f6d63c62e275d
MD5 5b317b508128bc19cb0346b2ad1458dc
BLAKE2b-256 34ea7f31ca6261f0f42fcab2543bcc6947f10a9c51e9a1430ce8e4abaa56604d

See more details on using hashes here.

Provenance

The following attestation bundles were made for resume_tailor_mcp-0.1.1.tar.gz:

Publisher: release.yml on NmaaAlhawary/MCP-Resume-Tailor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file resume_tailor_mcp-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for resume_tailor_mcp-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 034c3c9392a1b4b0cf42f8d6270e90ba3d8a7dd5875c6de5211bfa1ddac320a4
MD5 a27127edbe9c86c2e916f38af835db8d
BLAKE2b-256 c55059beb678375d1e950496c1d228dc52ba38acbeb542fd3393741dbd696312

See more details on using hashes here.

Provenance

The following attestation bundles were made for resume_tailor_mcp-0.1.1-py3-none-any.whl:

Publisher: release.yml on NmaaAlhawary/MCP-Resume-Tailor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page