Job Search Claude Plugin: Bundle Skills, Agents and MCP (2026)
By Kushal Magar · October 18, 2026 · 15 min read
Key Takeaway
A job search Claude plugin is one folder that Claude Code installs as a unit: a plugin.json manifest, an .mcp.json pointing at https://api.syncgtm.com/mcp, a job-search skill, three slash commands and a daily job-hunt agent. Test it with claude --plugin-dir, host it in a Git repository with a marketplace.json, and your whole cohort installs it with two commands. Claude researches and drafts. Everyone reviews and sends their own messages.
A job search Claude plugin packages everything you set up by hand, the data connection, the playbook, the repeatable commands and the daily agent, into one folder that Claude Code installs in a single step. You build it once and every person in your job-search group gets the same working setup.
This is the last post in our job search Claude series. It builds on the pillar guide to job search with Claude, and it is blunt about the one rule that matters: the plugin researches and drafts, you review and send.
How do you build a Claude Code plugin for job search?
Create a folder with .claude-plugin/plugin.json, an .mcp.json that declares the SyncGTM server at https://api.syncgtm.com/mcp, a skills/job-search/SKILL.md, command files in commands/ and an agent in agents/. Check it with claude plugin validate, load it with claude --plugin-dir, then publish it in a Git repository that has a marketplace.json.
TL;DR
- What you build: a plugin named
job-huntwith one MCP server, one skill, three commands and one agent. - Commands you get:
/job-hunt:find-jobs,/job-hunt:hiring-manager,/job-hunt:draft-note, plus thedaily-job-huntagent. - Test:
claude plugin validate, thenclaude --plugin-dir ./job-hunt. - Share:
/plugin marketplace add your-user/job-hunt-toolsthen/plugin install job-hunt@job-hunt-tools. - Cost: about 4 SyncGTM credits for a daily run of 10 jobs and 6 people.
- Hard rule: no auto-apply, no unreviewed email. The agent cannot send anything.
What Is a Job Search Claude Plugin?
Per Anthropic's plugins overview, a Claude Code plugin is a directory of skills, agents, hooks, MCP servers or other components that Claude Code installs and loads as one unit. A manifest at .claude-plugin/plugin.json gives it a name. Everything else sits at the plugin root.
A job search Claude plugin is that format pointed at one job: finding roles, finding the person who owns them, and drafting a note you will send yourself. The pieces map neatly:
| Component | What it does for a job search | File |
|---|---|---|
| MCP server | Live LinkedIn jobs, people search, work emails, verification | .mcp.json |
| Skill | The playbook: tool order, credit limit, review rules | skills/job-search/SKILL.md |
| Commands | Repeatable entry points you type | commands/find-jobs.md and two more |
| Agent | A daily run with a locked-down tool list | agents/daily-job-hunt.md |
| Manifest | Name, version, description, author | .claude-plugin/plugin.json |
Why bundle instead of copying files around
Skills, agents and MCP config all work on their own. A plugin earns its place when other people need the same setup. Anthropic puts it plainly: use a plugin to package several components as one unit, give your setup to teammates, or publish versioned releases. For a bootcamp cohort that means one install command instead of a README with eleven steps.
Competing tutorials on building plugins stop at a single skill. They rarely show a remote MCP server inside a plugin, a restricted agent, or how a group actually installs and updates the result. This guide covers all three.
Plugin Folder Structure and Manifest
We will build two things in one repository: the plugin, and a small marketplace that lists it. That is what lets your group install with /plugin install.
Repository layout
job-hunt-tools/
├── .claude-plugin/
│ └── marketplace.json
└── plugins/
└── job-hunt/
├── .claude-plugin/
│ └── plugin.json
├── .mcp.json
├── skills/
│ └── job-search/
│ └── SKILL.md
├── commands/
│ ├── find-jobs.md
│ ├── hiring-manager.md
│ └── draft-note.md
└── agents/
└── daily-job-hunt.mdTwo layout rules from the manifest reference trip people up:
- Only
plugin.jsongoes inside.claude-plugin/. Skills, commands, agents and.mcp.jsonsit at the plugin root. Components saved inside.claude-plugin/do not load. - In the manifest,
nameis the only required field. It becomes the prefix on everything the plugin provides, so use kebab-case with no spaces. Names that start withclaude-oranthropic-are rejected by the validator, which is why this plugin is calledjob-hunt.
plugins/job-hunt/.claude-plugin/plugin.json
{
"name": "job-hunt",
"displayName": "Job Hunt",
"version": "1.0.0",
"description": "Live LinkedIn jobs, hiring manager lookup and draft notes through SyncGTM MCP",
"author": {
"name": "Your Name"
},
"license": "MIT",
"keywords": ["job-search", "linkedin", "hiring-manager", "mcp"]
}displayName is the label shown in the plugin panel, version controls updates (more on that below), and author needs a name. Every field here is from the documented manifest schema, and unknown top-level fields are stripped, so do not invent your own.
Build the Plugin in Five Files
Create the folders first, then add each file. Replace the author name with yours.
Terminal
mkdir -p job-hunt-tools/.claude-plugin
mkdir -p job-hunt-tools/plugins/job-hunt/.claude-plugin
mkdir -p job-hunt-tools/plugins/job-hunt/skills/job-search
mkdir -p job-hunt-tools/plugins/job-hunt/commands
mkdir -p job-hunt-tools/plugins/job-hunt/agents1. Declare the SyncGTM MCP server
A plugin declares MCP servers in .mcp.json at its root, in the same shape as a project .mcp.json. For a remote server you set type to http and give the url. A url with no type is read as a local stdio server and fails, so always include type.
plugins/job-hunt/.mcp.json
{
"mcpServers": {
"syncgtm": {
"type": "http",
"url": "https://api.syncgtm.com/mcp"
}
}
}This is the file version of the command from the pillar post, claude mcp add --transport http syncgtm https://api.syncgtm.com/mcp. There is no API key to store. The server authenticates through your browser. Once the plugin is loaded, run /mcp and the server appears as plugin:job-hunt:syncgtm. The full tool list is in the SyncGTM MCP setup docs.
Already ran claude mcp add yourself? Remove that copy with claude mcp remove syncgtm so you do not have two servers.
2. Write the job-search skill
The skill is the playbook Claude loads when a request matches its description. Because it lives in a plugin, it runs as /job-hunt:job-search. This one pins the tool order and the review rules, and it keeps your resume out of the repository by reading a profile file from the user's own machine.
plugins/job-hunt/skills/job-search/SKILL.md
---
name: job-search
description: Job-search playbook. Use when the user wants to find jobs, rank roles against a resume, identify a likely hiring manager or draft an outreach note. Sets the tool order, credit limits and review rules.
---
You run a job search for the user with the SyncGTM MCP tools. You research and draft. The user decides and sends.
## Inputs
- The user's profile lives in a file they name, for example ~/job-hunt/profile.md. Read it. Never ask for a phone number or home address.
- If there is no profile file, ask for target titles, locations, work type and three resume highlights.
## Tool order
1. check_credits (free) at the start of a run.
2. search_linkedin_job_openings. Always set title (array), locations, published_at and max_results. Default max_results to 25. Set exclude_recruiting_agencies and save_only_unique_items to true.
3. Rank the results against the profile. Score each role out of 10 with two reasons and one gap. Use only facts in the profile.
4. find_people for at most the top 3 roles. Pass company_names or company_linkedin_urls, plausible manager job_titles and job_levels, and limit 3.
5. find_work_email and verify_email only when the user asks for an address for a named person.
## Rules
- Spend no more than 10 credits in one run without asking.
- Say that a hiring manager is an inference. Ask the user to confirm it on LinkedIn.
- Never invent experience, metrics or skills.
- Never send, schedule or submit anything. No email, no LinkedIn message, no job application. Draft in chat only.
- Only use an email address that verify_email confirms as deliverable.The tools it names are the ones SyncGTM exposes: search_linkedin_job_openings (title is the only required argument, and it is an array), find_people, find_work_email, verify_email and the free check_credits. The pillar guide walks through each one with sample output.
3. Add the three slash commands
Each file in commands/ becomes /<plugin>:<file>, so these run as /job-hunt:find-jobs, /job-hunt:hiring-manager and /job-hunt:draft-note. Command files take the same frontmatter as skills. Anthropic now recommends skills over commands for new plugins, so if you prefer, put the same files in skills/<name>/SKILL.md instead. Both load the same way.
Two details worth copying. disable-model-invocation: true stops Claude from firing a command by itself, which matters when a command spends credits. And the argument-hint value is quoted, because an unquoted [text] [text] is parsed as a YAML list. $ARGUMENTS carries whatever you type after the command.
plugins/job-hunt/commands/find-jobs.md
---
description: Search live LinkedIn jobs and rank them against my profile
argument-hint: "[job titles] [location]"
disable-model-invocation: true
---
Follow the job-search skill. Arguments: $ARGUMENTS
1. Run check_credits and tell me my balance.
2. Call search_linkedin_job_openings with the titles and location from the arguments. Use published_at "r604800", exclude_recruiting_agencies true, save_only_unique_items true and max_results 25.
3. Read my profile file and rank the roles from best to worst fit. Show a table: rank, title, company, location, fit out of 10, one gap, job URL.
4. Stop after the table. Do not look up people or emails. Ask which roles I want to pursue.plugins/job-hunt/commands/hiring-manager.md
---
description: Shortlist the likely hiring manager for a role
argument-hint: "[company] [job title]"
disable-model-invocation: true
---
Follow the job-search skill. Arguments: $ARGUMENTS
1. Call find_people for the company in the arguments. Use job_titles that sit one or two levels above the role, job_levels of Director or VP, and limit 3.
2. Show name, title, LinkedIn URL and one line on why each person might own the role.
3. State clearly that this is an inference and that I should confirm it on LinkedIn.
4. Do not look up emails. Ask whether I want an address for one named person.plugins/job-hunt/commands/draft-note.md
---
description: Get a verified email for one named person and draft a short note
argument-hint: "[person name] [company] [role]"
disable-model-invocation: true
---
Follow the job-search skill. Arguments: $ARGUMENTS
1. Confirm the person's LinkedIn URL with me. Tell me the lookup costs up to 1.1 credits and wait for a yes.
2. Call find_work_email with the LinkedIn URL and the company domain, then verify_email on the result.
3. If the address is not confirmed deliverable, say so and suggest a LinkedIn connection note instead.
4. Draft a note of at most 90 words: the exact role and one detail from the job post, one result from my profile file, one low-pressure ask. Add a subject line under 7 words and a one-line opt-out.
5. Show the draft in chat. Do not send it, save it as a draft in any mailbox or post it anywhere. I will edit and send it myself.Notice the pacing. find-jobs stops at a ranked table. hiring-manager stops at a shortlist. draft-note is the only command that touches email, and it asks before it spends a credit. Each step hands control back to you.
4. Add the daily job-hunt agent
Each Markdown file in agents/ defines one subagent. In a plugin its name becomes job-hunt:daily-job-hunt, and you can invoke it explicitly with @agent-job-hunt:daily-job-hunt.
The important line is tools. If you omit it, a subagent inherits every tool in the session, including any mail or calendar connectors you have. Listing tools turns the guardrail from a polite request into a hard limit. MCP tools from a plugin are named mcp__plugin_<plugin>_<server>__<tool>, so the agent below can read your profile, check credits, search jobs and find people, and nothing else. It has no email lookup, no write access and no shell.
plugins/job-hunt/agents/daily-job-hunt.md
---
name: daily-job-hunt
description: Runs the daily job hunt. Pulls new LinkedIn jobs from the last 24 hours, ranks them against the saved profile and shortlists likely hiring managers for the top three. Use for a daily job-hunt report.
model: sonnet
maxTurns: 20
tools: Read, mcp__plugin_job-hunt_syncgtm__check_credits, mcp__plugin_job-hunt_syncgtm__search_linkedin_job_openings, mcp__plugin_job-hunt_syncgtm__find_people
---
You are the daily job-hunt agent. Follow the job-search skill.
1. Read the profile file the user names, for example ~/job-hunt/profile.md.
2. Call check_credits. If the balance is under 5 credits, stop and report it.
3. Call search_linkedin_job_openings with the profile's titles and locations, published_at "r86400", exclude_recruiting_agencies true, save_only_unique_items true and max_results 10.
4. Rank the roles against the profile. Keep the top three.
5. Call find_people once per top-three company, with limit 3.
6. Return one report: a ranked table, the likely managers with a note that they are inferences, and the credits spent.
You have no email lookup, no write access and no way to send anything. Do not try to work around that. End by asking which roles the user wants to pursue.Plugin agents support name, description, model, maxTurns, tools and a few more. They ignore hooks, mcpServers and permissionModein frontmatter, which is why the MCP server lives in the plugin's .mcp.json and not in the agent file. Want the agent to run on a schedule? Our job search Claude agent guide covers that side in depth.
Test the Plugin Locally
You do not need a marketplace to try it. Validate first, then load the plugin folder for one session.
Terminal
claude plugin validate ./job-hunt-tools/plugins/job-hunt
claude --plugin-dir ./job-hunt-tools/plugins/job-huntclaude plugin validate checks the manifest and the frontmatter of every skill, agent and command, and ends with Validation passed. We ran both files in this post through it. Then, inside the session:
- Run
/mcp, select thesyncgtmserver and authenticate in the browser. Confirm it shows as connected. - Ask Claude to check your SyncGTM credit balance. This call is free and proves the connection.
- Make a profile file such as
~/job-hunt/profile.mdwith your target titles, locations and three resume highlights. Leave out your phone number and home address. - Type
/job-hunt:find-jobswith your target title and location, and check the table. - Ask Claude to use the
job-hunt:daily-job-huntagent for one run.
Edit a file, then run /reload-plugins to load the change without restarting. If something is missing, the Errors tab in /plugin says what failed to load. The create a plugin page documents the whole test loop.
Install From a Git-Hosted Marketplace
A marketplace is a repository with .claude-plugin/marketplace.json that lists plugins and where to fetch each one. It requires a name, an owner and a plugins array. Each entry needs a name and a source. A relative source is written from the marketplace root, the folder that contains .claude-plugin/.
job-hunt-tools/.claude-plugin/marketplace.json
{
"name": "job-hunt-tools",
"description": "A job-search plugin for our cohort",
"owner": {
"name": "Your Name"
},
"plugins": [
{
"name": "job-hunt",
"source": "./plugins/job-hunt",
"description": "Live LinkedIn jobs, hiring manager lookup and draft notes for Claude Code"
}
]
}Keep the entry name identical to the name in plugin.json, or installs by name fail with a "not found in marketplace" error. Set version in plugin.json only, not in both places.
Test the marketplace on your own machine
Terminal
claude plugin validate ./job-hunt-tools
claude plugin marketplace add ./job-hunt-tools
claude plugin install job-hunt@job-hunt-tools
claude plugin listThe install id is the entry name, an @, and the marketplace name. claude plugin list should show job-hunt@job-hunt-tools as enabled. Inside a session, /plugin marketplace add ./job-hunt-tools does the same registration.
Publish it on GitHub
Terminal
cd job-hunt-tools
git init
git add .
git commit -m "job-hunt plugin v1.0.0"
git branch -M main
git remote add origin git@github.com:your-github-user/job-hunt-tools.git
git push -u origin mainNow anyone with access runs the two commands that matter. The shorthand owner/repo always means github.com. For GitLab or another host, send the full clone URL instead.
Claude Code session
/plugin marketplace add your-github-user/job-hunt-tools
/plugin install job-hunt@job-hunt-toolsIn a session, /plugin installopens the plugin's details so you can review what it adds and pick a scope: user (every project on your machine), project (everyone in one repository) or local. From a shell, claude plugin install job-hunt@job-hunt-tools installs at user scope by default. Pin a branch or tag by appending #ref to the repository, as in your-github-user/job-hunt-tools#v1.0.0.
Human-Review Guardrails Built In
A plugin multiplies whatever behavior you bundle, so the rules go in the files, not in a reminder. Here is where each one lives.
| Rule | Where it is enforced |
|---|---|
| No auto-apply | Skill rule: never submit anything. No tool in the plugin can submit an application. |
| No unreviewed email | draft-note shows the draft in chat only. The agent has no email tool and no write access. |
| No surprise credit spend | Commands set disable-model-invocation. Skill caps a run at 10 credits. draft-note asks before the lookup. |
| No unverified addresses | Skill rule: use an address only if verify_email says deliverable. |
| No invented experience | Skill rule: use only facts in the profile file. |
| Hiring manager is a guess | Skill and hiring-manager command both label results as inferences to confirm. |
| Resume stays private | Profile file is read from the user's machine. Nothing personal is committed. |
Also keep to the basics from the pillar guide: one personal note per role, a clear opt-out line, and the email laws that apply where you and the recipient live. Do not automate connection requests or messages on your own LinkedIn account. SyncGTM reads public data through a hosted API and never logs in as you.
What the Plugin Costs to Run
The plugin is free. The data calls spend SyncGTM credits from each user's own account. These rates come from the live tool schemas.
| Tool | Rate | Used by |
|---|---|---|
| check_credits | Free | Agent, find-jobs |
| search_linkedin_job_openings | 0.3 per job returned | Agent, find-jobs |
| find_people | 0.2 per person returned | Agent, hiring-manager |
| find_work_email | 1 per call, misses not billed | draft-note |
| verify_email | 0.1 per call | draft-note |
A daily agent run of 10 jobs and three companies with three people each is 3.0 + 1.8 = 4.8 credits at the maximum. A typical run lands near 4 to 5. Add 1.1 credits whenever you ask draft-note for one verified address. Confirm current rates in the credits estimator and see plans on the pricing page.
Troubleshooting
- Skills or commands are missing. They were saved inside
.claude-plugin/. Move them to the plugin root, then run/reload-plugins. - The syncgtm server does not appear in /mcp. Check that
.mcp.jsonis at the plugin root, not in~/.claude/, and that it hastypeset tohttp. - The agent reports no tools. The names in
toolsmust match your plugin and server names exactly. If you rename the plugin, update themcp__plugin_<plugin>_syncgtm__prefix. - Plugin not found in marketplace. The entry name and the
plugin.jsonname differ. Make them identical. - Install works for you but not a teammate. A private repo needs stored git credentials on their machine.
- Updates never arrive. You pushed without changing
version.
The Job Search Claude Series
This plugin bundles the pieces from the rest of the series. Start with the pillar if you have not run the workflow by hand yet.
- Job Search Claude: the full loop from live jobs to a verified email.
- Job Search Claude Prompts: copy-paste prompts for searching, scoring and drafting.
- Job Search Claude Skill: build a SKILL.md job hunter that packages the steps into a reusable command.
- Job Search Claude Agent: automate the daily hunt with an agent, keeping a human in the send loop.
For the data side of the same stack, see lead generation with Claude, enrichment in Claude and the LinkedIn scraper MCP guide.
Conclusion
A job search Claude plugin turns a pile of prompts into something a whole group can install, update and trust. One manifest, one MCP file, one skill, three commands and one tightly scoped agent give every member the same ranked jobs, likely hiring managers and draft notes, while the tool list and the rules keep a human on the send button.
Build it in an afternoon: validate it, load it with --plugin-dir, run one real search, then push it and send the three-line message. You can start with SyncGTM for free to power the data calls.
