Skip to main content

Agency MCP (your own Claude)

Set up and read your whole agency from your own Claude. You say, for example, "Create client Bakkerij Jansen, website bakkerijjansen.nl, read the site and fill the playbook, then link the Smartlead campaign 'NL horeca Q4'", and Claude does it in SalesLobe.

Your Claude does the thinking (it reads the website, writes the playbook text, asks you questions). SalesLobe provides safe hands: read and write routes with the same rules as the app. Reads and setup changes cost no credits.

If you allow it on the key, Claude can also answer lead replies: send an approved text, approve or reject a waiting draft, or skip a reply. Those actions go through the same send governance as every other API agent (see Sending and approving replies).

Endpoint: https://slazbvfvliieskvkjtav.supabase.co/functions/v1/agency-mcp (Streamable HTTP)

Authentication: your agency key in the X-SalesLobe-Key header (or Authorization: Bearer sl_live_…). The tools call the Agency API /v1/agency/* with the same key.

Rollout

The Agency MCP is behind a feature flag and is enabled per account, first for a small group. Without it, every call answers 403 feature_not_enabled and the option does not show in Settings.

Getting a key​

Settings → API Keys → Connect your AI → Your agency → Create a key instead. Connecting from claude.ai needs no key: see Connect from claude.ai.

  • Only owners and admins see this option and can create the key.
  • The key is for the whole organization (not locked to a client) and always gets agency.read + agency.write. Those scopes are never part of Full access (*).
  • Also let Claude send and approve replies (checkbox, off by default) adds replies.send, replies.approve, leads.read and reports.read. Next to agency.* only these reply scopes and campaigns.read are allowed; never *, never other scopes. Without the checkbox the reply tools answer that the key lacks the scope.
  • The key is shown once, together with a ready-made Claude Desktop config and Claude Code command. Copy them right away.
  • Disconnect the key in the same list. It disappears from Claude at the next call.

Your clients' CRM on the same screen is the separate CRM MCP: a key locked to one client that only reads and updates that client's CRM fields.

Claude Desktop​

Claude Desktop connects to remote MCP servers with a key header through mcp-remote, pinned to the version we test (mcp-remote@0.14.3). It needs Node.js 20 or newer, installed with the installer from nodejs.org: with Node 18 mcp-remote crashes, and Claude Desktop often cannot find Node installed with Homebrew or nvm (spawn npx ENOENT). Open Settings → Developer → Edit Config and add the saleslobe-… entry under mcpServers. If the file already has content (recent Claude Desktop versions write "preferences" there), merge it into that object instead of pasting below it: two JSON objects in one file is invalid and Claude Desktop then starts no server at all.

{
"mcpServers": {
"saleslobe-agency": {
"command": "npx",
"args": [
"-y", "mcp-remote@0.14.3",
"https://slazbvfvliieskvkjtav.supabase.co/functions/v1/agency-mcp",
"--header", "X-SalesLobe-Key:${SALESLOBE_KEY}"
],
"env": { "SALESLOBE_KEY": "sl_live_your_key_here" }
}
}
}

Quit Claude Desktop completely (Cmd+Q on Mac) and open it again. Settings → Developer shows the server as running; the tools appear under the tools icon. Claude Desktop asks for your permission per tool call.

Claude Code​

claude mcp add --transport http saleslobe-agency \
https://slazbvfvliieskvkjtav.supabase.co/functions/v1/agency-mcp \
--header "X-SalesLobe-Key: sl_live_your_key_here"

Tools​

Read (agency.read)​

ToolWhat it doesAPI call
get_accountOrganization, plan, credits (plan + top-up), client limit and usage, connected Smartlead / Instantly accounts (never the keys)GET /v1/agency/account
list_clientsAll clients: name, industry, status, portal on/off, Corty level (read-only), number of campaigns, last replyGET /v1/agency/clients
get_clientEverything in Client Settings and the Reply Playbook, plus campaigns and portal linkGET /v1/agency/clients/:id
get_agency_docsAgency Brand Brief, Response Guidelines, Industry Tone Guide, guideline sets (read-only)GET /v1/agency/docs
list_campaignsCampaigns with client, provider and status, plus provider campaigns not imported yetGET /v1/agency/campaigns
get_inbox_summaryReplies per classification, conversations per status, hot/warm leads waiting, open drafts, attention today; optional client_idGET /v1/agency/inbox-summary
get_client_performanceSent, leads contacted, replies, positive replies, meetings (all time and last 30 days) plus insights: what works per campaign and segment (replies vs the client's average), lead segments (industry, your lead fields), why leads reply or say no; agency view, optional from / toGET /v1/agency/clients/:id/performance

Write (agency.write)​

ToolWhat it doesAPI call
create_clientCreate a client. Same name returns the existing client (existed: true). The plan's client limit applies.POST /v1/agency/clients
update_clientClient settings: tone of voice, brand brief (and override), client context, email signature, GDPR notes, booking link. Optional if_updated_at against overwriting. With auto_write (on its own call, two steps): the Studio switch "Corty starts writing when there is room".PATCH /v1/agency/clients/:id, PUT /v1/agency/clients/:id/auto-write
update_playbookReply Playbook: guidelines, style preferences, client specifics, tone of voice. Two steps, see below.PUT /v1/agency/clients/:id/playbook
update_agency_docsAgency Brand Brief, Response Guidelines, Industry Tone GuidePATCH /v1/agency/docs
link_campaignLink a campaign to a client, or unlink itPATCH /v1/agency/campaigns/:id
import_campaignsImport Smartlead / Instantly campaigns through the app's own import, optionally straight into a client. Two steps, see below.POST /v1/agency/campaigns/import

Replies, follow-ups and reports (optional scopes)​

These tools need the key to be created with Also let Claude send and approve replies. They use the existing replies routes (/v1/replies…) and /v1/reports, so there is no separate send path.

ToolWhat it doesScopeAPI call
list_pending_repliesLead replies with a draft waiting for a decision (Corty drafts and API drafts); status=in_review for only the review queue; optional client_idreplies.approveGET /v1/replies
get_replyOne lead reply with the full thread and the current draftleads.readGET /v1/replies/:id
send_replySend the draft as-is or an edited text (body = the exact final text the user approved)replies.sendPOST /v1/replies/:id/send
approve_replyApprove the waiting draft exactly as it is and send it; approver = the person who approvedreplies.approvePOST /v1/replies/:id/approve
reject_replyReject the waiting draft; nothing is sentreplies.approvePOST /v1/replies/:id/reject
skip_replyRecord a decision not to answer (with reason); nothing is sentreplies.sendPOST /v1/replies/:id/skip
list_followupsScheduled follow-ups (Corty check-ins and manual) per agency or client; read-onlyagency.readGET /v1/agency/followups
get_weekly_reportsThe weekly reports SalesLobe generated; report_id for one in fullreports.readGET /v1/reports, GET /v1/reports/:id

7 read tools, 6 setup tools and 8 reply/follow-up/report tools (21 in total).

Studio builders (organizations with Studio)​

ToolWhat it doesScopeAPI
list_recipesLead list enrichment recipes: columns with meaning and rationale, waterfall steps, max credits per lead, extra columns of an enriched importagency.readGET /v1/agency/clients/:id/recipes
preview_recipeDry run a recipe on 10 leads, value and proof per column; nothing written to the leads. Two steps (estimate first)agency.writePOST /v1/agency/clients/:id/recipes/:id/preview
get_recipe_schemaHow a recipe is built: every step kind with its inputs, the column types it fits and its credits per lead, limits and an exampleagency.readGET /v1/agency/recipes/schema
list_recipe_templatesSalesLobe's recipe templates and the ones your agency saved, with columns, definition and credits per lead. The Lab calls them formulas; find_formulas searches the same library by goal (alias)agency.readGET /v1/agency/recipe-templates
create_recipeA new recipe for a client from a template or a definition, saved as a draft. A broken recipe is refused with one readable sentence per problem. Two steps (columns and cost per 10 and 100 leads first)agency.writePOST /v1/agency/clients/:id/recipes
update_recipeChange single steps (step_changes) or the whole definition; a changed definition becomes a new draft version. create_recipe and update_recipe take hiring_role (sales, marketing, technical, operations, customer_success, custom or default) on a vacancy search step. Two steps (changes and cost before and after first)agency.writePUT /v1/agency/clients/:id/recipes/:id
copy_recipeCopy a recipe to another client of your agency, checked for that client, saved there as a draft. Two stepsagency.writePOST /v1/agency/clients/:id/recipes/:id/copy
save_recipe_as_templateSave a recipe as a template of your agency (no other organization sees it). Two stepsagency.writePOST /v1/agency/clients/:id/recipes/:id/template
get_infrastructureA client's sending infrastructure in one read: domains (health, blocklist), mailboxes (warm-up, healthy, daily limit, campaigns, from your Smartlead: the first call answers from a snapshot kept every 10 minutes and says its age, the live read follows), campaigns, InboxKit workspace, capacity, Corty's plan and the push gateagency.readGET /v1/agency/clients/:id/infrastructure
domain_optionsFree sender domain names with their price and the days the plan would buy them. With a naming rule the names follow it (each says why it fits); without one, each has a different stem and none carries the brand. A lookalike of the brand, a forbidden or a listed name is never offered. Optional stems or pattern as a hint for one callagency.readGET /v1/agency/clients/:id/domain-options
get_domain_ruleThe client's domain naming rule: agreed stems, variations, TLDs in order, forbidden lookalikes and the note of what was agreedagency.readGET /v1/agency/clients/:id/domain-rule
set_domain_ruleChange the client's naming rule (each field given replaces that field). Two steps; auditedagency.writePUT /v1/agency/clients/:id/domain-rule
choose_domainsPut the picked names into the client's plan: bought one per working day at different hours, with mailboxes, DNS and warm-up, then joining a campaign. Two steps; nothing is bought before the plan is approvedagency.writePOST /v1/agency/clients/:id/domains/choose
list_inboxkit_workspacesThe InboxKit workspaces your key sees and the one the client buys inagency.readGET /v1/agency/clients/:id/inboxkit-workspaces
set_inboxkit_workspaceThe InboxKit workspace a client buys in. Two stepsagency.writePUT /v1/agency/clients/:id/inboxkit-workspace
propose_actionAdd one step from Corty's catalog to the client's plan (park a domain, pause a campaign, a daily limit, warm-up, supply on, ...). Two steps; runs only after the plan is approvedagency.writePOST /v1/agency/clients/:id/plan/steps
attach_mailboxesMailboxes into a Smartlead campaign of the client: warm-up on, join once warm and healthy at 10 a day, 20 a week later. Two steps; runs only after the plan is approvedagency.writePOST /v1/agency/clients/:id/mailboxes/attach
start_campaignPush a Studio campaign's approved leads to Smartlead as a plan step, only while your organization's push gate is open. Two steps; runs only after the plan is approvedagency.writePOST /v1/agency/clients/:id/campaigns/start
get_sequenceThe sequence Corty writes: steps, allowed fields and signals, guardrails, A/B arms, copy rulesagency.readGET /v1/agency/clients/:id/sequence
update_sequenceReplace the sequence blueprint. Two stepsagency.writePUT /v1/agency/clients/:id/sequence
preview_sequenceCorty writes the sequence for up to 3 sample leads with the grounding per sentence. A dry run: nothing pushed, nothing sent. Two steps (estimate first)agency.writePOST /v1/agency/clients/:id/sequence/preview
estimate_find_emailsHow many imported leads without an email can be found, which finders run on your own keys or on a SalesLobe key, expected emails and credits. Nothing is looked upagency.readGET /v1/agency/clients/:id/waterfall/estimate
run_find_emailsFind and verify emails for one round of up to 25 leads; found emails join the lead pool, nothing is sent. Two steps (estimate first); repeat with the same token while leads remainagency.writePOST /v1/agency/clients/:id/waterfall/run
list_suppressionsThe client's Never mail list: exact counts of emails and domains and the newest entries (filter with q)agency.readGET /v1/agency/clients/:id/suppressions
preview_suppressions_importCheck up to 20,000 emails or domains against the list: valid, new, already on the list, not valid, duplicates. Nothing is storedagency.writePOST /v1/agency/clients/:id/suppressions/preview
import_suppressionsAdd up to 20,000 emails or domains to the list per call. Two steps (counts first)agency.writePOST /v1/agency/clients/:id/suppressions/import
list_icpsThe client's ICP definitions with the rule in plain words, subcategories, volume bands and counts: total in the pool, eligible, verified, not contacted yetagency.readGET /v1/agency/clients/:id/icps
list_leadsThe lead pool as the ICP list shows it, best first: ICP and score, subcategory, volume band, current sender, sends for customers, named account, already contacted (campaign and date), replied. Filters and pages of up to 200. Optional columns (formula column keys, at most 12) adds the formula values with value, proof and source per leadagency.readGET /v1/agency/clients/:id/leads
update_leadsWrite enrichment done by hand back into the pool by lead_id or email (up to 500 rows per call), stored as "manual (agency)". Two steps (preview first)agency.writePOST /v1/agency/clients/:id/leads/enrich
find_formulasThe Lab: find a formula in the library by goal or q (best match first). library is saleslobe, agency or all. Each formula card has a number, what it works on, its inputs, the steps with cost, the output and credits per hit once it ran. Read-onlyagency.readGET /v1/agency/formulas
run_formulaRun a formula on leads (lead_ids, list_id or pool) after a test run. Only empty cells run by default, and leads without the inputs are skipped for 0 credits. Two steps; confirm_large is needed above 200 creditsagency.writePOST /v1/agency/clients/:id/recipes/:id/run
get_runProgress of a run: status, leads processed, credits spent, hits, hit rate, credits per hit and why it stopped. With continue: true it runs the next roundagency.read (agency.write to continue)GET and POST /v1/agency/clients/:id/runs/:id
stop_runStop a running run between rounds. Values already written stay and nothing more is chargedagency.writePOST /v1/agency/clients/:id/runs/:id/stop
add_columnAdd a column to the client's lead grid from a formula id or a question in words. Saved as a new draft version; nothing runs on leads. Two stepsagency.writePOST /v1/agency/clients/:id/columns
request_publish_formulaAsk SalesLobe to publish one of your agency's formulas to the Library. SalesLobe reviews it first. Your agency name shows only with author_opt_in. Paying workspaces only. Two stepsagency.writePOST /v1/agency/formulas/:id/publish
import_leadsImport up to 500 rows per call into the client's pool, with the same checks as the Studio Import tab. Costs nothing and sends nothing. mode is preview or commit; later chunks use the import_id of chunk 1. Two steps to commitagency.writePOST /v1/agency/clients/:id/leads/import
get_mailbox_lifecycleEvery sender domain and mailbox with real dates, status (warming, ramping, active, reserve, parked, retired), today's cold mail limit, 7 day bounces, reserves and the auto-protect switchagency.readGET /v1/agency/clients/:id/mailbox-lifecycle
set_auto_protectSwitch auto-protect on or off. On (the default): Corty parks a failing mailbox, swaps in a ready reserve and follows the ramp without waiting. Buying a reserve always waits for approval. Two stepsagency.writePUT /v1/agency/clients/:id/auto-protect
unpark_mailboxPut a parked mailbox back to sending when its 7 day bounce rate is under 2 percent and its domain is not listed. It restarts at week 1 (5 a day). Two stepsagency.writePOST /v1/agency/clients/:id/mailboxes/unpark

The tool list also holds the signal tools and get_sequence_preview: 93 tools in total, with the agreement and course tools and the Studio engine tools below.

The Lab: formulas and test runs​

A formula is a recipe that fills one or more columns on your leads. Find one with find_formulas before you build a new one. Add its columns with add_column, try it on 10 leads with preview_recipe (the test run), then fill the leads with run_formula. A run goes in rounds: get_run shows hits and credits per hit, stop_run stops it.

  • Two-step confirm: run_formula, add_column, request_publish_formula, import_leads (commit), set_auto_protect and unpark_mailbox show a preview first. Only a second call with the confirm_token changes anything.
  • Runs above 200 credits also need confirm_large: true, after you approved that amount.
  • Audit keys (read-only) and demo organizations get 403 read_only_key or demo_org on every write tool above.
  • The Lab needs Studio. Without it the routes answer 403 studio_not_enabled.

Domains, mailboxes and campaigns with Claude​

Ask Claude for example "Northwind needs two new sender domains and the mailboxes in the test campaign". Claude reads get_infrastructure, picks two names with different stems from domain_options, and calls choose_domains with the registrant and the campaign: you see the plan first (which domain is bought on which day and hour, the cost, that a bought domain cannot be returned) and it goes into the client's plan after your yes. Nothing is bought, changed in Smartlead or pushed from Claude: an owner or admin approves the whole plan in Studio (Needs you), and Corty then runs each step on its day. A client has one plan that buys at a time, and a plan whose dry run failed cannot be approved. start_campaign works only while SalesLobe has opened the push gate for your organization. Afterwards Claude reads it back with get_infrastructure (warm-up, daily limit and campaign per mailbox, read live from your Smartlead).

Building a recipe with Claude​

Ask Claude for example "make a recipe for Northwind that finds SaaS companies with a customer login, and show me what 10 leads cost". Claude reads get_recipe_schema and list_recipe_templates, calls create_recipe with a template, shows you the columns and the credits per 10 and 100 leads, and saves it after your yes. It can then change one step with update_recipe (for example the AI question), try it on 10 leads with preview_recipe (cost first) and copy it to another client with copy_recipe. Recipes are saved as drafts and never run on the pool from these tools. In Studio the same recipes are under Enrichment.

Studio engine: segments, batches and review (organizations with Studio)​

The daily Studio work on SalesLobe client ids: what goes out next, segments, the batch and its mail review, learned rules and results. Every change is two steps (a preview with the current state first) and logged; nothing here pushes to Smartlead or sends email (start_campaign does the push as a step of the client's plan).

ToolWhatScopeAPI
client_todayThe client's Studio day: headline, trust tiles, to-dos for a person (a chosen batch that waits for its write comes first, with its leads, credits and start_writing), the current batch and new signals. A batch that waits for a rewrite past the rewrite limit says so in its to-do and in batch.rewriteLimitagency.readGET /v1/agency/clients/:id/today
batch_statusThe current batch: id, send day, status, planned against target, QC and what blocks it. approve_blocked names the rewrite limit when a needed rewrite is past it; rewrite_limit has the numbersagency.readGET /v1/agency/clients/:id/batch
list_segmentsThe segments as on the Segments tab, with pool, leads per day and results per armagency.readGET /v1/agency/clients/:id/segments
save_segmentCreate or change a segment, pause or resume it, or change the weights. Two stepsagency.writePOST /v1/agency/clients/:id/segments
segment_resultsResults per segment and A/B arm: contacted, reply, positive and bounce rate, and how sureagency.readGET /v1/agency/clients/:id/segments/results
allocate_batchCompose the batch for the next send day now (costs nothing). Two stepsagency.writePOST /v1/agency/clients/:id/batch/allocate
review_batchThe review list of a batch: score, flags, sentences without a source, verdictagency.readGET /v1/agency/clients/:id/review
review_leadOne lead's mails with sentence marks, QC checks and sourcesagency.readGET /v1/agency/clients/:id/review/:id
review_approveApprove a lead's mails; refused while a sentence has no source. Two stepsagency.writePOST /v1/agency/clients/:id/review/:id/approve
review_edit_mailSave your text for one mail of a lead. Two stepsagency.writePOST /v1/agency/clients/:id/review/:id/edit
review_rejectReject a lead in the review. Two stepsagency.writePOST /v1/agency/clients/:id/review/:id/reject
approve_batchApprove the batch after review; never pushes. Two stepsagency.writePOST /v1/agency/clients/:id/batch/approve
skip_batchSkip a batch; its leads go back to the pool. Two stepsagency.writePOST /v1/agency/clients/:id/batch/skip
start_writingStart writing the chosen batch that waits for it; the preview names the batch, its leads and the credits it holds. Nothing is sent. Two steps, paidagency.writePOST /v1/agency/clients/:id/batch/start-writing
learned_rulesStudio's learning memory: score, learned rules with status and evidenceagency.readGET /v1/agency/clients/:id/learned-rules
activate_learned_ruleTurn a candidate rule on for new copy. Two stepsagency.writePOST /v1/agency/clients/:id/learned-rules/activate
campaign_resultsA Studio campaign: steps, counts and A/B results per arm and countryagency.readGET /v1/agency/clients/:id/studio-campaigns/:id
campaign_analyticsSalesLobe's health checks of the client's campaigns at 200, 500 and 1000 prospects: verdict, findings (a blocklisted domain, bounces) and Corty's plan for itagency.readGET /v1/agency/clients/:id/campaign-health

Signals stay with read_signals, estimate_signals and run_signals.

From a new client to a running campaign with Claude​

Ask Claude for example "set up Northwind: 20 new prospects a workday, start sending when the mailboxes are warm". Claude works in this order and asks you before every change: create_client, set_agreement, a recipe from a template (list_recipe_templates, create_recipe), the infrastructure plan (domain_options, choose_domains, approve_plan), a segment (save_segment), the first batch (allocate_batch, review_batch, review_approve, approve_batch), the campaign start on the day warm-up is done (start_campaign, approve_plan), and then get_course to check it is on course.

Agreements, course and plans (organizations with Studio)​

What your agency promised each client (the agreement), whether the client is on course, and Corty's plan to get back on course.

ToolWhatScopeAPI
get_agreementsThe agreement per client: new prospects a workday, meetings a month, replies a month, or your own; target, start, catch-up choiceagency.readGET /v1/agency/agreements
set_agreementSet the agreement for a client; it replaces the active one of the same kind. Two steps (first what it means in new prospects a workday and sending domains)agency.writePOST /v1/agency/clients/:id/agreements
get_coursePer agreement: on track, at risk, off track or not started, the reason in one sentence, the shortfall, the catch-up math, the date back on track and the plan in short. Every client in one callagency.readGET /v1/agency/course
get_planCorty's plan: every step with its day, cost and dry run, what cannot be undone, whether it can be approved, and the logagency.readGET /v1/agency/plans/:id
approve_planApprove the whole plan once; Corty runs each step on its day. Two steps (total cost, first step, dates and what cannot be undone first). A plan whose dry run failed gets no token. Each step shows its dry run; a rewrite past the rewrite limit is named there with its numbers, and approving the plan confirms that costagency.plans.approvePOST /v1/agency/plans/:id/approve
change_planCatch up or drop the shortfall, fewer new domains, other dates, steps left out. Two steps (before and after first); then it waits for approval againagency.writePOST /v1/agency/plans/:id/change
dismiss_planNot now, for 1 to 30 daysagency.writePOST /v1/agency/plans/:id/dismiss
pause_planThe brake: an approved plan stops before its next step; resume: true releases itagency.writePOST /v1/agency/plans/:id/pause
undo_stepUndo a step that ran, when Corty can (a parked domain back in its campaigns, a daily limit back). Purchases cannot be undone. Two stepsagency.writePOST /v1/agency/plans/:id/steps/:id/undo

The rewrite limit​

Writing a batch again costs credits each time. The rewrites of one batch in the last 14 days may cost at most 2 times writing that batch once; past that a person confirms the cost. The number is the same one Studio Review shows as "rewrites", always labelled estimated or charged. Claude cannot confirm it on its own: client_today, batch_status and the plan preview say when a rewrite is past the limit, with the numbers and the day it fits again. Approving a plan whose preview named that cost (in SalesLobe or with approve_plan) is the confirm; so is the confirm in Studio Review.

The steps that cost nothing do not wait for the purchase. While the new domain names are not chosen yet, approve_plan with scope: "free_steps" approves and runs only the steps that buy nothing and can be undone (parking listed domains, pausing campaigns that bounce, daily limits, the catch-up setting, existing mailboxes into a campaign), with its own preview and confirm. In SalesLobe this is Approve the steps that cost nothing now on the plan. The purchases keep waiting for the names, the workspace and their own approval.

approve_plan needs the scope agency.plans.approve, separate from agency.write: tick Also let Claude approve Corty's plans when you create the key. Without it Claude can read and change plans and you approve them in SalesLobe.

Following a client's course with Claude​

Ask Claude for example "how are my clients doing against what we promised?". Claude reads get_course for every client, tells you per client in one sentence why it is on or off course (for example "7 of 11 sender domains are blacklisted: room for 16 of 50 new prospects a day, 113 short, back on track on 1 Dec"), shows the plan with get_plan (steps, days, cost, what cannot be undone) and asks what you want: approve, change it (for example drop the shortfall, or fewer domains) or not now. It approves only after your explicit yes, with the token from the preview, and then reads the result back. Every decision is in the audit log with the key, and in the plan's log as mcp:<key name>.

Pulling a list from the lead pool and enriching it by hand​

Ask Claude for example "pull a good list from the lead pool for AhaSend's first ICP that we have not contacted yet". Claude calls list_icps to find the ICP, then list_leads with icp_id and not_contacted: true (and filters such as country, volume_band_min or verified_only), page by page with next_offset.

"Not contacted" means: still in the pool, not in an own Studio campaign (pushed or sent), not replied, and not in a campaign at the sending tool (the latest daily snapshot of Smartlead, Instantly or PlusVibe). contact_check in the answer names the sources that were checked.

After you or a colleague checked leads by hand, update_leads writes the values back. The fixed fields are volume_band (high, medium, low; volume_estimate works too), monthly_volume, mail_type, current_sender (a correction of the DNS scan, it wins over it), hook, named_account, sends_for_customers, linkedin_url (a URL you give; SalesLobe never scrapes LinkedIn) and note. Any other name becomes a column of the client's pool (text, number, yes/no or URL, at most 20 new per call); Corty only writes with such a column after a person switches on "Use for writing" in Studio (Segments, ICP lists). Values are stored as source "manual (agency)" with who and when, so the writer treats them as facts a person checked. The email, its verification, ids and the lead's status are never written.

The same works in SalesLobe: Studio, the client, Segments, ICP lists: "Export this ICP list" gives a CSV with lead_id; fill in your columns and use "Import enrichment" (check first, then write).

The Never mail list is per client. An email on it blocks that address; a domain blocks every address on it and its subdomains, and every lead whose company domain or website is on it. Studio checks it at import, at batch selection and right before a push. For a CSV, send only the email or domain column as entries.

Credits for the email waterfall: 1 per verified email found on a SalesLobe key, 0.5 per check on a SalesLobe key, and 0.2 per lead when every lookup ran on your own keys. AI steps in recipes are free with your own Anthropic key; own OpenAI or Gemini keys are not used for Studio yet.

Two-step confirm (playbook and imports)​

update_playbook and import_campaigns never write on the first call. The server enforces this, so Claude cannot skip it:

  1. Preview. The first call (without confirm_token) only returns a preview plus a confirm_token:
    • update_playbook: the full new text of every section that changes.
    • import_campaigns: the campaigns, how many replies will be imported and the estimated credits for classifying them.
  2. Confirm. Claude shows you the preview and asks for your approval. Only a second call with that confirm_token writes.

The token is valid for 10 minutes and only for exactly that preview. If anything changed in between (the playbook was edited in the app, a reply count changed), the token is refused and you get a fresh preview.

Why: text that Claude reads on a website must never end up in the playbook that steers every reply draft without you seeing it first.

Sending and approving replies​

Only with a key created with Also let Claude send and approve replies. send_reply and approve_reply tell Claude to show you the final text first and only send after your explicit approval, and never to retry by itself.

Every send goes through the existing governance for external agents, exactly like any other API key:

  • The key's autonomy level decides. At L0/L1 a send lands in the review queue in SalesLobe instead of going out; Claude then says NOT SENT, queued for review with the reason. Raise the key's level in Settings → API only if you want Claude's sends to go out directly.
  • Legal / GDPR requests always wait for a person. They are never sent or approved through an agency key (403 legal_request_requires_human).
  • No approving your own submission. A text that went to review cannot be approved through an agency key when the same person submitted it: with this key, with any other key they created (for example the claude.ai connector and a Claude Desktop key of the same owner), or themselves in the app (403 own_submission). Someone else approves it in SalesLobe. Otherwise a person could skip their own review.
  • No keys or connections while impersonating. When a SalesLobe admin views your account (impersonation), creating API keys and approving a Claude connection are refused (403 impersonation_not_allowed). The account owner does this themselves.
  • Panic switch. When sending is paused, every send answers Sending is paused (423) and nothing goes out.
  • Limits. Max 5 sends per minute per key, a per-lead cooldown, client sending switches and lead blocks apply.
  • Delivery unknown. If SalesLobe cannot confirm delivery, Claude is told the email may have gone out and must not send it again.
  • Read-only account. An account that is read-only for payment answers 402 account_read_only; nothing is sent.

Claude gets one fixed sentence per outcome (sent, queued for review with reason, paused, legal, own submission, limit, may have gone out) and makes exactly one API call per action.

What it never does​

  • Send or approve email without the opt-in scopes, or outside the send governance above.
  • Change autonomy levels (Corty levels and key levels are read-only).
  • Delete or archive clients, campaigns or any other data.
  • Billing, plans, top-ups.
  • Team members, roles, API keys.
  • Anything outside your own organization.

Security​

  • Owner/admin only. Only owners and admins can create an agency key.
  • Re-checked on every call. Each request checks that the person who created the key is still owner or admin of the organization. Removed or demoted: the key stops working immediately (403 key_owner_lost_access).
  • Organization key only. A key locked to a client gets 403 scope_requires_org_key.
  • Write limit. At most 60 writes per minute per key (429 agency_write_rate_limited; the tool tells Claude to wait a minute).
  • Audit. Every write is in the audit log with the key as actor, and in the request log.
  • Your organization only. Every query is filtered on the key's organization. A client or campaign of another organization answers 404.

REST API​

The same routes are plain REST endpoints for Make, n8n or your own tools: /v1/agency/* on the API gateway, with the same key and scopes. See the OpenAPI spec for request and response shapes.

Connect from claude.ai​

Add SalesLobe as a custom connector in claude.ai. No key to copy: you log in to SalesLobe and approve. The connector also works in Claude Desktop and the Claude mobile apps once it is added to your claude.ai account.

Connector URL: https://app.saleslobe.com/mcp/agency

  1. In claude.ai open Settings → Connectors → Add custom connector.
  2. Name it SalesLobe, paste the connector URL and click Add, then Connect.
  3. SalesLobe opens. Log in if needed, pick the workspace (only workspaces where you are owner or admin, with the Agency MCP enabled, can be picked), and choose whether Claude may also send and approve replies (off by default).
  4. Click Approve. You are sent back to Claude and the tools are available.

The URL is also on Settings → API Keys → Connect your AI → Your agency, with a copy button.

Other apps that support MCP, such as ChatGPT or Cursor, use the same connector URL or an agency key; logging in without a key works from Claude today, and from other apps once SalesLobe has enabled them.

What happens underneath:

  • claude.ai uses OAuth 2.1 (authorization code with PKCE, dynamic client registration). Discovery follows the MCP authorization spec: the MCP server answers 401 with a WWW-Authenticate header that points to its protected resource metadata, which names https://app.saleslobe.com as the authorization server (/.well-known/oauth-authorization-server).
  • The access token Claude receives is an agency key, created for you (you are its creator) with agency.read + agency.write, plus replies.send, replies.approve, leads.read, reports.read if you allowed sending. Every rule above applies unchanged: owner/admin only, stops when you are no longer owner or admin, organization key, write limit, audit, send governance.
  • The key shows up under Your agency as Claude.ai (connector). Disconnect there to stop it; Claude then asks you to connect again. Connecting the same Claude again replaces the previous key.
  • There is no refresh token and no expiry: the key works until you disconnect it, you lose owner/admin, or the Agency MCP is turned off for the account.
  • Creating the key is in the audit log (agency_oauth.key_minted, with you as actor).
  • Only the exact Claude callbacks (https://claude.ai/api/mcp/auth_callback, https://claude.com/api/mcp/auth_callback) and local callbacks (http://localhost, any port, for Claude Code) can register as OAuth clients.

Claude Code can use the same OAuth flow: claude mcp add --transport http saleslobe-agency https://app.saleslobe.com/mcp/agency, then /mcp to log in. The key header setup above keeps working too.