The two-sided outreach problem, solved with one MCP and 18 skills.
Recruitment is the only agency model where you sell twice: to the client who pays, and to the candidate who has no reason to reply. Most Claude recruiting repos handle the candidate side and ignore the client side entirely.
Inside: the Prosp MCP setup that runs both motions from one workspace, 18 skills written out in full, the ATS handoff, and the four open-source repos worth installing alongside.
Plus the shared send ceiling, which is where two-sided outreach actually breaks.
AI Driven, Personalized Outreach on LinkedIn: Prosp 💜
Section 1Setup: Two Motions, One Ceiling, Three Files
You sell twice. To the client who pays, and to the candidate who has no reason to reply.
Both motions run on the same LinkedIn account, against the same daily ceiling. That is the constraint most recruiting setups ignore until an account gets restricted.
The two motions
| Client side | Candidate side | |
|---|---|---|
| Who you message | Hiring managers, heads of talent, founders | Passive candidates in role |
| The signal | They posted a job, or they are hiring badly | Their work, visible and specific |
| What kills it | They have a PSL and you are not on it | They are not looking, and you sound like every recruiter |
| Cycle | 2 to 8 weeks to a first brief | Days, if the message is right |
| Volume needed | Low. Tens of accounts. | High. Hundreds per role. |
The asymmetry is the whole problem. The candidate side needs volume and the client side needs precision, and they compete for the same 20 connection requests a day.
The split that works: 5 client side, 15 candidate side, on a single account. If you are running both at 20 each, the account is attempting 40 a day and that is how it gets restricted.
Better: separate accounts. One for business development, one for sourcing. Different profiles, different positioning, different ceilings. That is the single biggest structural improvement available to a recruitment agency on LinkedIn, and almost nobody does it.
Install the MCP
The Prosp MCP is what lets Claude run both motions without driving a browser at your account.
claude mcp add prosp -- uvx prosp-mcp-server@latest
export PROSP_API_KEY=your_key_here
uvx prosp-mcp-server@latest --check
The check verifies the key and prints your connected accounts. It sends nothing.
Set the budget to reflect the split:
PROSP_DAILY_CONNECTION_BUDGET=20
PROSP_READ_ONLY=true # for the first session
The server refuses any volume above the budget and explains that the ceiling is account-wide rather than per campaign. For a two-sided agency running four roles at once, that refusal is the thing standing between you and a restricted account.
Repo: github.com/JackJProsp/prosp-mcp-server
The three context files
One set per agency, plus one brief per live role.
context/
├── agency.md what we place, where, and our actual fill data
├── voice.md three of our real messages that got replies
└── proof.md placements we can reference, with permission
roles/
└── [client]-[role]/brief.md
agency.md
## What we place
Functions, seniority bands, and the sectors we actually fill:
Functions we take briefs for but fill badly:
Geography:
## Our fill data, last 12 months
Roles taken:
Roles filled:
Average days to first shortlist:
Average days to offer:
Fill rate by function:
## Fee structure
Contingent, retained, or both:
Percentage, and what triggers it:
## Who we do not work with
## Banned
<never_use_these>
Claims about speed or fill rate we cannot evidence:
Candidate names, ever, in client outreach:
</never_use_these>
The fill rate by function line is the one that matters. It is the number that decides which briefs to take and the one most agencies do not track honestly. A 30% fill rate on a function you keep pitching is a function you should stop pitching.
proof.md needs two permission columns, not one: permission to name the client, and permission to name the candidate. They are different conversations and conflating them is how a placement story becomes a problem.
The role brief
One per live role. Every candidate-side skill reads it.
# [Client] [Role]
## Status
intake / active / paused / offer / closed-filled / closed-cancelled
## The role
Title, as it will appear:
Title as candidates actually search for it:
Salary band, and whether it is disclosed:
Location and working pattern:
Why this role exists. New headcount or a replacement:
## The hiring manager
Name, title, and how decisive they are:
Who else interviews:
How fast can they move:
## The candidate
Where the good ones currently work:
What they are doing now that this improves on:
What would make them ignore us:
## The honest pitch
Why someone good would leave a decent job for this:
What is genuinely weak about it:
## Sourcing
Search terms that work:
Companies to target:
Companies we cannot approach:
"What is genuinely weak about it" is not optional. Every role has something. A recruiter who names it early gets trusted; one who lets a candidate discover it at offer stage loses the placement and the candidate.
"Companies we cannot approach" prevents the expensive mistake. Off-limits agreements with existing clients are the kind of thing that ends a relationship when breached by an automated sequence.
Section 2The Client Side: 9 Skills for Winning Briefs
Nine skills for the side that pays. Winning briefs, not filling them.
This is the half most recruiting repos ignore entirely.
01. job-post-scanner
The strongest signal in recruitment BD, and it is sitting in public.
---
name: job-post-scanner
description: Find companies hiring roles you fill well. The core
client-side list source. Run daily.
---
SEARCH job boards and LinkedIn for roles matching the functions in
agency.md where our fill rate is above 50%. Not every role we take.
CAPTURE per row:
- The exact role title, verbatim
- Posting date
- How long it has been live
- Whether it has been reposted
- The hiring manager, where visible
- Company size and whether it fits our fee band
- Whether an agency is already credited
SCORE by age:
Under 14 days too early. They are still running it internally.
14 to 45 days the window. Internal sourcing has stalled.
Over 60 days either filled or the spec is broken.
REPOSTED the strongest signal available.
A REPOST means the first attempt failed. That company has a live
need, an allocated budget, and recent evidence that their own
process is not working. Nothing else on LinkedIn combines those
three.
DROP anything where our fill rate for that function is under 40%.
Winning a brief you cannot fill costs more than not winning it.
02. hiring-pain-reader
---
name: hiring-pain-reader
description: Read a job posting for what is wrong with it. This is
the opener.
---
FROM THE POSTING ALONE, identify:
SALARY
Is a band disclosed? An undisclosed band on a competitive role
loses roughly half the applicants before they read anything.
TITLE
Does the title match what candidates actually search for?
"Growth Ninja" returns nobody.
SPEC
Count the required years, the must-have tools, and the
qualifications. If the combination describes fewer than 50
people in the market, say so and estimate the number.
SENIORITY MISMATCH
Is the salary band consistent with the experience demanded?
PROCESS
Does it mention how many stages? Six stages named up front is
honest. Six stages unnamed is a drop-off problem.
OUTPUT the three most costly problems, each with one line on what
it is doing to their applicant flow.
BE SPECIFIC AND BE RIGHT. "Your job spec could be stronger" is
nothing. "Asking for 8 years of a tool that has existed for 5"
is a message they cannot ignore.
NEVER send this as a lecture. It is a finding, offered once.
The eight-years-of-a-five-year-old-tool finding is the single best opener in recruitment BD. It is checkable, it is their mistake, and it proves you read the posting rather than scraped it.
03. client-opener
---
name: client-opener
description: The first message to a hiring manager.
---
STRUCTURE
Line 1 The specific finding from the posting. Quote it.
Line 2 What that is costing them, in candidates or weeks.
Line 3 One question.
RULES
- Under 300 characters.
- QUOTE the posting in quotation marks. Paraphrasing loses the
entire effect, because the point is that you read it.
- Never mention your fee, your database, or your process.
- Never say "I have candidates for this" unless you do, named,
and can produce them the same day.
- No compliments. No "I hope this finds you well".
- No em dashes.
BANNED, burnt beyond use in recruitment:
"I have a fantastic candidate"
"I specialise in [function] recruitment"
"Are you open to a quick chat about your hiring"
"I noticed you're hiring"
"Just checking if you still need help with this role"
The last one is the most-sent recruitment message on LinkedIn and
it has a reply rate near zero.
"I have a fantastic candidate" is the one to retire permanently. Every hiring manager has received it from someone who did not, and the phrase now signals the opposite of what it claims.
04. market-map
The deliverable that wins retained work.
---
name: market-map
description: Build a market map for a role, as a free deliverable
before any fee conversation. High effort.
---
FOR A GIVEN ROLE AND GEOGRAPHY:
1 THE POPULATION
How many people plausibly do this job, in this market, at this
level. Show the arithmetic.
2 WHERE THEY SIT
The 10 to 15 companies holding most of them.
3 THE COMPENSATION PICTURE
The band, from published postings only. Cite each source.
4 THE MOVEMENT PICTURE
Which of those companies have had recent layoffs, a
restructure, or a leadership change. Dated, with sources.
5 THE HONEST VERDICT
Is this role fillable at this salary in this market? If no,
say no and state what would have to change.
POINT 5 IS THE DELIVERABLE. Telling a client their role is not
fillable at the salary they set is the most valuable thing you can
say to them, and almost no agency says it before taking the brief.
NEVER name individual candidates in a market map. That is the
product, not the sample.
FAIL CLOSED if you cannot source the compensation data. An
invented band in a market map is a credibility problem you cannot
recover from.
This is the play that moves an agency from contingent to retained. A map delivered free, with an honest verdict, does more than any pitch deck.
05 to 09: the rest of the client side
---
name: 05 psl-navigator
description: Work out whether a target has a preferred supplier
list, and what to do about it.
---
CHECK for: procurement language in postings, a named agency in the
footer, whether they advertise through one channel consistently.
IF A PSL EXISTS, the direct pitch is wasted. Three routes instead:
The role they cannot fill through the PSL
The function the PSL does not cover
The hiring manager frustrated enough to raise an exception
NEVER pretend not to know. "I know you work with [agency], which
is why I am only writing about [specific hard role]" outperforms
a pitch that ignores it.
---
name: 06 brief-taker
description: The questions that decide whether a role is fillable,
asked before you accept it.
---
TWELVE QUESTIONS. The last four are the ones nobody asks:
9 Who else is working this role?
10 What happened to the last person in it?
11 How many candidates have you already rejected, and why?
12 If we send someone perfect on Friday, who says yes and when?
QUESTION 12 IS THE QUALIFIER. A hiring manager who cannot answer
it does not have a live role, they have an intention.
OUTPUT a fillability verdict: TAKE, TAKE WITH CONDITIONS, or
DECLINE, with the reason.
DECLINE is a valid and underused output.
---
name: 07 client-objection-handler
description: The five objections every recruitment agency hears.
---
"We use a PSL" -> route via 05, do not argue
"Your fee is too high" -> ask what they compare it against,
and what a vacancy costs them monthly
"We're hiring in-house" -> ask what their time to first shortlist
looks like currently
"We tried an agency" -> ask what the shortlist looked like.
It is almost always that.
"Send us CVs first" -> the speculative CV trap. Decline it
politely and offer the market map.
Never answer a fee objection with your process. Work the cost of
the vacancy with them, using their numbers.
---
name: 08 placement-proof-writer
description: Turn a filled role into a referenceable story.
---
STRUCTURE: the brief, the constraint, what we did differently, the
time to shortlist, the outcome, and one line from the client.
TWO PERMISSION FIELDS, checked separately:
Client named: YES / ANONYMISED / NO
Candidate named: YES / ANONYMISED / NO
NEVER name a candidate without written permission, even in an
anonymised client story. Their current employer reads LinkedIn.
---
name: 09 client-diagnostic
description: Weekly. Which stage of the BD motion is broken.
---
1 Acceptance below 15% the note, or you are messaging the
wrong seniority
2 Replies below 10% the finding was generic. Was it quoted?
3 Replies fine,
no briefs you are reaching people who cannot
award work
4 Briefs fine,
no fills the qualifier at intake. Run 06 harder.
STAGE 4 IS THE EXPENSIVE ONE. Taking briefs you cannot fill feels
like winning for about six weeks.
Section 3The Candidate Side: 9 Skills, and the Repos
Nine skills for the side that has no reason to reply.
A passive candidate is not job hunting. The message has to be interesting on its own terms, because there is no need being met.
10. talent-mapper
---
name: talent-mapper
description: Build the sourcing list from observable work, not from
job titles. Run per role.
---
Read roles/[client]-[role]/brief.md.
SOURCE FROM OBSERVABLE WORK, strongest first:
1 People posting substantively about this exact problem
2 Commenters on posts in the discipline
3 Speakers and attendees at relevant events
4 People at the named target companies in the brief
5 Title search, last
SOURCE 1 BEATS SOURCE 5 BY A DISTANCE. Someone writing about
distributed systems has demonstrated they think about distributed
systems. Someone whose title says Senior Engineer has demonstrated
that a company gave them a title.
CAPTURE per candidate:
The specific work you can see, WITH THE URL
Current company and tenure
Whether they have moved in the last 12 months
Anything suggesting they might move
TENURE IS THE STRONGEST TIMING SIGNAL. Eighteen months to three
years in role is the window. Under twelve months they just moved.
Over five years they are probably staying.
CHECK against "companies we cannot approach" in agency.md before
anything leaves this skill.
11. agency-operator-finder
The most reachable candidate group in the market and the one nobody works.
---
name: agency-operator-finder
description: Find agency-side people ready to move client-side.
---
TARGET people three or more years into an agency, consultancy or
service business, whose client work is visible.
WHY THIS GROUP:
They have seen many companies, so they ramp fast.
They are frequently ready to move in-house and nobody asks.
Everyone assumes they are happy because their agency posts
about how great it is to work there.
SIGNALS:
Three plus years at one agency
Posting about client work rather than agency life
Commenting on in-house roles
An agency that has recently lost accounts or restructured
THE OPENER references the specific client work you can see, and
names what an in-house version of that job would let them do
differently. Never "are you open to opportunities".
12. candidate-opener
---
name: candidate-opener
description: The first message to someone who is not looking.
---
STRUCTURE
Line 1 The specific work of theirs you saw, and what was good
about it. Not "your profile". Not "your experience".
Line 2 What you are recruiting for and why it needs that exact
thing.
Line 3 One question.
RULES
- Under 300 characters.
- NAME THE COMPANY, or say plainly that you cannot yet and why.
Anonymous roles read as a fishing expedition.
- STATE THE SALARY BAND if the brief allows. Withholding it is
the single most common reason a good candidate does not reply.
- Never paste the job description.
- Never say "I think you'd be a great fit" without saying why,
specifically.
- No em dashes.
BANNED, burnt:
"I have an exciting opportunity"
"Are you open to new opportunities"
"I came across your profile and was impressed"
"Your background caught my eye"
"Quick question about your career"
IF THEY SAY NO, ask who they would recommend. That question
produces more placements than the original message does, and
almost nobody asks it.
The salary band rule is the one with the most behind it. A passive candidate who has to reply to find out the money frequently does not reply. Withholding it costs more candidates than it protects negotiating room.
13 to 18: the rest of the candidate side
---
name: 13 boolean-builder
description: Build search strings that return the right people.
---
BUILD three strings per role, widening:
TIGHT exact title plus two must-have signals
MEDIUM title variants plus one signal
WIDE the skill, not the title
INCLUDE the title variants candidates actually use, which are
frequently not the client's internal title.
REPORT the count each string returns. A tight string returning
four people is not a search, it is a shortlist.
---
name: 14 candidate-screener
description: Screen against the brief, and against the honest
weaknesses in it.
---
PER CANDIDATE: match, gaps, and one flag.
THE FLAG is the thing that would make this placement fail at six
months. Commute, seniority mismatch, a step backwards in scope, a
culture mismatch visible from their posts.
NEVER screen on anything not in the brief and not job-relevant.
Age, name, photograph, university, career gaps, and anything
inferred from them are out of scope. If a criterion cannot be
stated to the candidate, it is not a criterion.
---
name: 15 candidate-reply-router
description: Classify every candidate reply.
---
INTERESTED / CURIOUS BUT HAPPY / TIMING / WRONG FIT /
NOT INTERESTED / REFERRAL OFFERED / ESCALATE
CURIOUS BUT HAPPY is the category recruiters bin and it is the
most valuable one. They are not moving today. They will move in
fourteen months, and the recruiter they remember is the one who
sent something useful rather than chasing.
REFERRAL OFFERED gets answered within the hour, always.
---
name: 16 shortlist-writer
description: The client-facing shortlist.
---
PER CANDIDATE: why them in two lines, the evidence, the gap
stated openly, and their motivation in their own words.
THE GAP LINE IS MANDATORY. A shortlist where every candidate is
perfect reads as a sales document and gets discounted entirely.
THREE TO FIVE CANDIDATES. A shortlist of twelve is a search
result, and sending one says you did not screen.
---
name: 17 ats-handoff
description: Push candidates into the ATS without losing the
context that got them there.
---
CARRY ACROSS: the source, the specific work that prompted the
approach with its URL, the first message sent, their reply
verbatim, the stated motivation, and the flag from 14.
MOST ATS HANDOFFS LOSE THE MOTIVATION FIELD. Six weeks later
nobody remembers why this person was interested, which is the
exact thing you need at offer stage.
Set the source to the CAMPAIGN and the signal type, never the
channel.
---
name: 18 pipeline-diagnostic
description: Weekly, per live role. Stop at the first failure.
---
1 Acceptance below 15% the note, or the list is off-brief
2 Replies below 10% the message. Did it name the company
and the band?
3 Replies fine,
few screens the role is not compelling, or the
pitch oversells it
4 Screens fine,
no shortlist the brief is wrong. Go back to 06.
5 Shortlist fine,
no offers not a sourcing problem. The client's
process, or their expectations.
ONE change per week per role.
The open-source repos worth installing
Four that are real. All handle the candidate side; none handle the client side, which is why the nine skills before this exist.
carlopezzuto/recruiting, MIT. Eleven specialised agents and sixteen skills covering the full candidate pipeline: job descriptions, personas, Boolean strings, outreach sequences, interview scorecards, offer strategies and post-close retrospectives. Output is markdown or self-contained HTML, no build tools, no dependencies.
The pattern worth stealing: each role's status lives in its brief's YAML frontmatter, and agents check it before starting work, moving through intake, active, paused, offer and closed. That is how you stop an agent sourcing for a role filled last Tuesday.
yc-software/recruiting. YC's own. Sourcing, outreach, scheduling, interviewing and pipeline management, with native integration for Work at a Startup, Gmail, Google Calendar and Slack, plus Ashby.
zubair-trabzada/ai-recruiter-claude. Fourteen skills and five parallel agents. Job description analysis with ATS keywords and inclusivity flags, pipeline summaries, interview frameworks, salary benchmarks with percentile bands and geographic adjustments, offer packages with decline risk, and 30/60/90 onboarding plans.
ATS MCP servers, if yours is supported. Crelate publishes one for their CRM and ATS API. Manatal was the first recruitment platform with MCP integration, which makes candidates, jobs, notes and organisations queryable against a live database rather than pasted CVs.
One cost worth knowing before planning around it: Manatal's MCP server requires the Enterprise Plus plan at roughly $55 per user per month billed annually, not the entry plan their pricing page leads with. Check the current figure before committing.
The weekly loop
MON 09 client-diagnostic and 18 per live role. One change each.
MON 01 job-post-scanner. Reposts first.
TUE 10 talent-mapper on the newest role.
TUE 13 boolean-builder, three strings, report the counts.
WED 02 and 03 on the client side. Five sends, no more.
WED Candidate sends, fifteen, within the split.
THU 15 across every reply. Referrals answered within the hour.
THU 16 shortlist-writer on anything ready.
FRI 17 ats-handoff on everyone screened this week.
FRI 04 market-map on one target account.
Friday's market map is the compounding one. One a week, delivered free, is fifty retained-work conversations a year that nobody else is starting.
18 skills decide who to contact. Prosp reaches them 💜