Jobless MCP
Personalized job search inside Claude. Get ranked job matches based on your actual skills, not keywords.
README
Jobless MCP
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
- jobless.dev/mcp -- API key + install commands
- jobless.dev -- the main product
- Issues -- bug reports + feature requests
License
MIT -- see LICENSE.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。