Jobless MCP

Jobless MCP

Personalized job search inside Claude. Get ranked job matches based on your actual skills, not keywords.

Category
Visit Server

README

Install in Cursor Install in VS Code

Jobless MCP

License: MIT CI

Personalized job search inside Claude. Get ranked job matches based on your actual skills, not keywords. Works in Claude Code, Desktop, Cursor, Windsurf, VS Code, Gemini CLI, and more.

Get your API key | Documentation | Issues

Why Jobless MCP?

Without Jobless

  • Searching job boards manually with keyword filters
  • Getting irrelevant results because "Python" matches a snake handler job
  • No idea how well you actually match a role until you read the whole posting
  • Context-switching between your AI assistant and browser tabs

With Jobless

Ask Claude naturally and get jobs ranked against your actual resume:

What are my best job matches today?

Claude calls get_best_matches and returns:

Top 5 matches personalized to your resume:

1. [94%] Staff AI Engineer - Anthropic
   Remote | Python, PyTorch, Distributed Systems
   role 92% | skills 95% | seniority 96%

2. [91%] Senior ML Engineer - Vercel
   Remote | Go, Postgres, Kubernetes, LLM infra
   role 88% | skills 93% | seniority 91%

3. [89%] Founding Engineer - Cursor
   San Francisco | TypeScript, React, LLMs
   role 92% | skills 88% | seniority 87%

10,000+ jobs indexed across Greenhouse, Ashby, Lever, and more. Updated daily.

Quick Start

1. Get your API key

Visit jobless.dev/mcp -- drop your resume and get an API key instantly (no signup required for 10 matches/day).

2. Connect your client

Remote server URL:

https://mcp.jobless.dev/mcp

<details> <summary><b>Claude Code</b></summary>

claude mcp add jobless --url https://mcp.jobless.dev/mcp --header "Authorization: Bearer YOUR_API_KEY"

</details>

<details> <summary><b>Claude Desktop</b></summary>

Jobless is available as a Claude Connector. Go to Settings > Connectors and search for Jobless.

