Job Search Claude Skill: Build a SKILL.md Job Hunter (2026)
By Kushal Magar · October 17, 2026 · 12 min read
Key Takeaway
A job search Claude skill is a SKILL.md file that runs the same hunt every time: search LinkedIn jobs with your filters, skip roles already in your tracker, score the rest against your resume, find the hiring manager, verify their email, and log it all to a CSV. It stops at two review gates and never applies or sends anything. Copy the full skill below, change the inputs block, and run it.
Definition
A job search Claude skill is a SKILL.md file that gives Claude a fixed job-hunting procedure: the same search filters, the same resume scoring, the same hiring manager lookup and the same tracker file on every run, started by name instead of by a long prompt.
A job search Claude skill turns a messy weekly chore into one command. Instead of re-explaining your target titles, salary floor and resume every Monday, you write them down once in a SKILL.md, and Claude follows the same numbered steps each time.
This guide is the deep dive on the Skill itself. It covers the frontmatter, the inputs block, the steps that call SyncGTM MCP tools, the tracker CSV that skips roles you have already seen, a full copy-paste file, where to install it, and how to fix it after a bad run. For the broader workflow, start with the pillar guide, Job Search With Claude.
TL;DR
- A skill is a folder with a
SKILL.md. YAML frontmatter holdsnameanddescription; the body holds inputs, rules and numbered steps. - The tool chain is
check_credits→search_linkedin_job_openings→ fit scoring →find_people→find_work_email→verify_email→ tracker CSV. - A tracker CSV read at the start of every run lets the skill skip roles you already saw.
- Two review gates and a never-apply, never-send rule keep you in control.
- Install at
~/.claude/skills/job-hunter/SKILL.md,.claude/skills/job-hunter/SKILL.md, or upload a zip in the Claude app.
Why Build a Job Search Claude Skill
A one-off prompt can run a decent job search once. A skill makes it run the same way the tenth time. That matters because job hunting is a loop: search, filter, review, reach out, repeat. Loops are where prompts drift.
- Filters stop drifting. Titles, locations, work type and salary floor live in one inputs block instead of in whatever you remembered to type.
- Repeat roles disappear. The tracker lets the skill skip anything already logged, so each run only shows new openings.
- Credits stay predictable. Caps on jobs, shortlist size and contacts set a ceiling before any paid tool runs.
- Nothing goes out by accident. The rules section forbids applying and sending, and review gates force a pause before contacts and drafts.
Anthropic describes skills as folders of instructions that Claude loads when relevant, and Claude Code also lets you run one directly with a slash command (see the Claude Code skills documentation). If you have built a skill for sourcing leads, this is the same pattern pointed at a different target; see the lead generation Claude skill guide for the sales version.
What You Need Before You Start
- Claude Code or the Claude app with permission to add a custom connector. On Team and Enterprise plans, an admin controls custom connectors.
- SyncGTM MCP connected. In the Claude app, add a custom connector with the URL
https://api.syncgtm.com/mcpand approve the browser sign-in. In Claude Code, run:
claude mcp add --transport http syncgtm https://api.syncgtm.com/mcp- A plain-text resume (Markdown or text works best) saved next to the skill, so Claude can read it without guessing.
- A few credits. Check the balance any time with the free
check_creditstool. Costs are covered in the cost section.
New to MCP in general? The B2B database MCP guide explains what a connector is and what SyncGTM exposes through it.
Anatomy of the Job Hunter SKILL.md
The skill has five parts: frontmatter, an inputs block, hard rules, numbered steps, and a tracker schema. Here is why each one exists.
Frontmatter
The file must begin with YAML between two --- lines on the very first line. Otherwise the whole file is treated as plain content.
namesets the command. In Claude Code it defaults to the folder name, so keep the two identical (job-hunter).descriptiontells Claude when to use the skill. Put the trigger phrases first ("run my job search", "find new jobs") because long descriptions are truncated in the skill listing.
Claude Code supports extra fields such as allowed-tools and disable-model-invocation. The Claude app is stricter: uploaded skills accept only name, description, license, compatibility, metadata and allowed-tools, and any other key causes an error. The skill in this post sticks to name and description so the same file works in both places.
Inputs Block
Put everything you will change between runs in one list at the top: target titles, locations, work type, experience level, salary floor, how recent a posting must be, the resume path, the tracker path, and the caps. Editing four lines is faster and safer than rewriting a prompt.
Numbered Steps and the Tools They Call
Each paid step names one tool and the parameters to pass. Naming parameters stops Claude from improvising a different search every run.
| Step | Tool | Key parameters |
|---|---|---|
| Preflight | check_credits | None. Free. |
| Find jobs | search_linkedin_job_openings | title (required), locations, work_type, experience_level, published_at, salary_base, exclude_recruiting_agencies, save_only_unique_items, max_results, resume_keywords |
| Find hiring manager | find_people | company_names, job_titles, job_levels, limit |
| Find work email | find_work_email | linkedin_url, domain |
| Verify email | verify_email |
Two parameters do real work. published_at takes a recency window such as r604800 for the past week, which keeps every run focused on fresh postings. resume_keywords takes a list of keyword-and-aliases objects and scores how well each opening matches your resume, so Claude starts its own scoring from a signal instead of from nothing. The salary_basefilter is best-effort, so the skill still checks the posting text and flags "salary unstated" instead of silently dropping roles.
Tracker CSV Schema and Skip Logic
The tracker is how the skill remembers. Step 1 reads it, step 4 drops anything already in it, and step 9 appends new rows. A fixed column order means the file stays usable in a spreadsheet and never drifts between runs.
job_url,company,title,location,posted,salary_text,fit_score,fit_reasons,contact_name,contact_title,contact_linkedin,contact_email,email_status,status,first_seen,notes
https://example.com/jobs/101,Acme Cloud,Growth Marketing Manager,Remote (US),2026-10-15,"$100k-$120k",84,"Paid + lifecycle match",Jane Example,Head of Marketing,https://www.linkedin.com/in/jane-example,jane@acme-example.com,verified,drafted,2026-10-17,Illustrative row with placeholder company and person. Your tracker will hold real data.
Matching on the posting link, with company plus title as a fallback, catches the common case where the same role is reposted. Logging roles you rejected too (status skipped) is what stops them returning next week.
Human Review Gates
A skill that spends credits and drafts outreach needs brakes. This one has two:
- Gate 1, after scoring: you see the shortlist and choose which roles are worth contact lookups. No contact credits are spent before this.
- Gate 2, after drafting: drafts appear in chat only. You edit and send them yourself.
The hard rules also forbid submitting applications and sending anything. Treat those rules as part of the skill, not a suggestion. Also check recruiters' and platforms' terms before contacting people, and read every draft for accuracy before it goes out under your name.
The Full Copy-Paste SKILL.md
Save this as SKILL.md inside a folder named job-hunter. Change the example titles, locations and salary floor in the inputs block to match your own search.
---
name: job-hunter
description: Runs a repeatable job hunt. Use when the user says "run my job search", "find new jobs", "job hunter" or "check for new roles". Searches LinkedIn jobs, scores each against the resume, finds the hiring manager, verifies their email, and logs everything to job-tracker.csv. Never applies and never sends messages.
---
# Job Hunter
Find new roles that fit my resume, find who is hiring for them, and log everything.
Stop for my approval at the two review gates below.
## Inputs (edit these before each run)
- target_titles: ["Product Marketing Manager", "Growth Marketing Manager"]
- locations: ["Austin, Texas", "Remote"]
- work_type: ["remote", "hybrid"]
- experience_level: ["mid-senior"]
- salary_floor: 90000 (minimum base salary, USD)
- posted_within: "r604800" (past week; r86400 = past 24h)
- resume_path: ./resume.md
- tracker_path: ./job-tracker.csv
- max_jobs: 20
- shortlist_size: 5
- hiring_manager_titles: ["Head of Marketing", "VP Marketing", "Director of Marketing"]
## Hard rules
1. Never submit an application. Never send an email, LinkedIn message or connection request. Drafts only.
2. Use only facts that appear in the resume file. Never invent experience, skills or numbers.
3. Call only the tools named in the steps below. Do not add other paid tools.
4. If a tool returns nothing or an error, record that in the tracker notes and move on. Do not retry in a loop.
5. If the tracker file cannot be read, ask me to paste or attach it. Do not assume it is empty.
## Steps
1. Preflight. Read the tracker (create it with the header row in the Tracker schema if missing). Call check_credits. Worst case for this run is about max_jobs x 0.3 + shortlist_size x (3 x 0.2 + 1 + 0.1) credits. If the balance is lower, tell me and stop.
2. Read the resume at resume_path. Extract 8 to 15 skills, tools and domain keywords. Build resume_keywords as a list of objects, each with a keyword and an aliases list (for example keyword "SEO", aliases ["search engine optimization"]).
3. Search. Call search_linkedin_job_openings once with: title = target_titles, locations = locations, work_type = work_type, experience_level = experience_level, published_at = posted_within, salary_base = salary_floor (as a string), exclude_recruiting_agencies = true, save_only_unique_items = true, max_results = max_jobs, resume_keywords = the list from step 2.
4. Skip what I have seen. Drop any job whose posting link is already in the tracker, or whose company and title both match a tracker row. Report how many were dropped.
5. Score fit from 0 to 100 against the resume: skills match 40, seniority and scope 25, location and work type 15, salary vs salary_floor 10, company stage and domain 10. If the posting shows no salary, score that part 5 and say "salary unstated". One short sentence of reasoning per job. Keep the top shortlist_size jobs scoring 60 or higher.
6. REVIEW GATE 1. Show a table: rank, company, title, location, fit score, reasoning, posting link. Ask which roles to continue with. Do nothing else until I answer.
7. Hiring manager. For each approved role, call find_people with company_names = [company], job_titles = hiring_manager_titles, job_levels = ["Manager", "Director", "VP"] and limit = 3. Pick the person whose title is closest to the role's function. If nobody fits, record "no contact found". Never guess a name.
8. Email. For the chosen person, call find_work_email with their linkedin_url and the company domain. If it returns "Email not found", record email_status = not_found. Otherwise call verify_email on the address. Record email_status = verified only if the result clearly says valid, otherwise unverified.
9. Log. Append one row per job reviewed (approved or not) to the tracker using the exact column order below. New rows get status = new, or status = shortlisted for approved roles.
10. REVIEW GATE 2. For approved roles with a contact, write a short draft note (under 90 words) that references one real line from the resume and one detail from the posting. Show the drafts in chat only. Do not send them. Ask me to edit or approve. Set status = drafted for those rows.
11. Summary. Print: jobs found, dropped as seen, scored, shortlisted, contacts found, verified emails, estimated credits spent, and the tracker path.
## Tracker schema (job-tracker.csv, exact column order)
job_url,company,title,location,posted,salary_text,fit_score,fit_reasons,contact_name,contact_title,contact_linkedin,contact_email,email_status,status,first_seen,notes
- status values: new, shortlisted, drafted, skipped, applied_by_me
- Only I change a status to applied_by_me.
- first_seen is today's date in YYYY-MM-DD.
The folder layout:
job-hunter/
SKILL.md
resume.md (optional, or point resume_path elsewhere)
job-tracker.csv (created on first run)At the first review gate, a run looks roughly like this:
Illustrative output (placeholder companies and people)
Review gate 1: shortlist
Rank Company Title Location Fit Why
1 Acme Cloud Growth Marketing Manager Remote (US) 84 Resume covers paid + lifecycle; salary stated, above floor
2 Northwind Labs Product Marketing Manager Austin, TX 78 Strong launch work; stage is later than preferred
3 Example Health Senior PMM Hybrid, Austin 66 Domain gap; salary unstated
Dropped as already seen: 7
Credits spent so far (estimate): 6.0
Which roles should I look up contacts for?Illustrative only. Companies, scores and counts are placeholders, not real results.
Where to Install the Skill
Claude Code
There are two common locations:
- Personal:
~/.claude/skills/job-hunter/SKILL.md. Available in all your projects on that machine. - Project:
.claude/skills/job-hunter/SKILL.mdinside a repository. Available in sessions in that repo, and shareable by committing it.
Personal install:
mkdir -p ~/.claude/skills/job-hunter
# save the SKILL.md from this post as:
# ~/.claude/skills/job-hunter/SKILL.mdOr keep the whole job search in its own project folder:
mkdir -p my-job-search/.claude/skills/job-hunter
cd my-job-search
# save SKILL.md into .claude/skills/job-hunter/
# put resume.md in the project root, then start Claude Code
claudeClaude Code watches these folders, so adding or editing a skill takes effect in the current session. If the top-level skills folder did not exist when the session started, run /reload-skills. Then type /job-hunter or ask Claude to run your job search. Because the resume and tracker use relative paths, start Claude Code from the folder that holds them. Put your resume in a personal skill folder or a private repo only, never in a public one.
Claude App
- Turn on Code execution and file creationunder Settings > Capabilities (on Team and Enterprise, an owner enables it).
- Zip the folder, keeping the folder name equal to the skill name:
zip -r job-hunter.zip job-hunter/- Go to Customize > Skills, click +, choose Create skill, then Upload a skill, and select the zip.
- Add the SyncGTM custom connector at
https://api.syncgtm.com/mcpso the tools are available in chat.
Uploaded skills are private to you until you share them. In the app there is no project folder on your disk, so attach your resume and tracker CSV to the chat; rule 5 in the skill tells Claude to ask for the tracker rather than assume it is empty, and you should download the updated CSV after each run. Anthropic's guide to using skills in Claude lists plan availability and the latest upload steps.
Test It With a Small First Run
Do not run the full 20-job version first. Shrink the caps and check the behavior:
- Set
max_jobs: 5andshortlist_size: 2. - Start with an empty or one-row tracker so you can watch it get written.
- Confirm Claude calls
check_creditsfirst and stops at the first review gate. - Approve one role and check that the contact has the right title and that nothing was sent.
- Run the skill a second time with the same filters. Previously seen roles should be reported as dropped. If they are not, the skip logic is broken.
Tighten the Skill After a Bad Run
Every bad run points to a missing sentence in the file. Fix the file, not the chat, so the fix applies to every future run.
| What went wrong | Likely cause | Edit to make |
|---|---|---|
| Same roles showed up again | Tracker not read, or matching too loose | Make step 1 mandatory; match on posting link first, then company plus title |
| Shortlist full of poor fits | Weak resume keywords or vague scoring | Add more specific keywords with aliases; raise the minimum score from 60 |
| Agency postings clogged the list | Filter missing | Confirm exclude_recruiting_agencies = true is in step 3 |
| Wrong person picked as hiring manager | Broad titles | Narrow hiring_manager_titles to the function; require a title match, otherwise "no contact found" |
| Claude kept retrying a failed tool | No failure rule | Keep rule 4: log the error, move on, never loop |
| A draft claimed experience you do not have | Draft step not tied to the resume | Strengthen rule 2 and require each draft to quote a real resume line |
| Tracker columns changed | Schema not exact | Keep the header line verbatim and say "exact column order" |
Keep edits small and re-run the five-job test after each one so you know which change fixed what.
What a Run Costs
Per-tool prices from the SyncGTM MCP documentation:
| Tool | Credits |
|---|---|
| check_credits | Free |
| search_linkedin_job_openings | 0.3 per job returned |
| find_people | 0.2 per person returned |
| find_work_email | 1 per email found (misses not billed) |
| verify_email | 0.1 per check |
With the example caps (20 jobs, 5 shortlisted, 3 people per company), the worst case is 20 x 0.3 + 5 x (3 x 0.2 + 1 + 0.1) = 6 + 8.5 = 14.5 credits per run. That is the number the preflight step computes. To model other volumes, use the credits estimator or see SyncGTM pricing. For email-finding specifics, the email finder MCP guide explains how the waterfall works.
Conclusion
A job search Claude skill replaces a prompt you keep rewriting with a file you keep improving. The inputs block holds your search, the numbered steps name each tool and its parameters, the tracker CSV remembers what you have seen, and the review gates keep every send and every application in your hands.
Connect SyncGTM MCP, save the skill as job-hunter, run the five-job test, and tighten it after each bad run. For the full end-to-end workflow around it, read Job Search With Claude: Find Jobs and Hiring Managers.
