
Skillmatch Mcp
io.github.jarmstrong158Published by GitHub account jarmstrong158v2.0.0Updated Oct 25, 2026
Job search and ranking pipeline via MCP for Claude Desktop.
Overview
A local MCP server that gives Claude a job-search workspace: profile and resume storage, job fit analysis, search query building, and an application tracker.
- What you can do
- Analyze job fit against your resume and public GitHub repos, and parse job descriptions into structured requirements and red flags. Build tailored job search queries for Claude to run with its own web search. Log, list and update applications with statuses, follow-up dates and outcomes, and surface overdue follow-ups. Save and list scouted job listings, deduplicated and URL-validated, and mark them ranked. Manage multiple resume variants and update your stored profile and preferences.
- When to use it
- Useful if you are actively job hunting and want Claude to keep a local profile, judge fit against real listings, and track applications and follow-ups in one place. Less relevant if you only need ad-hoc resume feedback.
- Requirements
- Runs locally over stdio as a Python package (skillmatch-mcp) with a python-docx dependency; add it to Claude Code or Claude Desktop by pointing at server.py. Needs a client speaking the stated protocol revision; 2.x drops the initialize handshake, so older clients should stay on 1.x. Network access for public GitHub API calls. The optional email worker needs Gmail credentials in a config file or environment variables.
Installation
In SourceWeft
- Open Skillmatch Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
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
Speaks MCP protocol revision 2026-07-28 over stdio, on SDK mcp>=2.0,<3. It is stateless:
no initialize handshake and no session id, with every request carrying its own protocol version
and client identity. tools/list and server/discover return ttlMs/cacheScope freshness
hints, and tool order is stable across calls so client-side and prompt caches keep hitting.
Upgrading from 1.x: 2.0.0 drops the
initializehandshake, so it requires a client that speaks2026-07-28. Tool names, schemas, and results are unchanged — only the transport moved. Stay on 1.x if you need to serve an older client.
2. Add to Claude
Claude Code (CLI):
Then restart Claude Code.
Claude Desktop:
Open your Claude Desktop configuration file and add SkillMatch to the mcpServers section:
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:
After onboarding, your profile is saved locally and reused in every future conversation.
Extended Profile (optional)
You can enrich your profile at any time by asking Claude to update it. These fields help Claude reason about nuanced fit:
These can be set during initial setup or added later with the update_profile tool.
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 runs a two-step process. First it parses the job description into structured signal (hard requirements, nice-to-haves, red flags, compensation signals, role type) via the Claude API. Then it fetches your portfolio and auto-selects the best resume variant for the detected role type. Claude sees structured signal before raw marketing copy.
parse_jd is the standalone JD parser. Use it independently to pre-process a job description without running the full fit analysis.
log_application, get_applications, and update_application form a job search CRM. Track status (applied, screening, interview, offer, rejected, ghosted), set follow-up dates, and record outcomes.
get_follow_ups shows applications that need attention — where the follow-up date has passed and you're still waiting.
get_application_patterns analyzes your full application history (10+ needed) to find which role types get responses, which skills resonate, and recommends search adjustments.
email_ranked_jobs.py is a standalone Conductor worker script that emails the latest ranked job report. See Email Worker Setup below for configuration.
save_scouted_job saves a job listing found during scouting. It validates the URL to reject search result pages and deduplicates against existing scouted jobs and applications.
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.
add_resume and list_resumes manage multiple resume variants. Each variant targets specific role types (e.g. "AI Engineering" targets ai_engineering and ml_engineering). During fit analysis, the best variant is auto-selected based on the JD's detected role type.
update_profile merges new or changed fields into your existing profile without re-running setup.
get_portfolio and get_resume can be called independently if you want Claude to review just your repos or just your resume.
Quick Start (No File Paths)
For the simplest setup, paste your resume directly — no local files needed:
Email Worker Setup
email_ranked_jobs.py sends the ranked job report via Gmail. It is designed to run as a Conductor worker on a schedule.
Credentials live in a gitignored config file — never in the source. Copy the template and fill it in:
Then edit data/email_config.json:
The whole data/ folder is gitignored (only .gitkeep and email_config.example.json are tracked), so email_config.json can never be committed by accident.
Why a config file and not environment variables? Depending on how the worker process is launched — notably via Conductor on Windows — environment variables may not be inherited by the child process, causing silent send failures. The config file is read from a path relative to the script, so it works regardless of how the process was spawned. Environment variables (GMAIL_USER, GMAIL_APP_PASSWORD, EMAIL_TO, EMAIL_CAP) are still honored as a fallback when a key is absent from the config file, which is handy for CI or containerized runs. If neither source supplies credentials, the script exits with code 2 and prints setup instructions instead of failing silently.
To generate a Gmail App Password: Google Account → Security → 2-Step Verification → App Passwords. Create one for "Mail". This is not your normal account password. If you ever paste one into a source file by mistake, revoke it from that same screen.
The script reads data/ranked_jobs.md, caps the email to the top 15 ranked listings, sends it, and then deletes ranked_jobs.md so stale rankings are not recycled on the next run.
File Structure
Source: README.md at commit 68f6702
Tools
0Version history
1- v2.0.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts