Skip to main content
Glama
jobjourney-claude-plugin

jobjourney-claude-plugin

by Rorogogogo

πŸš€ JobJourney Claude Plugin

A production-ready MCP server for JobJourney with AI job-search tools, local job discovery, and scheduled scraping from Claude.

npm version License: AGPL-3.0 Commercial License Node Protocol GitHub stars


✨ 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_jobs with keyword full stack, location Sydney, sources linkedin and seek, pages 1."

"Use search_jobs and show me the latest LinkedIn roles in Sydney."

"Use schedule_discovery to 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@latest

Option 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@latest

2. 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 1

4. Query the stored results

Use search_jobs with source "linkedin" and limit 5

5. Schedule it

Use schedule_discovery with keyword "full stack", location "Sydney", time "09:00", sources ["linkedin", "seek"]

πŸ” Source Support

Source

Status

Transport

Notes

linkedin

Active

HTTP guest scraping

Primary supported LinkedIn path

seek

Active

Playwright

Local browser session support

indeed

Planned

Playwright

Not implemented yet

jora

Planned

Playwright

Not implemented yet

ATS

Support

greenhouse

Detect + expand

lever

Detect + expand

workday

Detect only

smartrecruiters

Detect only

ashby

Detect only


🧠 How Local Discovery Works

The local discovery engine lives under src/discovery and uses one canonical job model across all sources.

LinkedIn

  1. Fetch guest search results

  2. Fetch guest job detail HTML for each posting

  3. Extract description, metadata, and external apply URL

  4. Detect ATS from the external URL

  5. Expand supported ATS companies

SEEK

  1. Launch Playwright

  2. Use the browser-backed source flow

  3. Normalize results into the same canonical job schema

Storage

Local runs are stored in:

  • jobs DB: ~/.jobjourney/jobs.db

  • agent 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

discover_jobs

Run the canonical multi-source discovery engine and store results locally

search_jobs

Query jobs already stored in local SQLite

schedule_discovery

Schedule recurring local discovery runs

get_latest_discovery_report

Show the latest discovery batch summary

scrape_jobs

Legacy one-off local scrape path

login_jobsite

Save browser login state for supported sites

check_login_status

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 config

Built with FastMCP, TypeScript, Zod, Playwright, and SQLite.


βš™οΈ Environment Variables

Variable

Description

Default

JOBJOURNEY_API_URL

JobJourney backend base URL

https://server.jobjourney.me

JOBJOURNEY_API_KEY

API key for backend-authenticated features

-

TRANSPORT

MCP transport: stdio or httpStream

stdio

PORT

HTTP port when TRANSPORT=httpStream

8080


πŸ§ͺ 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 typecheck

Useful 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/discovery architecture

  • implementing indeed and jora

  • improving 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"


πŸ“„ 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 tools
add_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

    C2.9/5.0

    Scored across 83 tools

    Disambiguation3/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness4/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP 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 npm
      3
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      An 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
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP 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
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that enables AI assistants to search LinkedIn for job posts, save them locally, and manage them via a React dashboard.
      MIT