🔎 Job Offer Scraper MCP
Structured job-offer extraction for AI agents — plus truthful, verified LaTeX CV tailoring.
job-offer-scraper-mcp exposes a read-only MCP tool that turns public job URLs
into structured descriptions and criteria. This repository also ships the
remotely installable tailor-latex-cv Codex skill, which adapts a real LaTeX CV
to an offer, compiles it with a verified Tectonic binary, and checks that the PDF
remains machine-readable.
✨ Highlights
| Capability | What it provides |
|---|---|
| 🔗 Job extraction | One MCP tool for LinkedIn, TecnoEmpleo, InfoEmpleo, and generic public pages |
| 🧱 Structured output | Job description and employment criteria ready for agent workflows |
| 🛡️ Safer fetching | Public-URL validation, read-only annotations, and explicit error responses |
| 📝 CV tailoring | Evidence-based LaTeX rewriting without fabricated experience or hidden keywords |
| ✅ PDF verification | Pinned Tectonic download, SHA-256 validation, compilation, and extractable-text checks |
| 📦 Zero-clone usage | Run the MCP with uvx and install the skill directly from GitHub |
🚀 Quick start
Run the published package in an isolated UV environment:
uvx job-offer-scraper-mcp
Or run directly from GitHub:
uvx --from git+https://github.com/JuanjoLopez19/job-scrapper-mcp.git job-offer-scraper-mcp
MCP client configuration
{
"servers": {
"job-offer-scraper": {
"command": "uvx",
"args": ["job-offer-scraper-mcp"]
}
}
}
To use the GitHub source before or instead of a PyPI release:
{
"servers": {
"job-offer-scraper": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/JuanjoLopez19/job-scrapper-mcp.git",
"job-offer-scraper-mcp"
]
}
}
}
🌐 Supported job sites
| Site | Status | Strategy |
|---|---|---|
| ✅ Implemented | Dedicated extractor | |
| TecnoEmpleo | ✅ Implemented | Dedicated extractor |
| InfoEmpleo | ✅ Implemented | Dedicated extractor |
| Indeed | ✅ Implemented | Dedicated extractor with JSON data extraction |
| Other public sites | ✅ Fallback | Generic safe HTML retrieval |
The MCP exposes:
get_job_offer_details(url: string)
Successful responses contain description and criteria, or generic page
content. Failures use a structured error object with a stable code.
🧩 Install the LaTeX CV tailoring skill
Ask Codex to install the skill from this GitHub path:
https://github.com/JuanjoLopez19/job-scrapper-mcp/tree/master/skills/tailor-latex-cv
The skill and MCP server are separate components: install the skill from GitHub,
then register the MCP server with uvx using the configuration above.
Workflow
flowchart LR
A[LaTeX CV + job URL] --> B{Job Offer MCP}
B -->|Success| E[Evidence-based match]
B -->|Unavailable| C[Web fallback]
C -->|Unavailable| D[Ask user for offer text]
C --> E
D --> E
E --> F[Truthful visible tailoring]
F --> G[Tectonic compilation]
G --> H[pypdf text verification]
H --> I[Atomic PDF publication]
I --> J[Tailored .tex + verified PDF]
The workflow preserves the original CV, integrates only supported keywords in visible recruiter-readable text, and reports material requirements that the CV does not substantiate.
🧪 Compile and verify a tailored CV
The skill includes a portable Python utility managed by UV:
uv run skills/tailor-latex-cv/scripts/compile_latex.py cv-tailored.tex \
--install-tectonic \
--expected-keyword Python \
--expected-keyword "REST APIs"
On first use, --install-tectonic downloads the pinned official Tectonic 0.16.9
binary for the current platform and verifies its SHA-256 digest. Compilation
runs in Tectonic's untrusted mode using a pinned direct official resource bundle
URL. The generated PDF is then opened with pypdf, which verifies page count,
extractable text, and requested keywords. Only after those checks pass, the
utility atomically publishes the final PDF beside the tailored .tex.
Omit --install-tectonic to prohibit compiler downloads. Use
--forbidden-keyword to fail verification if an unsupported requirement appears
in the generated PDF. Use --final-pdf <path> to select another deliverable
location. Existing PDFs are preserved with a numbered suffix unless
--overwrite-final is explicitly supplied.
[!NOTE] On Windows, replace decorative
fontawesome5icons with visible contact labels in the tailored copy. The verifier detects this package before compilation because the pinned Windows Tectonic build cannot load it reliably.
🛡️ Integrity and security
- The MCP accepts only public HTTP(S) targets and blocks unsafe local resources.
- The MCP tool is annotated as read-only, idempotent, and non-destructive.
- Job-page content is treated as untrusted input rather than agent instructions.
- CV tailoring never invents experience or inserts invisible ATS keywords.
- Tectonic release archives are pinned and hash-verified before execution.
- LaTeX compilation uses
--untrustedto disable known-insecure engine features.
🛠️ Development
Requirements:
- Python 3.11 or newer
- UV
Install dependencies and enable the quality hooks:
uv sync
uv run pre-commit install
Run the complete quality suite:
uv run pre-commit run --all-files
Run the MCP from the working tree:
uv run job-offer-scraper-mcp
Build and smoke-test the distribution:
uv build --no-sources
uv run --isolated --no-project --with dist/*.whl tests/smoke_test.py
📁 Project layout
├── src/job_offer_scraper_mcp/ # MCP server and scraper implementations
├── skills/tailor-latex-cv/ # Remotely installable Codex skill
│ ├── agents/openai.yaml
│ ├── references/
│ ├── scripts/compile_latex.py
│ └── SKILL.md
├── tests/ # Unit, integration, and smoke tests
├── pyproject.toml # UV project and quality configuration
└── .pre-commit-config.yaml # Ruff, Pyrefly, and pytest hooks
📦 Publishing
Tags beginning with v trigger .github/workflows/release.yml, which builds,
smoke-tests, and publishes the package to PyPI through Trusted Publishing.
📄 License
Distributed under the MIT License.
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 job_offer_scraper_mcp-1.0.0.tar.gz.
File metadata
- Download URL: job_offer_scraper_mcp-1.0.0.tar.gz
- Upload date:
- Size: 16.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5204eee85333cbda9d548242d2fa8f3afacb4d5917acd0df6eaa4f39c6154b9
|
|
| MD5 |
79bb3d1807ce4322333a1919c66efa10
|
|
| BLAKE2b-256 |
d40da5d32435d48c5b90b85b7736ad82a911e0bf249fcad26636741c839f5ed4
|
File details
Details for the file job_offer_scraper_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: job_offer_scraper_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8696d97149ec66c9b6317fdce8e853c422ed64eab86714e014de3fe55baab8f8
|
|
| MD5 |
67d348767f3423f90cf0ef1044aabcb6
|
|
| BLAKE2b-256 |
b568244552d44fc05ab73032e93d027b331c10eeb505e69e490adf04de8e9161
|