Close

Live

OAUTH 2.0

CRM

CRM & Sales

Every lead, opportunity, and outreach activity your team manages lives in Close. Close MCP gives your agent authenticated access to your pipeline scoped to the user who authorized it.

  • Acts as the user: Access and write actions stay tied to the Close account that authorized the agent.
  • Credentials stay vaulted: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: User permissions enforced. 90-day audit trail.
Close
agent · Acme Q3
Run
Which leads have not been contacted in the last 14 days and are in active opportunity?
S
close_leads_list
81ms
Sales agent
5 leads at risk. Acme (stale 18d, $45K opp), Globex (16d, $32K), Initech (21d, $28K), Stark (15d, $22K), Umbrella (14d, $18K). All in negotiation stage.
Sources: 5 leads, negotiation stage
closemcp
5 leads
18:29
Message Claude...

Tools your sales agent reaches for on Close, scoped per user.

CALL ANY TOOL
List leads and tasks, create opportunities, log calls and emails, and update pipeline.
close_activities_list
List activities
List all activity types for a lead in Close (calls, emails, notes, SMS, etc.).
Parameters
Name
Type
Required
Description
_fields
string
Optional
Comma-separated list of fields to return.
_limit
integer
Optional
Maximum number of results to return.
_order_by
string
Optional
Sort field. Default: date_created.
_skip
integer
Optional
Number of results to skip (offset).
_type
string
Optional
Activity type: Note, Call, Email, Sms, etc.
contact_id
string
Optional
Filter by contact ID.
lead_id
string
Optional
Filter by lead ID.
user_id
string
Optional
Filter by user ID.
close_bulk_delete_create
Create bulk delete
close_call_delete
Delete call
close_call_get
Get call
close_call_update
Update call
close_comment_create
Create comment
close_comments_list
List comments
close_custom_field_contact_delete
Delete custom field contact
close_custom_field_contact_get
Get custom field contact
close_custom_field_contact_update
Update custom field contact
close_custom_field_opportunity_create
Create custom field opportunity
close_custom_fields_lead_list
List custom fields lead
close_email_delete
Delete email
close_email_get
Get email
close_emails_list
List emails
close_field_enrichment_create
Create field enrichment
close_lead_merge
Merge lead
close_lead_update
Update lead
close_leads_list
List leads
close_opportunity_get
Get opportunity
close_pipeline_create
Create pipeline
close_pipeline_delete
Delete pipeline
close_pipeline_update
Update pipeline
close_pipelines_list
List pipelines
close_sequence_get
Get sequence
close_smart_view_create
Create smart view
close_smart_view_delete
Delete smart view
close_sms_get
Get sms
close_sms_list
List sms
close_sms_update
Update sms

For more tools, view docs.

Build your Agent
Drop the toolkit in, point it at the user, and your sales agent can use Close 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: ["close"], toolNames: ["close_leads_list", "close_lead_get", "close_lead_create"] },
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: ["close"], toolNames: ["close_leads_list", "close_lead_get", "close_lead_create"] },
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: ["close"], toolNames: ["close_leads_list", "close_lead_get", "close_lead_create"] },
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/close",
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 agent to start using Close.
Search & recall
Copy the prompt
Copied
Find leads at [company name].
Copy the prompt
Copied
List leads with status [status].
Copy the prompt
Copied
Show opportunities owned by [user].
Copy the prompt
Copied
Which leads have no activity in 14+ days?
Action & updates
Copy the prompt
Copied
Create a lead: [company], [contacts].
Copy the prompt
Copied
Log a call on [lead]: [notes].
Copy the prompt
Copied
Update opportunity on [lead] to value [$amount].
Copy the prompt
Copied
Create a task: follow up with [lead] by [date].
Pipeline & reporting
Copy the prompt
Copied
Total pipeline value by owner this quarter.
Copy the prompt
Copied
Lead velocity by source last month.
Copy the prompt
Copied
Find leads with multiple opportunities.
Copy the prompt
Copied
Tasks overdue today across the team.
SEE HOW AUTH WORKS
Users authorize Close once. Their credentials stay vaulted, every call is checked, and every action is logged.
1
Authorize
Your user connects
Close
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
Close
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
Close
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
Close
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 agents and MCP connectors. Working code, live demos, fork what fits.
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 agents and MCP connectors. Working code, live demos, fork what fits.
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.
Lead updates lose rep attribution
A shared Close token looks fine in a demo. In production, every lead update and activity log looks like it came from a service account. Rep attribution breaks. Pipeline ownership breaks. Scalekit resolves the actual user's token so every Close action is attributed to the right rep.
// 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.
Close today. HubSpot, Salesforce, Attio 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 Close as the user or as a shared key?
As the user. Each workspace member authorizes once and Scalekit resolves their credential at request time. Audit logs attribute every action to that user, not a shared service account.

Where is the Close oauth 2.0 stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Tokens never appear in prompts, logs, or LLM context.

Can I limit what the agent is allowed to do in Close?
Yes. Pass a tool name filter to listScopedTools so the sales agent only sees the subset you authorize. Pre-API-call scope checks block out-of-policy actions before the request reaches Close.

What happens when a user revokes Close access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.

Can the agent see leads owned by other reps?
Only if the authorizing user has the right Close role. Admins see all leads; reps see their own plus team-shared leads. Custom field visibility and pipeline scoping carry over to every call.

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"": {
""close"": {
""url"": ""https://mcp.scalekit.com/close"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.close]
url = ""https://mcp.scalekit.com/close""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""close"": {
""url"": ""https://mcp.scalekit.com/close"",
""type"": ""http""
}
}
}