LinkedIn workflows
Reliable SalesTouch MCP sequences for research, conversations, outreach, engagement, and extraction.
The strongest MCP workflows use small, inspectable tool calls. Resolve identities first, mutate second, and verify state after queued or delayed work.
Research a prospect and conversation
- Call
linkedin_accountswhen the account is unknown. - Resolve the member with
linkedin_lookup_profile. - Find the thread with
linkedin_conversations_search. - Load context with
linkedin_conversations_messages. - Ask the agent to summarize the relationship before drafting anything.
Prompt:
Look up this profile, find our LinkedIn conversation, read the message history, and summarize the relationship. Do not send anything.
Send to an existing connection
- Read the conversation or call
lead_status. - Confirm the exact message with the user.
- Call
linkedin_messagewith a member target andtext. - If SalesTouch requires queueing, retry with
queue: true. - Report whether the action was sent or queued.
Invite and follow up after acceptance
Use linkedin_invite_then_message when the follow-up should run only after the invitation is accepted. Provide the target and follow_up_message; the invitation note is optional.
Use lead_status later to inspect invitation acceptance, the persisted follow-up, or queued-message state.
Schedule a LinkedIn action
Add scheduled_for to any message, invitation, invite-then-message, like, comment, or publication. Use an ISO 8601 datetime with a timezone.
SalesTouch persists the request immediately, but never executes it before the requested time. Working hours, account limits, or a LinkedIn cooldown can move the effective scheduled_for later. Explicit schedules take priority over actions queued automatically.
The response distinguishes requested_for from the effective scheduled_for and reports whether the execution event is registered, awaiting_horizon, or pending_retry. Long-term schedules remain durable in SalesTouch until they enter the execution horizon.
Sleeping credential-based LinkedIn accounts reconnect when the action becomes due. Legacy cookie accounts can still require a manual reconnect.
Engage with a post
- Resolve ambiguous post URLs with
linkedin_lookup_post. - Call exactly one matching action:
linkedin_likeorlinkedin_comment. - Use
queue: truewhen the action cannot run immediately.
Avoid asking the agent to “engage” without specifying the exact action and comment text.
Extract post engagers
- Resolve the post with
linkedin_lookup_post. - Call
scrape_linkedin_post_reactionsorscrape_linkedin_post_comments. Comment scraping returns root commenters by default; setinclude_replies: trueonly when reply authors are required. - Read the inline preview.
- If
source_paging.exhaustedisfalse, callscrape_linkedin_post_commentsagain with the returnedsource_paging.arguments. This continues LinkedIn extraction from the saved source position and preserves the originalinclude_repliesmode after the automatic provider-request safety budget or a recoverable LinkedIn interruption. - Use
scrape_result_pagewith the returnedresult_idonly to page through profiles already stored by that call. - Use the export metadata when the complete dataset belongs outside the agent context.
Extract from search
- Use
scrape_linkedin_search_urlwhen you already have a native LinkedIn Classic people, company, post, or job search URL. - Use
scrape_linkedin_people_search,scrape_linkedin_companies_search,scrape_linkedin_posts_search, orscrape_linkedin_jobs_searchfor structured LinkedIn Classic filters. - Use
scrape_sales_navigator_search_urlwhen you already have a native Sales Navigator people or company URL and want SalesTouch to infer the result type. - Use
scrape_sales_navigator_peoplefor a Sales Navigator lead search URL or structured people filters. - Use
scrape_sales_navigator_companiesfor a Sales Navigator company search URL or structured company filters. - Use
linkedin_sales_navigator_search_parametersto discover account-specific ids for locations, industries, companies, job titles, and other enumerated filters. Setproduct: "classic"for LinkedIn Classic; the default remains Sales Navigator for compatibility. - Use
linkedin_lookup_job_postingafter a job search to fetch one complete posting, including optional hiring-team, salary, and benefits sections. - Set
preview_limitto keep the inline response small. - Page stored results instead of requesting the full extraction in one tool call.
Structured filter values accept either a known id or a human-readable query. A query is used automatically only when it resolves to one exact value. If several candidates match, retry with the selected candidate id.
Example: growth hackers in Paris at companies with 1–10 employees:
{
"filters": {
"current_job_title": { "include": [{ "query": "Growth Hacker" }] },
"location": { "include": [{ "query": "Paris" }] },
"company_headcount": [{ "min": 1, "max": 10 }]
},
"limit": 100,
"preview_limit": 20
}Example: ESN in Paris, using LinkedIn's IT services industry as the business proxy:
{
"filters": {
"industry": { "include": [{ "query": "IT Services and IT Consulting" }] },
"location": { "include": [{ "query": "Paris" }] }
},
"limit": 1000,
"preview_limit": 20
}Example: companies in Paris that are hiring:
{
"filters": {
"location": { "include": [{ "query": "Paris" }] },
"hiring_on_linkedin": true,
"department_headcount_growth": {
"department": [{ "query": "Engineering" }],
"min": 1
}
},
"limit": 1000,
"preview_limit": 20
}To find people only inside a company result, first call scrape_sales_navigator_companies. Then pass its result_id as company_result_id to scrape_sales_navigator_people, together with people filters such as current_job_title. SalesTouch validates result ownership, expiry, and LinkedIn account, then applies the companies in safe batches.
{
"company_result_id": "previous_company_result_id",
"filters": {
"current_job_title": { "include": [{ "query": "Directeur des ressources humaines" }] }
},
"limit": 100,
"preview_limit": 20
}Interpret hiring and exhaustiveness correctly
hiring_on_linkedin: true means the company has at least one LinkedIn job posting; it does not prove that the open role is a developer role. Add department_headcount_growth for the Engineering function as an intent signal, or start from a verified job-search dataset when the job title must be exact. “All companies” also means all results exposed by the selected Sales Navigator filters, subject to LinkedIn's result cap; segment broad searches when the warning asks you to narrow them.
“ESN” is not a native LinkedIn company classification. Use IT Services and IT Consulting as the broad industry proxy, then qualify the returned companies from their description or website instead of treating a keyword match as proof.
Cancel queued work or a waiting follow-up
- Get the exact identifier from
statusorlead_status. - Call
queue_cancelwith exactly one of:queued_action_idto cancel a queued invitation, message, or other action;followup_idto cancel an automatic message inwaiting_acceptancewithout altering its invitation.
- Report the cancellation result; do not assume a local request cancelled the remote action.
Trust returned state
Treat sent, queued, accepted, and cancelled states returned by SalesTouch as the source of truth. Do not infer execution from the original prompt.
Check live invitation status before outreach
Call lead_status or linkedin_lookup_profile with the member target and the intended linkedin_account_id. Both return invitation_status: pending confirms an outgoing invitation, including one sent outside SalesTouch; none confirms absence after a complete live list scan; connected means the member is already connected; unknown means the evidence is unavailable, incomplete, stale, or a previous send remains unresolved. Inspect source, complete, coverage, checked_at, started_at, max_age_ms and reason. can_invite: false blocks sending. A second-degree profile, a missing profile field, and an empty local queue never prove absence.
salestouch_status invitation items are SalesTouch history with source: "salestouch_history" and complete: false. In lead_status, invitation.live_status is the live observation; invitation.history_status, contact dates and queue fields describe stored activity. A queued invitation remains planned work even when the live status is unknown. Read-only checks do not send invitations or create invitation history.
Both invitation tools check again immediately before the actual send, including queued actions and scheduled_for requests. They skip an existing pending invitation. linkedin_invite_then_message retains one follow-up waiting for acceptance, including for an external invitation. If already connected, the workflow proceeds to its follow-up. invitation_status_unknown or invitation_outcome_unknown stops the invitation; inspect lead_status rather than blindly retrying. A timeout after sending can mean LinkedIn accepted the request. Unknown send outcomes remain blocked even with retry_invitation; explicit retries after a confirmed send was withdrawn require a fresh complete absence check.
Live status is a bounded observation, not an atomic reservation on LinkedIn. A scan that exceeds its page or time budget remains unknown, and an external action can race with the final send. SalesTouch serializes its own attempts and reconciles ambiguous outcomes without a second send. Queued cancellations apply before execution; a remote send already in progress cannot be recalled by cancelling local work.
A recent checked_at is not enough: provider_freshness: "origin_confirmed" means the source response was verified as coming from the provider. A cached response or missing freshness evidence returns unknown and blocks sending. These checks can therefore consume provider read limits; SalesTouch does not bypass those limits.