Salesloft

Live

OAUTH 2.0

SALES ENGAGEMENT

CRM & Sales

Cadence steps, prospect lists, call outcomes, and email activity your sales agent needs to execute and log live in Salesloft. Salesloft gives your sales engagement agent per-user OAuth access, no shared service account, no credential sprawl.

  • Acts as the user: Every cadence action and logged activity runs under the authorizing rep's Salesloft identity.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: User permissions enforced. 90-day audit trail on every prospect interaction.
Salesloft
agent · Acme Q3
Run
Which prospects in my enterprise cadence are overdue for step 4 and have not replied to any touchpoint?
S
salesloft_cadence_prospects_get
178ms
Sales agent
9 prospects overdue on step 4 with zero replies. Top: Joanna Chen (VP Eng, Meridian — opened 3 emails), Mark Osei (Director IT, Techflow — 7 days overdue).
Sources: Salesloft cadence data, activity history
salesloft
9
18:29
Message Claude...

Tools your sales agent reaches for on Salesloft, scoped per rep.

CALL ANY TOOL
OAuth-scoped per rep. Every cadence action and call log attributed to the authorizing sales rep.
salesloft_account_stages_list
List account stages
Fetch the account pipeline stages configured in Salesloft -- useful context for interpreting or setting an account's company_stage_id. The records can be filtered, paged, and sorted.
Parameters
Name
Type
Required
Description
created_at_gt
string
Optional
Filter stages created after this ISO8601 timestamp (exclusive)
created_at_lt
string
Optional
Filter stages created before this ISO8601 timestamp (exclusive)
ids
string
Optional
Filter by specific account stage IDs. Comma-separated list of IDs.
include_paging_counts
boolean
Optional
Whether to include total count and page count in the response metadata
limit_paging_counts
boolean
Optional
Specifies whether the max limit of 10k records should be applied to pagination counts
name
string
Optional
Filter account stages by name.
page
integer
Optional
Page number for pagination, starting from 1
per_page
integer
Optional
Number of results per page in the range [1, 100]. Defaults to 25.
sort_by
string
Optional
Field to sort results by. Common values: name, created_at, updated_at. Defaults to updated_at.
sort_direction
string
Optional
Direction of sort: ASC or DESC. Defaults to DESC.
updated_at_gt
string
Optional
Filter stages updated after this ISO8601 timestamp (exclusive)
updated_at_lt
string
Optional
Filter stages updated before this ISO8601 timestamp (exclusive)
salesloft_account_upserts_create
Create account upserts
salesloft_accounts_delete
Delete accounts
salesloft_accounts_get
Get accounts
salesloft_accounts_update
Update accounts
salesloft_actions_get
Get actions
salesloft_actions_list
List actions
salesloft_cadence_memberships_create
Create cadence memberships
salesloft_cadence_memberships_delete
Delete cadence memberships
salesloft_cadence_memberships_list
List cadence memberships
salesloft_cadences_get
Get cadences
salesloft_calls_list
List calls
salesloft_custom_fields_list
List custom fields
salesloft_email_templates_get
Get email templates
salesloft_emails_list
List emails
salesloft_meetings_list
List meetings
salesloft_meetings_update
Update meetings
salesloft_notes_get
Get notes
salesloft_opportunities_get
Get opportunities
salesloft_opportunities_list
List opportunities
salesloft_opportunity_stages_list
List opportunity stages
salesloft_people_create
Create people
salesloft_people_delete
Delete people
salesloft_people_update
Update people
salesloft_person_stages_list
List person stages
salesloft_successes_list
List successes
salesloft_tasks_create
Create tasks
salesloft_tasks_get
Get tasks
salesloft_users_get
Get users
salesloft_users_list
List users

For more tools, view docs.

Build your Agent
Drop the toolkit in, point it at the authorized rep, and your agent can query cadences and log activities from the first run.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { DynamicStructuredTool } from "@langchain/core/tools";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { z } from "zod";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["outreachmcp"], toolNames: ["outreach_prospects_search", "outreach_sequences_list", "outreach_tasks_get"] },
pageSize: 100,
});

const lcTools = tools.map((t) => new DynamicStructuredTool({
name: t.tool.definition.name,
description: t.tool.definition.description,
schema: z.object({}).passthrough(),
func: async (args) => {
const { data } = await sk.tools.executeTool({
toolName: t.tool.definition.name,
identifier: "user_123",
params: args,
});
return JSON.stringify(data);
},
}));

const agent = createReactAgent({ llm, tools: lcTools });
import { ScalekitClient } from "@scalekit-sdk/node";
import OpenAI from "openai";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["outreachmcp"], toolNames: ["outreach_prospects_search", "outreach_sequences_list", "outreach_tasks_get"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
type: "function",
function: {
name: t.tool.definition.name,
description: t.tool.definition.description,
parameters: t.tool.definition.input_schema,
},
}));

