Skip to main content

not-boring-resume-mcp

Build Status PyPI Versions

MCP server that renders a YAML CV into a one-page PDF via notboringresume.cloud (local headless Chromium).
Optionnaly it can also generate a cover letter adapted to the resume and the offer.

Installation

Requires uv. First download the browser Playwright uses to render PDFs (one-time):

uvx --from not-boring-resume-mcp playwright install chromium

Claude Code:

claude mcp add not-boring-resume -- uvx not-boring-resume-mcp

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "not-boring-resume": {
      "command": "uvx",
      "args": ["not-boring-resume-mcp"]
    }
  }
}

Usage

Run Claude from a folder that holds your cv.yaml (and, optionally, a cover-letter-template.md). Then call one of the prompts:

  • /mcp__not-boring-resume__tailor_cv — tailor the CV and render cv.pdf
  • /mcp__not-boring-resume__tailor_cv_and_letter — also write and render the cover letter

The offer argument

Both prompts take the job offer as their argument — pass it right after the prompt name, either as plain text (paste the whole job description) or as a URL:

/mcp__not-boring-resume__tailor_cv https://example.com/jobs/data-engineer
/mcp__not-boring-resume__tailor_cv_and_letter <paste the full offer text here>

When you give a URL, the server fetches the page and extracts its visible text before tailoring. The offer is what the CV (and letter) get adapted to, so the more complete it is, the better the result.

Both prompts also accept optional path arguments if your files aren't in the default location: cv_path (defaults to ./cv.yaml) and, for tailor_cv_and_letter, cover_letter_path (defaults to ./cover-letter-template.md).

Results are saved under ./output/[company]/[offer]/ (cv.pdf, the adapted cv.yaml, and, when requested, the cover letter as .md and .pdf).

The cv.yaml file

This is the only required input. You can download a ready-to-edit template from notboringresume.cloud (use the editor there to build one, then save it as cv.yaml), or start from the skeleton below and fill in your own data. Markdown is supported in the free-text fields (description, about.description) — e.g. **bold** and [links](https://...).

profile:
  name: Jane Doe
  position: Data & Software Engineer
  image: >-                              # optional: data:image/jpeg;base64,...
    data:image/jpeg;base64,<...>

contact:
  mail: jane.doe@example.com
  city: Taipei, Taiwan
  linkedin:
    title: LinkedIn
    url: https://linkedin.com/in/jane-doe/
  github:
    title: GitHub
    url: https://github.com/janedoe

skills:
  - categoryName: Data Engineering
    skills:
      - Spark
      - Airflow
      - DBT
  - categoryName: Languages
    skills:
      - Python
      - SQL

certifications:
  - name: AWS Certified Data Analyst Specialty (2021)

languages:
  - name: English
    level: Fluent
  - name: Spanish
    level: Intermediate

about:
  description: >
    Two or three sentences on who you are and what kind of role you're
    after. Markdown is allowed here.

experiences:
  - company: Some Company
    year: May 2021 - Jun 2024
    position: Data Engineer
    description: >-
      - **Achievement** with a measurable outcome.
      - Another bullet describing impact, tools, scale.

education:
  - name: Some University
    location: City, Country
    year: 2015 - 2020
    diplomaName: MSc, Computer Science

projects:
  - name: Side Project
    year: Since 2026
    description: >
      One line on the project and the stack used.

A complete, real-world example lives at examples/cv.yaml.

The cover-letter-template.md file

Only needed for tailor_cv_and_letter. There's no download for this one — write your own. It's a normal Markdown letter where the parts that should be rewritten per offer are wrapped in [[TAILOR: instructions]]example text[[/TAILOR]] markers: the instruction tells the model what to write, and the example text shows the tone/length to match. Everything outside the markers is kept verbatim.

# Subject: Application for [[TAILOR: the job title from the offer]]Data Engineer[[/TAILOR]] Position

Dear Hiring Team,

I am a Data & Software Engineer with five years of experience [...].
[[TAILOR: one sentence speaking directly to THIS company, its scale, mission, or
specific challenges; mirror the tone of this paragraph]]Example sentence about the
company.[[/TAILOR]]

[[TAILOR: a paragraph covering a first angle relevant to the offer (data pipelines,
APIs, cloud). Be specific: name companies, tools, outcomes from the adapted YAML.
Keep the same length and register as this example]]Example paragraph.[[/TAILOR]]

[...]

Best regards,
Jane Doe
jane.doe@example.com

A complete example lives at examples/cover-letter-template.md.

Development

This project uses uv.

uv sync --dev                              # install deps
uv run playwright install chromium         # one-time: browser for rendering/tests
uv run ruff format .                        # format
uv run ruff check .                         # lint
uv run pytest                               # tests

The test suite renders the live default CV from notboringresume.cloud, so it needs network access and will fail if the site is down.

Continuous integration

CI (lint + tests) runs on every pull request and push to main. See .github/workflows/ci.yml for details.

Releasing (publishing to PyPI)

Releases are on-demand and automated with python-semantic-release — trigger the release workflow manually with gh workflow run release.yml --ref main and it bumps the version, tags, and publishes to PyPI from the Conventional Commit history. See .github/workflows/release.yml for the full flow.

Download files

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

Source Distribution

not_boring_resume_mcp-1.1.0.tar.gz (649.8 kB view details)

Uploaded Source

Built Distribution

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

not_boring_resume_mcp-1.1.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file not_boring_resume_mcp-1.1.0.tar.gz.

File metadata

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

File hashes

Hashes for not_boring_resume_mcp-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f86414a56449a6e8a8b93268899f9b253a84b6fc2f0a908a6c2586fce9b1a80f
MD5 6c06cd61ef25f3fdf014e95b2d70a4c7
BLAKE2b-256 ee978896c3a324630da7ed4faa2a28623a96d1470d21b0e853181a6325d3eb3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for not_boring_resume_mcp-1.1.0.tar.gz:

Publisher: release.yml on gouzmi/not-boring-resume-mcp

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

File details

Details for the file not_boring_resume_mcp-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for not_boring_resume_mcp-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6db7ec01ab5a0cd432971f156921f25577bb88b5d95afa7c62e4483134e3016e
MD5 f6e97ce97ff2ac955fd5427dea52449c
BLAKE2b-256 36eb5cccd04937bc2adc87adfba51b5b6796f60f1db966c1b03c603439a0fba8

See more details on using hashes here.

Provenance

The following attestation bundles were made for not_boring_resume_mcp-1.1.0-py3-none-any.whl:

Publisher: release.yml on gouzmi/not-boring-resume-mcp

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

Release history Release notifications | RSS feed

1.1.1

2 files

This release

1.1.0 This release

2 files

0.1.2

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page