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, Indeed, InfoJobs, and generic 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
InfoJobs ✅ Implemented Dedicated extractor
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.1.0.tar.gz (17.7 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.1.0-py3-none-any.whl (20.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: job_offer_scraper_mcp-1.1.0.tar.gz
  • Upload date:
  • Size: 17.7 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.1.0.tar.gz
Algorithm Hash digest
SHA256 d60a287f7338b76ac9669a0b062fcf25590f994743fa0590cda0ff465dd67b00
MD5 5806d7e42d9c0901a3c5618ab21ed482
BLAKE2b-256 e60ab2ddc0d41bdab70463167a40ece58d35e148b494246bacee8bbac04c9300

See more details on using hashes here.

File details

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

File metadata

  • Download URL: job_offer_scraper_mcp-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 20.3 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 afc39a70dea845eef797c1c51a9e9ccca868751773cc10ca022ed0a9f2aefd1f
MD5 23250e0092f36fc650c7d08e44cc6abd
BLAKE2b-256 62d43ac5218adcecf07f346cb2b7efc6c52df3ad3ce6815f09b55fd66fafa5e3

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.0

2 files

This release

1.1.0 This release

2 files

1.0.0

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