Feature Description
Add a new read-only MCP tool get_saved_jobs that navigates to the authenticated user's LinkedIn saved jobs page (/my-items/saved-jobs/) and returns the list of saved job postings as raw text plus extracted job IDs.
The tool should follow the same return format as existing scraping tools:
{url, sections: {saved_jobs: raw_text}, job_ids: [...], references?: {...}}
Returned job_ids should be compatible with the existing get_job_details tool so callers can fetch full descriptions in a second step.
Use Case
I built a CV-to-job-offer matching adapter. Today I have to manually copy job descriptions from LinkedIn for each offer I want to evaluate against a CV.
With a saved-jobs tool, my workflow becomes:
- Browse LinkedIn and save interesting jobs to Saved (native LinkedIn action).
- Call
get_saved_jobs to list saved postings and collect job IDs automatically.
- Call
get_job_details for each ID to pull full descriptions.
- Feed those descriptions into the CV matching pipeline without manual copy-paste.
This turns LinkedIn's Saved list into a personal job queue that external tools can consume programmatically.
Suggested Approach
Implement as a new tool in tools/job.py, backed by a LinkedInExtractor method (e.g. get_saved_jobs).
- Navigate to https://www.linkedin.com/my-items/saved-jobs/ using the existing authenticated browser session.
- Extract innerText from main (same philosophy as search_jobs — minimize DOM dependence).
- Reuse _extract_job_ids() to collect numeric IDs from a[href*="/jobs/view/"] links.
- Support pagination via max_pages (1–10, default 3), reusing the search_jobs pagination pattern (scroll sidebar, stop when no new IDs).
- Return {url, sections: {saved_jobs: text}, job_ids: [...]} plus optional references.
Constraints per project scraping rules:
- Locale-independent: rely on URL patterns and href extraction, not UI text like "Unsave" or "Saved".
- One navigation per tool call (single section = single page target).
- Verify end-to-end against live LinkedIn with uv run before merging.
Out of scope for v1 (can be follow-up issues):
- Saved vs Archived tab filtering
- Mutations (unsave, apply, change stage)
Feature Description
Add a new read-only MCP tool
get_saved_jobsthat navigates to the authenticated user's LinkedIn saved jobs page (/my-items/saved-jobs/) and returns the list of saved job postings as raw text plus extracted job IDs.The tool should follow the same return format as existing scraping tools:
{url, sections: {saved_jobs: raw_text}, job_ids: [...], references?: {...}}
Returned
job_idsshould be compatible with the existingget_job_detailstool so callers can fetch full descriptions in a second step.Use Case
I built a CV-to-job-offer matching adapter. Today I have to manually copy job descriptions from LinkedIn for each offer I want to evaluate against a CV.
With a saved-jobs tool, my workflow becomes:
get_saved_jobsto list saved postings and collect job IDs automatically.get_job_detailsfor each ID to pull full descriptions.This turns LinkedIn's Saved list into a personal job queue that external tools can consume programmatically.
Suggested Approach
Implement as a new tool in tools/job.py, backed by a LinkedInExtractor method (e.g. get_saved_jobs).
Constraints per project scraping rules:
Out of scope for v1 (can be follow-up issues):