MCP server that renders a YAML CV into a one-page PDF via notboringresume.cloud (local Chromium).
Project description
not-boring-resume-mcp
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.
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
.github/workflows/ci.yml runs on every pull request and on pushes to main:
- lint —
ruff format --checkandruff check - test — installs Chromium via Playwright, then runs
pytest
Releasing (publishing to PyPI)
Releases are tag-driven: pushing a v* tag builds the package, creates the
matching GitHub Release, and publishes to PyPI. The workflow lives in
.github/workflows/publish.yml.
One-time setup
Configure a Trusted Publisher on PyPI (no API token to store). On PyPI → your project → Publishing → Add a pending publisher:
| Field | Value |
|---|---|
| Owner | your GitHub account / org |
| Repository | not-boring-resume-mcp |
| Workflow | publish.yml |
| Environment | pypi |
Cutting a release
The version bump goes through a normal PR, and the tag is created after the merge. You never need to force-push.
-
On a branch, bump the version in
pyproject.toml(e.g.version = "0.1.1"):git switch -c release/0.1.1 # edit pyproject.toml -> version = "0.1.1" git commit -am "Release 0.1.1" git push -u origin release/0.1.1
-
Open a PR, let CI run, and merge it into
main(merge or squash). -
Update local
main, then tag the merged commit and push the tag:git switch main git pull git tag v0.1.1 git push origin v0.1.1
Tag after merging, never before. A squash merge rewrites the commit SHA, so a tag created on the branch would point to an orphaned commit. Tagging the commit that is already on
mainkeeps the tag on the real history — and avoids any temptation to force-push.
Pushing the tag triggers the workflow, which:
- Verifies the tag (
v0.1.1) matchesversioninpyproject.toml— the job fails fast if they differ, so you can't ship a mismatched release. - Builds the sdist and wheel.
- Creates the GitHub Release with auto-generated notes and the built artifacts.
- Publishes to PyPI.
The tag version (minus the
v) must equalproject.version, and that version must not already exist on PyPI — PyPI never lets you overwrite a published version.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file not_boring_resume_mcp-0.1.1.tar.gz.
File metadata
- Download URL: not_boring_resume_mcp-0.1.1.tar.gz
- Upload date:
- Size: 643.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
005bcfb1c2a185551c01387e4160eabfe5236d3537535fd3669e61dce3b72675
|
|
| MD5 |
fe2cd0d90377b68b8ddc981f1fd2e1f1
|
|
| BLAKE2b-256 |
46a996952630e59393280384f8397d2bf85fa934bd267cd8d0387b626ef39e25
|
Provenance
The following attestation bundles were made for not_boring_resume_mcp-0.1.1.tar.gz:
Publisher:
publish.yml on gouzmi/not-boring-resume-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
not_boring_resume_mcp-0.1.1.tar.gz -
Subject digest:
005bcfb1c2a185551c01387e4160eabfe5236d3537535fd3669e61dce3b72675 - Sigstore transparency entry: 1982559991
- Sigstore integration time:
-
Permalink:
gouzmi/not-boring-resume-mcp@e252d9003706b71650ff16981bee08008948016b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/gouzmi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e252d9003706b71650ff16981bee08008948016b -
Trigger Event:
push
-
Statement type:
File details
Details for the file not_boring_resume_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: not_boring_resume_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a9b43e0a79714820fc4350772df9ceb0d2a9a8249852cecd46570d3e8e106e3
|
|
| MD5 |
fcc0ea91b0f5c64644121d8f933f12fe
|
|
| BLAKE2b-256 |
1a74197777234bbf946b99296e30b1577c8619969b6960f3d2accd97ce0fea31
|
Provenance
The following attestation bundles were made for not_boring_resume_mcp-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on gouzmi/not-boring-resume-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
not_boring_resume_mcp-0.1.1-py3-none-any.whl -
Subject digest:
8a9b43e0a79714820fc4350772df9ceb0d2a9a8249852cecd46570d3e8e106e3 - Sigstore transparency entry: 1982560123
- Sigstore integration time:
-
Permalink:
gouzmi/not-boring-resume-mcp@e252d9003706b71650ff16981bee08008948016b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/gouzmi
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e252d9003706b71650ff16981bee08008948016b -
Trigger Event:
push
-
Statement type: