Job search and ranking pipeline accessible via MCP (Model Context Protocol)
Project description
SkillMatch MCP
Claude-powered job fit analyzer for people who prove their skills through work, not credentials.
What It Does
SkillMatch is an MCP server that gives Claude access to your GitHub portfolio, resume, and job search preferences. It lets Claude:
- Analyze how well you fit a specific job description based on your actual projects and resume
- Build optimized job search queries tailored to your targets and constraints
- Track every application you submit in a local SQLite database
- Pull your public GitHub repos to highlight relevant work during fit analysis
All data stays local on your machine. Nothing is sent anywhere except public GitHub API calls to fetch your own repos.
Setup
1. Install the dependency
cd skillmatch-mcp
pip install -r requirements.txt
2. Add to Claude
Claude Code (CLI):
claude mcp add --scope user skillmatch -- python /path/to/skillmatch-mcp/server.py
Then restart Claude Code.
Claude Desktop:
Open your Claude Desktop configuration file and add SkillMatch to the mcpServers section:
{
"mcpServers": {
"skillmatch": {
"command": "python",
"args": ["/path/to/skillmatch-mcp/server.py"]
}
}
}
Replace /path/to/skillmatch-mcp/server.py with the actual path to server.py on your machine, then restart Claude Desktop.
3. Start using it
After restarting, SkillMatch tools will be available in your conversation. Works in Claude Code and Claude Desktop.
Onboarding
The first time you use SkillMatch, Claude will walk you through a setup conversation. It looks something like this:
You: Help me find a new job.
Claude: I don't have your profile set up yet. Let me ask you a few questions first.
What is your name?
You: Jordan
Claude: What is your current role?
You: Senior frontend developer
Claude: What roles are you targeting?
You: Staff frontend engineer, senior full-stack engineer
Claude: What is your minimum acceptable salary?
You: 180000
Claude: Are you only looking for remote positions?
You: Yes
Claude: Where are you located?
You: Portland, OR
Claude: Any dealbreakers?
You: No on-call rotations, no defense contractors
Claude: What is your GitHub URL?
You: https://github.com/jordan-dev
Claude: Where is your resume file?
You: C:/Users/jordan/Documents/resume.md
Claude: Got it. Your profile is saved. Let me search for jobs matching your targets.
After onboarding, your profile is saved locally and reused in every future conversation.
How It Works
search_jobs builds a search query from your profile and any keywords you provide. Claude then uses that query with its web search capabilities to find real listings. The tool itself does not search the web.
analyze_fit bundles your GitHub portfolio, resume text, and the job description together. Claude then reasons about the fit, identifying skill matches, gaps, and talking points. The tool gathers the data; Claude does the thinking.
log_application and get_applications maintain a local SQLite database so you can track where you have applied, when, and any notes about the process.
save_scouted_job saves a job listing found during scouting. It validates the URL to reject search result pages (e.g. indeed.com/q-*) and only accepts direct posting links (e.g. indeed.com/viewjob?jk=...). It also deduplicates against existing scouted jobs and the applications database.
get_scouted_jobs returns all scouted listings, optionally filtered to only unranked ones. mark_jobs_ranked marks all unranked jobs as ranked after a ranking report is generated.
get_portfolio and get_resume can be called independently if you want Claude to review just your repos or just your resume.
File Structure
skillmatch-mcp/
server.py # MCP server (stdio JSON-RPC)
requirements.txt # python-docx dependency
CLAUDE.md # Instructions for Claude
README.md # This file
email_ranked_jobs.py # Conductor worker: emails ranked job reports
cowork_monitor.py # Conductor worker: monitors Cowork VM, auto-recovers
cowork_tab.png # Reference image for Cowork tab UI automation
data/
.gitkeep # Keeps the folder in git
profile.json # Created on first setup (gitignored)
applications.db # Created on first log (gitignored)
scouted_jobs.json # Scouted listings (gitignored)
ranked_jobs.md # Latest ranked report (gitignored)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skillmatch_mcp-1.0.0.tar.gz.
File metadata
- Download URL: skillmatch_mcp-1.0.0.tar.gz
- Upload date:
- Size: 16.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49b9563dae1085ca50807e6bf2225bf9ab2e742c45f32c0cb4284c5fbf27eee1
|
|
| MD5 |
0349e519dea466572dc5aa11b9b5edcd
|
|
| BLAKE2b-256 |
986c7b76704d127711c8866f61dc9e931db50643460bb67be43708aebce66764
|
Provenance
The following attestation bundles were made for skillmatch_mcp-1.0.0.tar.gz:
Publisher:
publish.yml on jarmstrong158/skillmatch-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillmatch_mcp-1.0.0.tar.gz -
Subject digest:
49b9563dae1085ca50807e6bf2225bf9ab2e742c45f32c0cb4284c5fbf27eee1 - Sigstore transparency entry: 1258748156
- Sigstore integration time:
-
Permalink:
jarmstrong158/skillmatch-mcp@8d6bee25fc4bc3b1443c4c79c6b90033b2776e80 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmstrong158
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d6bee25fc4bc3b1443c4c79c6b90033b2776e80 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file skillmatch_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: skillmatch_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5b9acf55add0dde17a6c0bd9e27f11f78958cf674bc143f750c272b8f904099
|
|
| MD5 |
2f0369705d4b33b9fbc931816049192d
|
|
| BLAKE2b-256 |
22936d944e9dece600ced7e4249ca5bfad3f7655b903c28f94ecb83ff0f1b319
|
Provenance
The following attestation bundles were made for skillmatch_mcp-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on jarmstrong158/skillmatch-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
skillmatch_mcp-1.0.0-py3-none-any.whl -
Subject digest:
b5b9acf55add0dde17a6c0bd9e27f11f78958cf674bc143f750c272b8f904099 - Sigstore transparency entry: 1258748244
- Sigstore integration time:
-
Permalink:
jarmstrong158/skillmatch-mcp@8d6bee25fc4bc3b1443c4c79c6b90033b2776e80 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/jarmstrong158
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8d6bee25fc4bc3b1443c4c79c6b90033b2776e80 -
Trigger Event:
workflow_dispatch
-
Statement type: