Building a daily outreach agent with Claude + MCP
Tell Claude once. Wake up to a queue of 10 personalised LinkedIn invites, already drafted against fresh data. This recipe is the exact wiring: Claude Desktop, the LinkFetch MCP server, one standing prompt, and a five-minute morning review. Total setup time: 30 minutes. Steady-state maintenance: zero.
Step 1: install the LinkFetch MCP server
Claude Desktop reads MCP servers from a config file at
~/Library/Application Support/Claude/claude_desktop_config.json on
macOS, or the Windows equivalent at %APPDATA%\Claude\claude_desktop_config.json.
Add the LinkFetch entry:
{
"mcpServers": {
"linkfetch": {
"command": "npx",
"args": ["-y", "@linkfetch/mcp"],
"env": {
"LINKFETCH_API_KEY": "lf_live_..."
}
}
}
}
Restart Claude Desktop. Open a new chat, type What tools do you have access to?, and confirm linkfetch.profiles, linkfetch.companies,
linkfetch.companies.timeseries, and linkfetch.outreach.queue show up.
If they don't, the config didn't load: check the JSON for trailing
commas (a real common cause), then restart.
The MCP protocol is Anthropic's open standard for letting models call tools without bespoke glue. The LinkFetch server is one Node binary; the config above pins the latest. There is no proxy, no webhook setup, and no additional auth dance beyond the API key.
Step 2: define the ICP and write the standing prompt
The standing prompt is the seed Claude uses every morning. One paragraph, three things to specify: who you are looking for, what signal makes them worth contacting, and what tone the invite should use. Be specific. A vague ICP produces a vague morning queue.
Every morning at 09:00, find 10 prospects matching this ICP and queue
warm intros to each.
ICP: VP Engineering or CTO at Series-B fintechs (50-300 employees),
based in the US or UK. Bonus signal if they joined the company in the
last 90 days.
Tools to use:
- linkfetch.companies.timeseries to find Series-B fintechs with recent
hiring activity
- linkfetch.profiles to pull the target's current title, tenure, and
one specific recent role detail
- claude.compose to draft each invite
- linkfetch.outreach.queue to push the drafts to my LinkedIn outbox
Invite style: 2 sentences. Sentence 1 names the specific signal (their
recent move, their company's recent funding, their team's recent
shipping milestone). Sentence 2 is a question, not a pitch. No emojis,
no "I came across your profile", no "would love to connect". Sound
like a peer who noticed something specific.
Skip anyone with a "no recruiters" or "no sales pitches" line in their
headline.
The "skip anyone with..." line earns its keep. LinkedIn users who add that line are the most likely to flag low-effort outreach, and the single fastest way to get a connection request reported. Filtering upstream is cheaper than dealing with reports later.
Step 3: package the prompt as a Claude Skill
The standing prompt above works as a chat message, but a Claude Skill
is the right home for something that runs every morning. Skills are
named, parametric prompts that Claude invokes by reference. Save the
prompt to ~/Library/Application Support/Claude/skills/daily-outreach.md
and give it a one-line description Claude can match against.
---
name: daily-outreach
description: Run the morning outreach pipeline. Use when the user asks
to "do the morning outreach" or starts a chat at the daily cadence.
---
[The standing prompt from step 2]
Now the morning routine is one chat: /daily-outreach. Claude invokes
the skill, runs the tool calls, returns the queue. Total wall-clock
time: under three minutes for a 10-invite run.
Step 4: the 5-minute review
Queued invites land in your LinkedIn outbox as drafts. They do not send automatically. The morning review is a coffee-and-scroll exercise: read each invite, edit the first sentence if it does not sound like you, hit send.
Editing the first sentence is the single highest-leverage habit in this whole workflow. Reply rates for AI-drafted outreach where the first sentence is hand-edited run in the 15-20% range; reply rates for unedited copy run 3-6% (salesforge.ai, 2026). The edit takes 20 seconds. The leverage is roughly 4x on reply rate.
The other thing that happens during review: you delete one or two invites that target someone whose recent move or company change makes the signal weak in context. Claude does not know that the VP Eng who "joined 90 days ago" actually returned to a company they were at three years prior. You do. Trust your gut on the deletes.
Step 5: tune the prompt over week one
Week one of the routine is calibration. Run it daily, watch which invites get accepted and which get ignored, and adjust the standing prompt accordingly. Three common adjustments after the first week:
Tighten the seniority filter. "VP Engineering or CTO" often pulls in director-level matches whose engineering scope is too narrow for the kind of conversation you want. Replace with "VP Engineering with direct reports of 20+" if the data layer supports it, or just narrow to CTO.
Add a freshness floor. If most of the queue is people who joined
their current role 80+ days ago, the new-hire signal has gone cold.
Add joined within the last 60 days and watch the queue tighten.
Specify the second sentence shape. Generic questions ("how is the new role going?") produce generic replies. Better: questions that reference the specific signal ("did the [recent product launch] ship under the new structure or before you joined?"). Spell this shape out in the prompt and Claude will follow it.
When the daily cadence is wrong
The daily cadence makes sense for a specific shape of GTM: an outbound motion targeting a defined ICP, where a meaningful fraction of the target population posts a fresh signal (job change, hire, funding event) on any given week. If your ICP is small enough that a weekly cadence already produces five strong signals, run it weekly. The daily agent is leverage for high-volume outbound; for narrow segments it oversamples and you end up rejecting eight of every ten queued invites at review time, which trains you to skip the review.
Two failure modes signal you have miscalibrated. First: the morning queue is consistently empty or near-empty. Either the watchlist is too small, the freshness filter is too tight, or the signal definitions are too narrow. Second: the morning queue is consistently full of signals that look right but are not actually buyers. This usually means the signal types are surfacing the wrong activity (every new hire, instead of new hires above a seniority bar) and the prompt needs a tighter ICP filter.
If you find yourself reaching for the daily agent inside three weeks of starting it, the calibration probably is not bad. Stick with it through week four; reply data takes that long to stabilise.
Scaling the agent across a small team
Three to five people on the GTM side can share one daily agent configuration with two adjustments. The first: each person keeps their own LinkFetch API key so the credit math attributes correctly per seat. The second: the standing prompt names the runner explicitly ("the morning queue is for [name], who runs the [segment] book"), so the same Skill produces different queues for different reps when run with different person variables.
Where the workflow breaks for teams is in shared watchlists. Two reps running the agent on overlapping watchlists will draft messages to the same target on the same morning. The fix is account ownership in the watchlist: tag every account with one rep's name, and have the prompt filter to only that rep's accounts at run time. Unowned accounts go in a shared pool that one rep checks per week.
The reporting story is the second tradeoff. Most teams want a weekly summary of what the agent surfaced, what got sent, and what got replied. The cleanest version is a Friday-afternoon Skill that pulls the week's queue history and groups by signal type, rep, and outcome. Twenty minutes of work for the GTM lead each Friday; faster than any CRM-based reporting equivalent.
The credit math
| Step | Credits per run |
|---|---|
linkfetch.companies.timeseries for the watchlist scan |
~30 |
linkfetch.profiles × 10 matched contacts |
~50 |
linkfetch.companies × 10 enrichment lookups |
~30 |
| Claude composition + queue handoff | ~20 |
| Daily total | ~130 credits |
At a flat per-request rate, 130 credits per day is roughly $1.30. Run the routine 22 weekdays per month and you spend under $30 per month on the data layer. The Claude subscription is the larger line item, not the API. Most teams hit positive ROI on the second accepted call.
Frequently asked questions
Can I run this without Claude Desktop?
Yes. The MCP server runs anywhere Anthropic's SDK runs. Claude Code in your terminal is a perfectly good runner. The only piece that benefits from Claude Desktop is the morning chat surface; the actual tool calls work identically headless.
Does the agent send messages without my review?
No. linkfetch.outreach.queue writes drafts to your LinkedIn outbox.
Sending is a manual click in LinkedIn's UI, on every invite, every
time. This is deliberate: the user-as-principal compliance model
requires the human to make the send action. The five-minute review
is not a polite suggestion; it is the architecture.
What if the same prospect shows up twice in different runs?
The queue de-duplicates against your outbox: anyone you already messaged, drafted to, or have an active connection request with is filtered before draft creation. You will not accidentally double-tap the same person across multiple mornings.
Can I use the agent for non-LinkedIn outreach?
The linkfetch.outreach.queue tool only writes to LinkedIn. For
email outreach, point the queue step at your email tool of choice
(most email automation platforms have MCP servers now). The data
layer is the same; only the destination changes.
Last updated: 2026-04-27 by the LinkFetch team.