Getting Started
First setup for login, API keys, LinkedIn accounts and the three public SalesTouch surfaces.
Getting Started
The three public SalesTouch surfaces share the same account model. CLI + skills is the default setup path. Remote MCP stays available when you ask for it explicitly with --mcp.
The npm package is not published yet, so run the CLI from the repository root with pnpm salestouch ....
- Bootstrap your agent with the CLI:
pnpm salestouch setup --claude --loginIf you prefer a non-interactive setup, create an API key and use:
pnpm salestouch setup --claude --api-key st_...- Connect at least one LinkedIn account in SalesTouch.
- Choose the execution surface that matches your workflow:
- REST API for deterministic backend integrations
- CLI for terminal-first usage
- Remote MCP for Claude Code and assistant-driven workflows when you opt into
--mcp - Local
stdioMCP only when you need an explicit fallback
First useful read
Before sending anything, load the full prospecting context:
Load one lead with the commercial and activity context needed to decide the next prospecting action.
When to use
Use this when you already know the lead id or after a `lead.search` result selection. In `full`, it returns `prospect_context` by default.
Output notes
- Responses default to `full` mode through the public API and CLI.
- Use `compact` only when token savings matter more than prospecting quality. It can noticeably reduce prospecting quality.
Output schema
{
"type": "object",
"properties": {
"lead_id": {
"type": "string"
},
"lead": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"jobTitle": {
"type": "string"
},
"company": {
"type": "string"
},
"score": {
"type": "number"
},
"avatarUrl": {
"type": "string"
},
"linkedinUrl": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"New",
"Waiting",
"Contacted",
"Replied",
"MeetingBooked",
"Interested",
"NotInterested",
"DoNotContact"
]
},
"lastInteraction": {
"type": "string"
},
"description": {
"type": "string"
},
"linkedinProfileEnriched": {
"type": "boolean"
},
"location": {
"type": "string"
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
},
"timezone": {
"type": "string"
},
"companyWebsite": {
"type": "string"
},
"companyLogoUrl": {
"type": "string"
},
"companyLinkedinUrl": {
"type": "string"
},
"companyHeadline": {
"type": "string"
},
"personalWebsite": {
"type": "string"
},
"companyIndustry": {
"type": "string"
},
"companySize": {
"type": "string"
},
"experience": {
"type": "array",
"items": {
"type": "object",
"properties": {
"role": {
"type": "string"
},
"company": {
"type": "string"
},
"duration": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"role",
"company",
"duration"
],
"additionalProperties": false
}
},
"education": {
"type": "array",
"items": {
"type": "object",
"properties": {
"school": {
"type": "string"
},
"degree": {
"type": "string"
},
"year": {
"type": "string"
}
},
"required": [
"school",
"degree",
"year"
],
"additionalProperties": false
}
},
"skills": {
"type": "array",
"items": {
"type": "string"
}
},
"recentPosts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"content": {
"type": "string"
},
"date": {
"type": "string"
},
"likes": {
"type": "number"
},
"comments": {
"type": "number"
},
"url": {
"type": "string"
}
},
"required": [
"content",
"date",
"likes"
],
"additionalProperties": false
}
},
"mission": {
"type": "string"
},
"missions": {
"type": "array",
"items": {
"type": "string"
}
},
"sentMessages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"content": {
"type": "string"
},
"channel": {
"type": "string",
"enum": [
"EMAIL",
"LINKEDIN"
]
},
"date": {
"type": "string"
},
"timestamp": {
"type": "string"
},
"senderName": {
"type": "string"
},
"isPending": {
"type": "boolean"
}
},
"required": [
"id",
"content",
"channel",
"date"
],
"additionalProperties": false
}
},
"receivedMessages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"content": {
"type": "string"
},
"channel": {
"type": "string",
"enum": [
"EMAIL",
"LINKEDIN"
]
},
"date": {
"type": "string"
},
"timestamp": {
"type": "string"
},
"senderName": {
"type": "string"
},
"isPending": {
"type": "boolean"
}
},
"required": [
"id",
"content",
"channel",
"date"
],
"additionalProperties": false
}
},
"addedDate": {
"type": "string"
},
"isFlagged": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"title",
"company",
"score",
"avatarUrl",
"linkedinUrl",
"linkedin_url",
"status"
],
"additionalProperties": false
},
"latest_import": {
"anyOf": [
{
"type": "object",
"properties": {
"import_id": {
"type": "string"
},
"type": {
"type": "string"
},
"imported_at": {
"type": "string",
"format": "date-time"
},
"source_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"context": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metadata": {
"description": "Arbitrary JSON value.",
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "array",
"items": {}
},
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"lead_import_metadata": {
"description": "Arbitrary JSON value.",
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "array",
"items": {}
},
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"lead_import_source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"mission_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"import_id",
"type",
"imported_at",
"source_url",
"context",
"metadata",
"lead_import_metadata",
"lead_import_source",
"mission_id"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"import_context": {
"anyOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string"
},
"context": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"metadata": {
"description": "Arbitrary JSON value.",
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "array",
"items": {}
},
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"lead_import_metadata": {
"description": "Arbitrary JSON value.",
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "array",
"items": {}
},
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"lead_import_source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"type",
"context",
"metadata",
"lead_import_metadata",
"lead_import_source"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"prospect_context": {
"anyOf": [
{
"type": "object",
"properties": {
"prospect": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"jobTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedinUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedinId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedinProviderId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedinIsRelationship": {
"type": "boolean"
},
"lastActivityAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"lastContactAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"linkedinOwnerAccount": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
}
},
"required": [
"id",
"name",
"email",
"status"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"leadIdentityAliases": {
"type": "array",
"items": {
"type": "object",
"properties": {
"provider": {
"type": "string"
},
"type": {
"type": "string"
},
"value": {
"type": "string"
}
},
"required": [
"provider",
"type",
"value"
],
"additionalProperties": false
}
},
"leadActivities": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"occurredAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"id",
"type",
"title",
"description",
"occurredAt"
],
"additionalProperties": false
}
},
"linkedinRelations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"userProviderId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"userPublicIdentifier": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"userProfileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"userFullName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"acceptedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"userProviderId",
"userPublicIdentifier",
"userProfileUrl",
"userFullName",
"acceptedAt"
],
"additionalProperties": false
}
},
"linkedinConversations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"status": {
"type": "string"
},
"lastMessageAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"participants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"fullName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"publicIdentifier": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"profileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"isSelf": {
"type": "boolean"
}
},
"required": [
"id",
"fullName",
"publicIdentifier",
"profileUrl",
"isSelf"
],
"additionalProperties": false
}
},
"messages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"direction": {
"type": "string"
},
"state": {
"type": "string"
},
"bodyText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sentAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"createdAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"id",
"direction",
"state",
"bodyText",
"sentAt",
"createdAt"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"title",
"status",
"lastMessageAt",
"participants",
"messages"
],
"additionalProperties": false
}
},
"linkedinOutreachActions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"status": {
"type": "string"
},
"bodyText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scheduledFor": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"sentAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"failureReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"createdAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"id",
"type",
"status",
"bodyText",
"scheduledFor",
"sentAt",
"failureReason",
"createdAt"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"firstName",
"lastName",
"email",
"headline",
"jobTitle",
"companyName",
"status",
"score",
"notes",
"linkedinUrl",
"linkedin_url",
"linkedinId",
"linkedinProviderId",
"linkedinIsRelationship",
"lastActivityAt",
"lastContactAt",
"linkedinOwnerAccount",
"leadIdentityAliases",
"leadActivities",
"linkedinRelations",
"linkedinConversations",
"linkedinOutreachActions"
],
"additionalProperties": false
},
"next_actions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"reply_to_message",
"wait_for_invitation_acceptance",
"send_message",
"send_invitation"
]
}
}
},
"required": [
"prospect",
"next_actions"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"lead_id",
"lead",
"latest_import",
"import_context",
"prospect_context"
],
"additionalProperties": false
}
CLI
salestouch commands run lead.get --input-json '{"lead_id":"<string>","prospect_id":"<string>","email":"<string>"}' --json
Payload
{
"lead_id": "<string>",
"prospect_id": "<string>",
"email": "<string>"
}
First useful write
When the lead is ready, create a draft first and approve it through the shared runtime:
Generate a LinkedIn draft with up to three candidate message variations.
When to use
Use this when you have enough lead context to draft outreach but still want a reviewable draft before anything is approved or sent.
Output notes
- Responses default to `full` mode through the public API and CLI.
- Use `compact` only when token savings matter more than prospecting quality. It can noticeably reduce prospecting quality.
Output schema
{
"type": "object",
"properties": {
"draft": {
"type": "object",
"properties": {
"draft_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"PENDING_REVIEW",
"READY_TO_SEND",
"DISPATCHED",
"CANCELLED"
]
},
"channel": {
"type": "string",
"enum": [
"LINKEDIN"
]
},
"dispatched_queue_item_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"dispatched_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"dispatched_external_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"selected_variation_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"selected_body_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"approved_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"cancelled_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"dispatched_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"created_by_user_id": {
"type": "string"
},
"created_by_actor_kind": {
"type": "string",
"enum": [
"USER",
"AI_AGENT"
]
},
"approved_by_user_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"approved_by_actor_kind": {
"anyOf": [
{
"type": "string",
"enum": [
"USER",
"AI_AGENT"
]
},
{
"type": "null"
}
]
},
"lead": {
"type": "object",
"properties": {
"lead_id": {
"type": "string"
},
"name": {
"type": "string"
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"job_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"lead_id",
"name",
"company_name",
"job_title",
"linkedin_url"
],
"additionalProperties": false
},
"agent": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"handle": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"agent_id",
"handle",
"name"
],
"additionalProperties": false
},
"mission": {
"anyOf": [
{
"type": "object",
"properties": {
"mission_id": {
"type": "string"
},
"handle": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"mission_id",
"handle",
"name"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"variations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"position": {
"type": "integer"
},
"body_text": {
"type": "string"
}
},
"required": [
"position",
"body_text"
],
"additionalProperties": false
}
}
},
"required": [
"draft_id",
"status",
"channel",
"dispatched_queue_item_id",
"dispatched_message_id",
"dispatched_external_message_id",
"selected_variation_index",
"selected_body_text",
"approved_at",
"cancelled_at",
"dispatched_at",
"created_at",
"updated_at",
"created_by_user_id",
"created_by_actor_kind",
"approved_by_user_id",
"approved_by_actor_kind",
"lead",
"agent",
"mission",
"variations"
],
"additionalProperties": false
}
},
"required": [
"draft"
],
"additionalProperties": false
}
CLI
salestouch commands run linkedin.draft.create --input-json '{"variations":[]}' --json
Payload
{
"variations": []
}
Approve a LinkedIn draft by default, or force an immediate send for an already engaged conversation.
When to use
Use this after `linkedin.draft.create` to select the final variation, and reserve `send_now=true` for leads whose existing LinkedIn conversation has already been synced.
Risk notes
- This command mutates outbound draft state and can send immediately when `send_now=true`.
Output notes
- Default behavior is approval-only and returns `mode=approved` with `dispatch_result=null`.
- `send_now=true` bypasses LinkedIn usage limits and should only be used for existing conversations when the time savings justify the risk.
- Responses default to `full` mode through the public API and CLI.
- Use `compact` only when token savings matter more than prospecting quality. It can noticeably reduce prospecting quality.
Output schema
{
"type": "object",
"properties": {
"draft": {
"type": "object",
"properties": {
"draft_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"PENDING_REVIEW",
"READY_TO_SEND",
"DISPATCHED",
"CANCELLED"
]
},
"channel": {
"type": "string",
"enum": [
"LINKEDIN"
]
},
"dispatched_queue_item_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"dispatched_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"dispatched_external_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"selected_variation_index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"selected_body_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"approved_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"cancelled_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"dispatched_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
},
"created_by_user_id": {
"type": "string"
},
"created_by_actor_kind": {
"type": "string",
"enum": [
"USER",
"AI_AGENT"
]
},
"approved_by_user_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"approved_by_actor_kind": {
"anyOf": [
{
"type": "string",
"enum": [
"USER",
"AI_AGENT"
]
},
{
"type": "null"
}
]
},
"lead": {
"type": "object",
"properties": {
"lead_id": {
"type": "string"
},
"name": {
"type": "string"
},
"company_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"job_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedin_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"lead_id",
"name",
"company_name",
"job_title",
"linkedin_url"
],
"additionalProperties": false
},
"agent": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"handle": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"agent_id",
"handle",
"name"
],
"additionalProperties": false
},
"mission": {
"anyOf": [
{
"type": "object",
"properties": {
"mission_id": {
"type": "string"
},
"handle": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"mission_id",
"handle",
"name"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"variations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"position": {
"type": "integer"
},
"body_text": {
"type": "string"
}
},
"required": [
"position",
"body_text"
],
"additionalProperties": false
}
}
},
"required": [
"draft_id",
"status",
"channel",
"dispatched_queue_item_id",
"dispatched_message_id",
"dispatched_external_message_id",
"selected_variation_index",
"selected_body_text",
"approved_at",
"cancelled_at",
"dispatched_at",
"created_at",
"updated_at",
"created_by_user_id",
"created_by_actor_kind",
"approved_by_user_id",
"approved_by_actor_kind",
"lead",
"agent",
"mission",
"variations"
],
"additionalProperties": false
},
"dispatch_result": {
"anyOf": [
{
"oneOf": [
{
"type": "object",
"properties": {
"status": {
"const": "sent"
},
"messageId": {
"type": "string"
},
"externalMessageId": {
"type": "string"
}
},
"required": [
"status"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"const": "queued"
},
"queueId": {
"type": "string"
}
},
"required": [
"status",
"queueId"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"status": {
"const": "waiting_relation"
},
"messageQueueId": {
"type": "string"
}
},
"required": [
"status",
"messageQueueId"
],
"additionalProperties": false
}
]
},
{
"type": "null"
}
]
},
"mode": {
"type": "string",
"enum": [
"approved",
"sent"
]
}
},
"required": [
"draft",
"dispatch_result",
"mode"
],
"additionalProperties": false
}
CLI
salestouch commands run linkedin.draft.approve --input-json '{"draft_id":"<string>"}' --json
Payload
{
"draft_id": "<string>"
}