Skip to main content

🔎 Job Offer Scraper MCP

Structured job-offer extraction for AI agents — plus truthful, verified LaTeX CV tailoring.

CI Python MCP uv License


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
LinkedIn ✅ 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 fontawesome5 icons 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 --untrusted to 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

job_offer_scraper_mcp-1.0.0.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

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

job_offer_scraper_mcp-1.0.0-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

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

Hashes for job_offer_scraper_mcp-1.0.0.tar.gz
Algorithm Hash digest
SHA256 b5204eee85333cbda9d548242d2fa8f3afacb4d5917acd0df6eaa4f39c6154b9
MD5 79bb3d1807ce4322333a1919c66efa10
BLAKE2b-256 d40da5d32435d48c5b90b85b7736ad82a911e0bf249fcad26636741c839f5ed4

See more details on using hashes here.

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

Hashes for job_offer_scraper_mcp-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8696d97149ec66c9b6317fdce8e853c422ed64eab86714e014de3fe55baab8f8
MD5 67d348767f3423f90cf0ef1044aabcb6
BLAKE2b-256 b568244552d44fc05ab73032e93d027b331c10eeb505e69e490adf04de8e9161

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.0

2 files

1.1.0

2 files

This release

1.0.0 This release

2 files

0.1.1

2 files

0.1.0

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