jobjourney-claude-plugin
This MCP server turns Claude into a full job-search assistant β finding and scraping jobs locally, tracking applications, generating AI career documents, and handling networking, profiles, documents, and account info.
π Job discovery & scraping: run
discover_jobsacross LinkedIn, SEEK, and Jora, with ATS detection and optional company career-page expansion; set up local scraping, check login status, and log in to browser-backed sites.β° Scheduled discovery: create, list, toggle, and delete recurring daily discovery runs via the background agent, and review the latest discovery report.
ποΈ Application tracking: save, list, search, filter, star, update status, and delete jobs; add, edit, and remove notes; bulk delete/reject/advance jobs; view dashboard analytics.
π€ AI job tools: evaluate resume fit for a job, generate tailored cover letters, generate technical/behavioral interview questions, run mock interviews, and fetch saved evaluations, cover letters, and interview reports.
π Profiles & documents: read and update profile basics, skills, employment, education, projects, and references; list, view, rename, and delete CVs and cover letters; generate and store AI-generated CVs; view public portfolios and analytics.
β Networking (coffee chats): find contacts, generate intro suggestions, send/respond to requests, message and view conversations, manage your coffee profile, and see networking stats.
π Application auto-fill: open an application page, extract form fields, fill fields, select options, upload a resume, click through steps, take screenshots, set a default CV, and close the browser.
π Misc platform features: notifications (list, mark read, delete), community comments, subscription and payment info, feature-access checks, scraping stats, update checks, and an AI career chatbot.
Detects and expands job postings from Greenhouse ATS, providing enriched job details such as descriptions, metadata, and external apply URLs.
Planned integration to scrape job listings from Indeed using Playwright, enabling local job discovery from Indeed.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jobjourney-claude-plugin discover full stack jobs in Sydney from LinkedIn and Seek"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π JobJourney Claude Plugin
A production-ready MCP server for JobJourney with AI job-search tools, local job discovery, and scheduled scraping from Claude.
β¨ What It Does
π€ AI job-search workflows for resume fit scoring, cover letters, and CV generation
ποΈ Application tracking with saved jobs, notes, status changes, starring, search, and dashboard analytics
π Local job discovery with a canonical discovery engine that stores results in local SQLite
π Mixed scraping strategy: LinkedIn uses direct HTTP guest scraping, while blocked sites like SEEK use Playwright
π’ ATS expansion for supported providers like Greenhouse and Lever after discovery
β° Scheduled discovery through the background agent and MCP tools
πΎ Local storage for jobs, runs, schedules, and discovery reports in
~/.jobjourney/jobs.db
Related MCP server: job-search-mcp
πΈ Demo
Use it naturally from Claude:
"Use
discover_jobswith keywordfull stack, locationSydney, sourcesseek, pages1."
"Use
search_jobsand show me the latest LinkedIn roles in Sydney."
"Use
schedule_discoveryto run every day at 9am for backend jobs in Melbourne."
"Evaluate how well my resume matches this job and draft a cover letter."
If you want product screenshots or GIFs later, this is the right place to add them.
π¦ Installation
Option A: Claude Code
claude mcp add jobjourney \
-e JOBJOURNEY_API_URL=https://server.jobjourney.me \
-e JOBJOURNEY_API_KEY=jj_your_api_key_here \
-e TRANSPORT=stdio \
-- npx -y jobjourney-claude-plugin@latestOption B: Claude Desktop
Add this to your Claude Desktop config file (claude_desktop_config.json):
{
"mcpServers": {
"jobjourney": {
"command": "npx",
"args": ["-y", "jobjourney-claude-plugin@latest"],
"env": {
"JOBJOURNEY_API_URL": "https://server.jobjourney.me",
"JOBJOURNEY_API_KEY": "jj_your_api_key_here",
"TRANSPORT": "stdio"
}
}
}
}Playwright prerequisite
For local browser-backed sources like SEEK, install a browser once:
npx playwright install chromiumπ Quick Start
1. Connect the plugin
claude mcp add jobjourney \
-e JOBJOURNEY_API_URL=https://server.jobjourney.me \
-e JOBJOURNEY_API_KEY=jj_your_api_key_here \
-e TRANSPORT=stdio \
-- npx -y jobjourney-claude-plugin@latest2. Log in to browser-backed sites when needed
From Claude:
Use login_jobsite with site "seek"3. Run discovery
From Claude:
Use discover_jobs with keyword "full stack", location "Sydney", sources ["linkedin", "seek"], pages 14. Query the stored results
Use search_jobs with source "linkedin" and limit 55. Schedule it
Use schedule_discovery with keyword "full stack", location "Sydney", time "09:00", sources ["linkedin", "seek"]π Source Support
Source | Status | Transport | Notes |
| Active | HTTP guest scraping | Primary supported LinkedIn path |
| Active | Playwright | Local browser session support |
| Planned | Playwright | Not implemented yet |
| Planned | Playwright | Not implemented yet |
ATS | Support |
| Detect + expand |
| Detect + expand |
| Detect only |
| Detect only |
| Detect only |
π§ How Local Discovery Works
The local discovery engine lives under src/discovery and uses one canonical job model across all sources.
Fetch guest search results
Fetch guest job detail HTML for each posting
Extract description, metadata, and external apply URL
Detect ATS from the external URL
Expand supported ATS companies
SEEK
Launch Playwright
Use the browser-backed source flow
Normalize results into the same canonical job schema
Storage
Local runs are stored in:
jobs DB:
~/.jobjourney/jobs.dbagent heartbeat:
~/.jobjourney/agent-heartbeat.json
The database stores:
discovered jobs
scrape/discovery runs
schedules
π Key Tools
This MCP exposes a broad JobJourney toolset. For local discovery, these are the most important ones:
Tool | What it does |
| Run the canonical multi-source discovery engine and store results locally |
| Query jobs already stored in local SQLite |
| Schedule recurring local discovery runs |
| Show the latest discovery batch summary |
| Legacy one-off local scrape path |
| Save browser login state for supported sites |
| Confirm browser login state |
And the broader platform also includes:
job tracking
AI fit evaluation
cover letter and CV generation
dashboard analytics
coffee chat networking
profile and document management
π Architecture
src/
index.ts # FastMCP server entrypoint
tools/ # MCP tool registration
discovery/ # Canonical local discovery engine
core/ # orchestration and job types
sources/ # linkedin guest, seek browser, planned sources
ats/ # ATS detection and supported crawlers
analysis/ # salary, tech stack, PR, experience enrichment
fallback/ # optional company career-page probing
storage/ # discovery persistence adapters
parity/ # TS vs Python parity harness
scraper/ # legacy browser scraper layer, being phased down
storage/sqlite/ # SQLite repos and migrations
agent/ # background scheduling agent
config/ # path and runtime configBuilt with FastMCP, TypeScript, Zod, Playwright, and SQLite.
βοΈ Environment Variables
Variable | Description | Default |
| JobJourney backend base URL |
|
| API key for backend-authenticated features | - |
| MCP transport: |
|
| HTTP port when |
|
π§ͺ Development
git clone https://github.com/Rorogogogo/jobjourney-claude-plugin.git
cd jobjourney-claude-plugin
npm install
npx playwright install chromium
npm run build
npm test
npm run typecheckUseful local commands:
npm run start
npm run agent
npm run parity:discovery
npm run parity:live-smokeπ€ Contributing
Contributions are welcome. Useful contribution areas right now:
tightening the canonical
src/discoveryarchitectureimplementing
indeedandjoraimproving live parity coverage
reducing remaining legacy surface in
src/scraper
Standard flow:
git checkout -b feature/my-change
npm test
npm run typecheck
git commit -m "feat: my change"π Links
π License
AGPL-3.0 + Commercial Β© JobJourney
License
This project is dual-licensed:
π AGPL-3.0 β free for personal use, open-source forks, and projects themselves open-sourced under a compatible license. See LICENSE.
πΌ Commercial license β required for closed-source products, proprietary internal tools, or paid / hosted services where AGPL-3.0's copyleft and network-use obligations don't fit. See COMMERCIAL.md.
Do I need a commercial license?
Use case | License |
Personal use / running locally | AGPL-3.0 (free) |
Forking and publishing under AGPL-3.0 | AGPL-3.0 (free) |
Bundling into a closed-source product | Commercial |
Hosting a modified version as a SaaS without publishing source | Commercial |
Internal company tool not open-sourced | Commercial |
For a commercial license, contact Robert Wang at xwang.robert@gmail.com β see COMMERCIAL.md for what to include in your request.
Available Tools
83 toolsadd_job_noteA
Add a note to a job application. Use this when the user wants to record information about a job (e.g., interviewer name, follow-up date, salary info).
Inputs: job_id (required), content (required).
bulk_update_jobsC
Perform bulk operations on multiple jobs at once: delete, reject, or advance to next stage.
Inputs: action (required), job_ids (required).
chatB
Send a message to the JobJourney AI chatbot for career advice, job search tips, or general help.
Inputs: message (required), conversation_id.
check_feature_accessB
Check if the user has access to a specific AI feature based on their subscription.
Inputs: feature_name (required).
check_for_updatesA
Check whether a newer published version of the local JobJourney plugin is available and show the update command.
Inputs: no named parameters.
check_login_statusA
Check if cookies exist for job sites. Shows which sites have saved login sessions.
Inputs: no named parameters.
click_elementA
Click a button or link on the current page (e.g., Next, Submit, Continue). Returns whether the page URL changed or new content appeared.
Inputs: selector (required), description.
close_browserB
Close the browser session and clean up resources.
Inputs: no named parameters.
conduct_mock_interviewC
Conduct an AI-powered mock interview for a specific job. Simulates a real interview experience.
Inputs: job_id (required), interview_type.
create_commentC
Post a new comment in the community.
Inputs: content (required), parent_id.
delete_all_schedulesB
Permanently delete ALL scheduled job discovery cron jobs. Use with caution.
Inputs: no named parameters.
delete_coffee_profileA
Delete the user's coffee chat profile, removing them from the networking pool.
Inputs: no named parameters.
delete_commentC
Delete a comment.
Inputs: comment_id (required).
delete_documentC
Delete a document (CV or cover letter).
Inputs: type (required), document_id (required).
delete_jobB
Delete a saved job. Use this when the user wants to remove a job from their list.
Inputs: job_id (required).
delete_job_noteC
Delete a note from a job application.
Inputs: job_id (required), note_id (required).
delete_notificationC
Delete a notification.
Inputs: notification_id (required).
delete_scheduleA
Permanently delete a scheduled job discovery cron job by its ID. Use list_schedules to see available IDs.
Inputs: id (required).
discover_jobsA
Find jobs for the user by scraping live listings from job sites (LinkedIn, SEEK, Jora, etc.). This is the primary tool for job searching β always use this when the user wants to find, search, or look for jobs. Enriches results with ATS detection, expands career pages, stores results locally, then opens the web app for visualization.
Inputs: pages (required), keyword (required), location (required), sources, +1 more.
evaluate_job_fitB
Use AI to evaluate how well the user's profile/resume matches a specific job. Returns a fit score and detailed analysis.
Inputs: job_title (required), description (required), job_id, company, +1 more.
extract_form_fieldsA
Extract all visible form fields from the current page. Returns structured data for each field including label, type, options, and a CSS selector for filling. Call open_application_page first.
Inputs: no named parameters.
fill_form_fieldA
Fill a single text input or textarea field on the current page. Use the selector from extract_form_fields.
Inputs: value (required), selector (required).
find_coffee_contactsB
Find people available for coffee chats / networking. Use this when the user wants to connect with professionals, find mentors, or network in a specific industry.
Inputs: limit, search, industry, help_topics.
generate_and_store_cvC
Generate a CV and save it to the user's documents.
Inputs: name, template, job_title, job_description.
generate_coffee_chat_suggestionsC
Use AI to generate personalized coffee chat introduction messages based on a person's profile.
Inputs: receiver_id (required).
generate_cover_letterB
Use AI to generate a tailored cover letter for a specific job based on the user's profile/resume.
Inputs: job_title (required), description (required), job_id, company, +1 more.
generate_cvC
Generate a CV/resume as PDF using AI based on the user's profile.
Inputs: template, job_title, job_description.
generate_interview_questionsB
Use AI to generate practice interview questions for a specific job. Choose between technical or behavioral questions.
Inputs: job_title (required), company, description, interview_type, +1 more.
get_coffee_chat_messagesC
Get messages in a coffee chat conversation.
Inputs: request_id (required).
get_coffee_chat_requestsB
Get the user's coffee chat requests - either sent or received.
Inputs: direction.
get_coffee_chat_statsB
Get coffee chat statistics (requests sent, received, accepted, etc.).
Inputs: no named parameters.
get_comment_threadB
View a comment and its replies.
Inputs: comment_id (required).
get_community_commentsC
Browse community posts and comments.
Inputs: page, limit.
get_dashboard_statsA
Get an overview of the user's job search progress including job counts by status, scraping metrics, document counts, and feature usage. Great for answering 'how is my job search going?'
Inputs: no named parameters.
get_documentC
Get details of a specific document by ID.
Inputs: document_id (required).
get_documentsB
List all user documents (CVs and cover letters).
Inputs: type.
get_job_cover_letterC
Get the saved cover letter for a specific job.
Inputs: job_id (required).
get_job_detailsA
Get full details of a specific job by ID, including description, skills, notes, and evaluation data.
Inputs: job_id (required).
get_job_evaluationB
Get the saved CV/resume evaluation for a specific job.
Inputs: job_id (required).
get_jobsA
Get the user's saved jobs with their current status. Use this to check job application status, list all jobs, or find specific jobs.
Inputs: limit, search, status, starred_only.
get_latest_discovery_reportB
Show a summary of the most recent discovery run, including sources, job count, and the top stored jobs for that run.
Inputs: no named parameters.
get_mock_interview_reportC
Get the mock interview report for a specific job.
Inputs: job_id (required).
get_my_coffee_profileB
Get the user's own coffee chat profile.
Inputs: no named parameters.
get_notificationsB
Get the user's notifications. Use this when the user asks about updates, alerts, or what's new.
Inputs: limit.
get_payment_historyB
View the user's payment history.
Inputs: no named parameters.
get_portfolio_analyticsC
Get detailed analytics for a portfolio page.
Inputs: report_slug (required).
get_portfolio_visitsB
Get the user's portfolio visit count.
Inputs: no named parameters.
get_profileB
Get the user's profile information including skills, experience, education, and projects.
Inputs: no named parameters.
get_public_portfolioB
View someone's public portfolio by their identifier (username or slug).
Inputs: identifier (required).
get_scraping_statsB
View job scraping statistics from the browser extension.
Inputs: no named parameters.
get_scraping_stats_aggregatedC
View aggregated scraping statistics with breakdowns by website and time period.
Inputs: no named parameters.
get_subscription_plansB
View available subscription plans and pricing.
Inputs: no named parameters.
get_subscription_statusB
Check the user's current subscription status and plan details.
Inputs: no named parameters.
get_unread_notification_countB
Get the count of unread notifications.
Inputs: no named parameters.
list_schedulesA
List all scheduled job discovery cron jobs, including disabled ones. Shows schedule ID, keyword, location, sources, cron expression, enabled status, and last run time.
Inputs: no named parameters.
login_jobsiteA
Open a browser window for the user to log in to a job site (SEEK or LinkedIn). Saves cookies so future scrapes can access full job details including descriptions, salary, and applied status. Run this once per site before scraping.
Inputs: site (required).
mark_notification_readC
Mark a single notification as read.
Inputs: notification_id (required).
mark_notifications_readB
Mark all notifications as read.
Inputs: no named parameters.
open_application_pageA
Open a job application page in the browser. Detects aggregator sites (LinkedIn/Seek/Indeed) and resolves to the real application URL. Keeps the browser open for subsequent form-filling tool calls.
Inputs: url (required).
rename_documentC
Rename a document.
Inputs: name (required), document_id (required).
respond_coffee_chatC
Accept or decline a received coffee chat request.
Inputs: action (required), request_id (required).
save_jobA
Save a new job application to track. Use this when the user wants to save or add a job they're interested in or have applied to.
Inputs: title (required), company (required), status, job_url, +4 more.
schedule_jobsA
Schedule recurring job discovery. The jobjourney-agent will run the discovery engine daily at the requested time across all specified sources and store results locally.
Inputs: time (required), keyword (required), location (required), pages, +1 more.
select_form_optionA
Select an option in a dropdown, radio group, or checkbox. Tries matching by label text first, then by value.
Inputs: value (required), selector (required).
send_coffee_chat_messageC
Send a message in a coffee chat conversation.
Inputs: content (required), request_id (required).
send_coffee_chat_requestA
Send a coffee chat request to a user. Use this after finding contacts with find_coffee_contacts.
Inputs: message (required), receiver_id (required).
set_default_cvA
Set a CV as the default/primary document for auto-apply resume uploads.
Inputs: document_id (required).
setup_local_scrapingA
Prepare the local scraping environment. Initializes local SQLite, checks Playwright/browser readiness, starts the background agent if needed, reports login status for supported sites, and returns the next recommended commands.
Inputs: no named parameters.
star_jobC
Star or unstar a job to mark it as important.
Inputs: job_id (required), is_starred (required).
take_page_screenshotA
Take a screenshot of the current page for visual inspection. Useful for verifying form state, handling CAPTCHAs, or debugging unusual layouts.
Inputs: no named parameters.
toggle_scheduleA
Enable or disable a scheduled job discovery cron job by its ID. The agent will pick up changes on its next reconcile cycle (within 60 seconds).
Inputs: id (required), enabled (required).
update_coffee_profileC
Create or update the user's coffee chat profile to make themselves available for networking.
Inputs: bio, headline, industry, help_topics, +2 more.
update_commentC
Edit an existing comment.
Inputs: content (required), comment_id (required).
update_full_profileB
Update the entire user profile at once (all sections).
Inputs: bio, skills, headline, location, +6 more.
update_job_noteC
Update an existing note on a job application.
Inputs: job_id (required), content (required), note_id (required).
update_job_statusB
Update the status of a job application. Use this when the user's application progresses (got an interview, received offer, was rejected, etc.)
Inputs: job_id (required), status (required).
update_profile_basicC
Update basic profile information (name, headline, bio, location).
Inputs: bio, headline, location, last_name, +1 more.
update_profile_educationC
Update the user's education history.
Inputs: educations (required).
update_profile_employmentC
Update the user's employment history.
Inputs: employments (required).
update_profile_projectsC
Update the user's projects.
Inputs: projects (required).
update_profile_referencesC
Update the user's references.
Inputs: references (required).
update_profile_skillsC
Update the user's skills list.
Inputs: skills (required).
upload_resumeA
Upload a CV/resume file to a file input on the current page. Uses the primary CV by default, or specify a document ID.
Inputs: selector (required), document_id.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 83 tools
The set covers many distinct domains (job search, applications, profile, networking, community, browser automation), but several tool pairs have overlapping or easily confused purposes, such as generate_cv vs generate_and_store_cv, get_documents vs get_document, mark_notifications_read vs mark_notification_read, and evaluate_job_fit vs get_job_evaluation. Descriptions help, but the sheer number of tools increases misselection risk.
Almost all tools follow a consistent snake_case verb_noun pattern (get_, update_, delete_, create_, send_, etc.), with a few minor deviations like the bare 'chat' and plural/singular inconsistencies in notification tools. The convention is readable and predictable.
83 tools is far beyond the 50+ threshold for extreme mismatch; even for a feature-rich job search plugin, this many tools is excessive and will burden an agent's context and selection process.
The surface covers job discovery, application tracking, profile management, networking, community, documents, subscriptions, and browser automation comprehensively. Minor gaps exist, such as editing saved job details or searching community posts, but core workflows are well supported.
Maintenance
Related MCP Connectors
GetJobzi MCP server for job search, application tracking, and career forecasting.
Public MCP server for discovering open jobs. Search, filter, and get application links.
Job application tracker for developers - AI agents write over MCP, you review in a dashboard.
MCP server for VC pitch-deck scoring, thesis-fit matching, and deal-flow management.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceMCP server for job search and application tracking, enabling AI agents to search jobs, get details, manage applications, and find contacts across 128K+ jobs and 1,900+ companies.807 npm3MIT- AlicenseNot gradedqualityCmaintenanceAn MCP server that exposes job-search and application-management capabilities to compatible AI clients, enabling discovery of vacancies, drafting of tailored application materials, and coordinated human-approved submissions.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that aggregates and deduplicates job listings from multiple public sources, ranks them against a user's resume, and exposes tools for searching, viewing details, explaining fit, and tracking applications.MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI assistants to search LinkedIn for job posts, save them locally, and manage them via a React dashboard.MIT