The writes are narrow and deliberate: toggle-campaign-status, create-empty-list and add-leads-to-campaign. Everything else reads — there is no tool that composes a message, edits a sequence or replies to a conversation, so this changes how you inspect an outreach programme rather than how it runs. The filters on get-conversations and get-overall-stats are the part that earns its place: an inbox narrowed by campaign, sender and seen state arrives small enough to reason about.
A HeyReach client for LinkedIn outreach: campaigns and their status, the lead lists behind them, the conversations they produced, and the stats over a date range.
- Campaigns: get-all-campaigns and get-active-campaigns page through them, get-campaign-details returns one by campaignId, and toggle-campaign-status pauses or resumes it.
- Leads and lists: get-all-lists pages the lists, create-empty-list makes one by name and type, add-leads-to-campaign pushes leads into a campaign, and get-lead-details looks a person up by profileUrl.
- Conversations: get-conversations filters an inbox by campaignIds, linkedInAccountIds, leadLinkedInId, leadProfileUrl, searchString and seen state before any of it reaches the model.
- Reporting: get-overall-stats takes accountIds, campaignIds, startDate and endDate, and get-my-network-for-sender pages a sender's own network by senderId.
- check-api-key confirms the key the server is running with before anything else is attempted.
A HeyReach account and an API key for it, and at least one LinkedIn sender account connected in HeyReach — conversations, stats and network results are all addressed by LinkedIn account id.
One command plus a key — npx heyreach-mcp-server --api-key=YOUR_HEYREACH_API_KEY, then supply credentials