const resp = await openai.responses.create({
model: "gpt-4o", input: prompt, tools: llmTools,
});
import { ScalekitClient } from "@scalekit-sdk/node";
import Anthropic from "@anthropic-ai/sdk";

const sk = new ScalekitClient(envUrl, clientId, clientSecret);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
filter: { connectionNames: ["outreachmcp"], toolNames: ["outreach_prospects_search", "outreach_sequences_list", "outreach_tasks_get"] },
pageSize: 100,
});

const llmTools = tools.map((t) => ({
name: t.tool.definition.name,
description: t.tool.definition.description,
input_schema: t.tool.definition.input_schema,
}));

const msg = await anthropic.messages.create({
model: "claude-sonnet-4-6", max_tokens: 1024,
tools: llmTools,
messages: [{ role: "user", content: prompt }],
});
import { Agent } from "@google/adk/agents";
import {
MCPToolset, StreamableHTTPConnectionParams,
} from "@google/adk/tools/mcp";

const toolset = new MCPToolset({
connectionParams: new StreamableHTTPConnectionParams({
url: "https://mcp.scalekit.com/outreachmcp",
headers: { Authorization: `Bearer ${userScopedToken}` },
}),
});

const agent = new Agent({
name: "agent", model: "gemini-2.0-flash",
tools: await toolset.getTools(),
});
Try these prompts
Paste any prompt into your sales agent to start querying cadences and logging activities in Salesloft.
Search & recall
Copy the prompt
Copied
List all prospects currently in the [cadence name] cadence.
Copy the prompt
Copied
Show all email activities from the last 7 days and their reply rates.
Copy the prompt
Copied
Find all prospects at [company] and their current cadence step.
Action & enroll
Copy the prompt
Copied
Enroll [prospect name] in the [cadence name] cadence starting from step 1.
Copy the prompt
Copied
Log a call activity for [prospect name] with outcome: [outcome].
Copy the prompt
Copied
Create a new person record for [name] at [company] and enroll in [cadence].
SEE HOW AUTH WORKS
Reps authorize Salesloft once. Their OAuth token stays vaulted, every cadence action runs under their identity, and every step is logged.
1
Authorize
Your user connects
Salesloft
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Salesloft
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Salesloft
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Salesloft
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
Same per-user auth pattern across other sales engagement and CRM connectors.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
GTM and RevOps Teams
Deal intelligence agent
Pulls recent Gong calls, scores deal risk with an LLM, cross-references the record in Attio, and DMs each owner their at-risk deals in Slack. Every read is scoped to that rep's own access.
GTM and RevOps Teams
Sales call prep agent
Reads tomorrow's calls from Google Calendar, mines past Granola notes and Attio history for context, and delivers each rep a prep brief in Slack, scoped to the calls that rep actually owns.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
Test other agents
Same per-user auth pattern across other sales engagement and CRM connectors.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
SALES
Sales call prep agent
Read tomorrow's calls from Google Calendar, mine Granola notes and Attio history, and deliver each rep a prep brief in Slack.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared token looks fine in a demo. In production every call looks like a service account. Scalekit resolves the real user credential so attribution, audit, and scope stay accurate.
// shared token
 audit → bot_service_account
 user_filter → broken

 // scalekit
 audit → user_abc
 scope → enforced ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Salesloft today. Others tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Salesloft as the rep or a shared service account?
As the rep. Each sales rep authorizes once via OAuth and Scalekit resolves their credential at request time. Logged calls and emails appear under that rep's Salesloft identity, not a bot account, critical for accurate activity attribution and manager visibility.
Where is the Salesloft OAuth token stored?
In Scalekit's AES-256 vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Tokens never appear in prompts, logs, or LLM completions.
Can I prevent the agent from sending emails or making calls autonomously?
Yes. Use listScopedTools to allow cadence step queries and prospect lookup without granting execution permissions. You control exactly which actions the agent can take, reads can be enabled without writes per user.
What happens when a rep revokes Salesloft access?
The connection is invalidated on the next tool call for that rep. Subsequent requests fail closed. Other reps in the team remain unaffected. The event is logged for audit.
Can the agent combine Salesloft with Salesforce or HubSpot in one workflow?
Yes. A single agent can query Salesloft for cadence status and sync results back to Salesforce or HubSpot in the same workflow. Each connector resolves under the same rep identity with its own vaulted credential.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""salesloft"": {
""url"": ""https://mcp.scalekit.com/salesloft"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.salesloft]
url = ""https://mcp.scalekit.com/salesloft""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""salesloft"": {
""url"": ""https://mcp.scalekit.com/salesloft"",
""type"": ""http""
}
}
}