Or add manually to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "jobless": {
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

Restart Claude Desktop after saving.

</details>

<details> <summary><b>Cursor</b></summary>

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "jobless": {
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>VS Code</b></summary>

Add to .vscode/mcp.json:

{
  "servers": {
    "jobless": {
      "type": "http",
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>Windsurf</b></summary>

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "jobless": {
      "serverUrl": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>Zed</b></summary>

Add to Zed settings:

{
  "context_servers": {
    "jobless": {
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>Gemini CLI</b></summary>

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "jobless": {
      "httpUrl": "https://mcp.jobless.dev/mcp"
    }
  }
}

</details>

<details> <summary><b>OpenCode</b></summary>

Add to opencode.json:

{
  "mcp": {
    "jobless": {
      "type": "remote",
      "url": "https://mcp.jobless.dev/mcp",
      "enabled": true
    }
  }
}

</details>

<details> <summary><b>Warp</b></summary>

Settings > MCP Servers > Add MCP Server:

{
  "jobless": {
    "url": "https://mcp.jobless.dev/mcp",
    "headers": {
      "Authorization": "Bearer YOUR_API_KEY"
    }
  }
}

</details>

<details> <summary><b>Kiro</b></summary>

Add to ~/.kiro/settings/mcp.json:

{
  "mcpServers": {
    "jobless": {
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>Local install (pip, privacy mode)</b></summary>

Run the server locally as a subprocess. Your API key never touches mcp.jobless.dev:

pip install jobless-mcp

Then in your client config:

{
  "mcpServers": {
    "jobless": {
      "command": "jobless-mcp",
      "env": {
        "JOBLESS_API_KEY": "YOUR_API_KEY"
      }
    }
  }
}

</details>

<details> <summary><b>Other clients (generic remote MCP)</b></summary>

If your client supports remote MCP servers:

{
  "mcpServers": {
    "jobless": {
      "url": "https://mcp.jobless.dev/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

If your client only supports stdio, use mcp-remote as a bridge:

{
  "mcpServers": {
    "jobless": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.jobless.dev/mcp", "--header", "Authorization: Bearer YOUR_API_KEY"]
    }
  }
}

</details>

Tools

10 tools split into 6 reads and 4 grouped writes. Claude picks the right tool from the conversation.

Reads

Tool Purpose Tier
get_best_matches Top personalized job matches ranked by BM25 against your parsed resume and archetypes. Quickstart 10/day, Free 50/day, Pro unlimited. All
get_job Full detail for a job by UUID: description, tech stack, seniority fit, location, salary, application URL. With include_form=True (default) also best-effort fetches the ATS application form schema under application_form; falls back to null if unavailable. All
search_jobs Keyword and filter search across the public job index. Browse mode when you want to explore beyond your matches. Filters: location, remote scope, job type, recency, country, city, sort. All
list_bookmarked_jobs Full bookmark map: status (saved/applied/in_process), rating, notes, employer response, timestamps. All
get_profile_status Tier, daily usage, has_resume, reset time. Useful at the start of a conversation or for quota checks. All
get_application_answers The user's saved Q&A bank (autofill source for repeated questions: work auth, salary expectations, etc.). All

Writes

Tool Purpose Tier
manage_bookmark Add, remove, or update the status of a job bookmark. action="add" saves a job, action="remove" deletes it (destructive, irreversible), action="update_status" sets status (saved/applied/in_process) and/or rating (1-10). Replaces v0.2's bookmark_job and track_application. All
generate_document Generate a tailored resume or cover letter. kind="resume" rewrites bullets against the JD and persists a new Resume row. kind="cover_letter" produces an AI letter from a resume + job (deduplicated unless force=true). Returns document_id for chaining into download_document. Replaces v0.2's tailor_resume and generate_cover_letter. Pro
download_document Download a generated document. kind="resume" streams PDF; kind="cover_letter" supports format="pdf" (base64 inline or save_path to disk) and format="text" (UTF-8 string for email or text fields). Replaces v0.2's download_resume and download_cover_letter. All
apply_to_job Prepare or submit an application. action="prepare" runs the three-pass autofill (kit → profile → SavedAnswer) and returns the filled fields. action="submit" actually sends the application; it's IRREVERSIBLE and requires confirm=True (otherwise a dry-run preview is returned). For unsupported ATSes the response carries browser_submission_required=true so Claude can hand off to Playwright MCP or the Jobless extension. Replaces v0.2's prepare_application and submit_application. Pro

Example conversation (end-to-end)

User: Find me 3 senior Python remote roles in Europe.
  -> get_best_matches with filters

User: Tell me more about #2.
  -> get_job(job_id)             # also returns application_form by default

User: Bookmark it and generate a tailored resume + cover letter.
  -> manage_bookmark(job_id, action="add")
  -> generate_document(kind="resume", job_id, resume_id)
  -> generate_document(kind="cover_letter", job_id, resume_id)

User: Prefill the form and submit.
  -> apply_to_job(job_id, action="prepare", resume_id, cover_letter_id)
  -> apply_to_job(job_id, action="submit", answers, confirm=True)

User: Mark it as applied.
  -> manage_bookmark(job_id, action="update_status", status="applied")

Better with Playwright MCP

Some ATSes (Workday, BambooHR, custom careers pages) don't expose a clean POST endpoint, so submit_application returns:

{
  "error": "browser_submission_required",
  "ats_platform": "WORKDAY",
  "apply_url": "https://acme.wd1.myworkdayjobs.com/...",
  "prepared_data": { ...autofill answers, resume URL, cover letter URL... }
}

Composed with Microsoft's Playwright MCP, Claude can finish the job in the browser:

jobless.apply_to_job(job_id, action="prepare", resume_id, cover_letter_id)
  -> { prepared_data, apply_url }

playwright.browser_navigate(apply_url)
playwright.browser_fill_form(prepared_data.answers)
playwright.browser_file_upload(prepared_data.resume_pdf_url)
playwright.browser_click("Submit")
playwright.browser_snapshot()         # confirmation screenshot

jobless.manage_bookmark(job_id, action="update_status", status="applied")

No other career MCP composes like this because no other career MCP has both the profile bank and the prepared-payload contract.

Pricing

Quickstart Free Pro
Daily matches 10 50 Unlimited
Signup required No Yes Yes
Ranking Dual KNN Dual KNN ColBERT reranking
Price Free Free $19/mo

Upgrade at jobless.dev/dashboard/premium

Architecture

This package is a thin wrapper (~150 LOC) around the Jobless REST API. Two modes:

  • Stdio (local): launched as a subprocess by your client. API key stays on your machine.
  • Streamable HTTP (hosted): mcp.jobless.dev. No install needed. Bearer token in every request.

Both call the same closed-source Jobless backend (api.jobless.dev) which holds the OpenSearch index, Jina embeddings, and ranking models.

              github.com/bendza/jobless-mcp
            (MIT, ~150 LOC, this repo)
                      |
         +------------+------------+
         |                         |
   Local stdio mode         Hosted HTTP mode
   (pip install)            (mcp.jobless.dev)
         |                         |
         +------------+------------+
                      v
            api.jobless.dev (Django)
                      v
        OpenSearch + Postgres + Redis

Self-Hosting

pip install jobless-mcp
JOBLESS_MCP_TRANSPORT=http \
JOBLESS_API_BASE=https://your-api.example.com \
PORT=8100 \
jobless-mcp

Development

git clone https://github.com/bendza/jobless-mcp.git
cd jobless-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest -v

13 tests covering the client layer. All tests mock the API with respx and run offline in <100ms.

Links

License

MIT -- see LICENSE.

Star History Chart

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured