Salescadia MCP: Tool Reference
This page lists every tool the Salescadia MCP server exposes to an AI assistant, and how to use it. If you are an AI reading this to learn the tools: each tool below shows its exact name, what it does, and its arguments. Chain them, e.g. search_contacts then get_contact, or list_prescreen_leads then review_prescreen_leads.
Server URL: https://www.salescadia.com/api/mcp
Everything is scoped to the API key's workspace. Read tools work with any key; write tools need a key with the write scope (a workspace admin creates one under Settings → Integrations → API Keys). See the setup guide to connect.
Read tools
Query the workspace. Available to any authenticated key.
search_contactsreadSearch CRM contacts by name, email, or company. Returns a paginated list of matching contacts with their basic fields. Omit `query` to list the most recently added contacts.
Arguments
querystring · optionalMatched case-insensitively against name, email, and company. Example: 'acme' or 'jane@'.limitnumber · optionalMax results per page, 1-100. Default 25.pagenumber · optional1-based page number. Default 1.
get_contactreadGet one CRM contact's full picture: profile fields, deals, recent activity timeline (calls, notes, meetings), recent emails, and recent/upcoming meetings. Use search_contacts first to find the contact_id.
Arguments
contact_idstring · requiredThe contact's id (a UUID from search_contacts).
list_dealsreadList CRM deals, optionally filtered by status. Statuses: 'open' (live opportunity, incl. active free trials), 'won' (paid — a churned subscriber stays won), 'lost' (trial cancelled without paying, or >90% refunded). Includes the contact each deal belongs to.
Arguments
statusstring · optional · one of: open, won, lostFilter by deal status. Omit for all.limitnumber · optionalMax results per page, 1-100. Default 25.pagenumber · optional1-based page number. Default 1.
list_tasksreadList CRM follow-up tasks. Defaults to open (not completed) tasks ordered by due date. Includes the contact and assignee for each task.
Arguments
statusstring · optional · one of: open, completed, allDefault 'open'.limitnumber · optionalMax results, 1-100. Default 25.
get_revenue_summaryreadGet the workspace revenue picture: deal counts by status (open/won/lost), total won revenue collected (all-time, from Stripe-attributed deals), and current active MRR (monthly recurring run-rate from active subscriptions).
list_meetingsreadList meetings (appointments), most recent first. Filter by contact or a date range. Each row includes whether an AI summary is available via get_meeting_summary.
Arguments
contact_idstring · optionalOnly this contact's meetings.from_datestring · optionalISO date lower bound, e.g. '2026-06-01'.to_datestring · optionalISO date upper bound.limitnumber · optionalMax results, 1-100. Default 25.
get_meeting_summaryreadGet the AI-generated summary of one recorded meeting: overview, key points, action items, objections, buying signals, and next steps. Use list_meetings to find meeting_ids with has_ai_summary=true.
Arguments
meeting_idstring · requiredThe meeting id (a UUID from list_meetings).
search_call_transcriptsreadSemantic search across ALL recorded call transcripts in the workspace. Returns the most relevant transcript excerpts with call metadata (who, when, timestamp range). Understands meaning, not just keywords — 'concerns about pricing' finds relevant moments even without those exact words. Requires a Pro or Enterprise plan.
Arguments
querystring · requiredWhat to look for, phrased naturally. Example: 'objections about implementation timeline'.limitnumber · optionalMax excerpts, 1-20. Default 8.
verify_linkedin_profilesreadVerify LinkedIn profile URLs by reading each profile through the workspace's connected LinkedIn account. Returns the live name and headline per profile, and flags dead/unreachable URLs — use it to check prospects before adding them to a campaign with add_leads_to_campaign. Accepts up to 20 URLs pasted as free text. Reads only; changes nothing in the CRM.
Arguments
urlsstring · requiredFree text containing up to 20 LinkedIn profile URLs (linkedin.com/in/…), e.g. one per line. Bare slugs are accepted too.
list_prescreen_leadsreadFor campaigns with pre-screen ON (a human approves each sourced lead before any message sends), list the leads WAITING for review. Call with NO argument to see every campaign that has a review backlog plus its pending count; call with a campaign (name or id) to get that campaign's pending leads ranked by ICP fit (best first) with the fit reasons, so you can decide who to approve. Then use review_prescreen_leads to approve or reject. Read-only.
Arguments
campaignstring · optionalOptional. A campaign's exact name (case-insensitive) or id. Omit to list all campaigns that have leads awaiting review.limitnumber · optionalMax pending leads to return for a campaign (default 50, max 200).
list_campaignsreadList this workspace's outbound campaigns (excludes archived) with each one's status, channel, and funnel snapshot (audience → connected → contacted → replied → meetings). Start here to find a campaign, then get_campaign for its full targeting or edit_campaign_targeting to change it. Read-only.
get_campaignreadFull detail for one campaign: its current targeting (titles, keywords, boolean keyword-groups, industries, locations, seniorities, company sizes, strict-keyword mode, exclusions), messaging style, automation flags, the funnel snapshot, and how many leads await pre-screen review. Read this BEFORE edit_campaign_targeting so you edit from the real current filters. Read-only.
Arguments
campaignstring · requiredThe campaign's exact name (case-insensitive) or id.
get_campaign_analyticsreadOutbound performance over time: the daily funnel (invites sent, invites accepted, replies, favorable replies, meetings) plus totals and the derived accept-rate, reply-rate and meeting-rate, and a short trend read (is it improving or slowing). Pass a campaign for one campaign, or omit it for the whole workspace. Use this to spot what's working and decide targeting or messaging changes. Read-only.
Arguments
campaignstring · optionalOptional. A campaign's exact name or id. Omit for the whole workspace combined.daysnumber · optionalLook-back window in days (default 30, min 7, max 180).
Write tools
Take action in the workspace. Require a key with the write scope.
import_call_transcriptwrite keyImport a sales-call transcript into the CRM. Creates a completed meeting on the matching contact (found or created by email) and queues Salescadia's full call analysis: AI summary, coaching score, talk-time analytics, suggested tasks, and a draft follow-up email. Use this to bridge calls from a notetaker without a native integration (e.g. pull a transcript via Otter MCP, then import it here). Transcript lines should look like 'Speaker Name: what they said' — one utterance per line. NOT idempotent: importing the same call twice creates two meeting records, so call once per call. Requires an API key with the write scope.
Arguments
transcript_textstring · requiredThe full transcript, one utterance per line, ideally 'Speaker Name: text'. Plain unlabeled lines are accepted too. Max 500k characters.prospect_emailstring · requiredEmail of the external participant (the prospect). The meeting attaches to this contact — found case-insensitively or created if new.prospect_namestring · optionalProspect's display name, used only if the contact is created. Example: 'Dana Buyer'.prospect_companystring · optionalProspect's company, used only if the contact is created.rep_emailstring · optionalEmail of the team member who ran the call. Must match a Salescadia team member. Omit to attribute to the workspace admin.meeting_datestring · optionalWhen the call happened, ISO 8601 (e.g. '2026-07-01T15:00:00Z'). Defaults to now.duration_minutesnumber · optionalCall length in minutes, 1-480. Estimated from the transcript when omitted.sourcestring · optionalWhere the recording came from: 'otter', 'zoom', 'google_meet', 'teams', or 'other' (default). Shown as the meeting's source badge.
create_taskwrite keyCreate a CRM follow-up task — the natural next step after reading a meeting summary or a contact's timeline (e.g. 'Send Acme the pricing one-pager by Friday'). Optionally attach it to a contact (contact_id from search_contacts) and assign it to a team member by email; unassigned tasks go to the workspace admin. Additive only: existing tasks are never changed or completed. Requires an API key with the write scope.
Arguments
titlestring · requiredWhat needs doing, imperative and concrete. Max 300 characters.descriptionstring · optionalOptional detail/context for whoever does it. Max 2000 characters.due_datestring · optionalOptional ISO 8601 due date, e.g. '2026-07-18' or '2026-07-18T17:00:00Z'.prioritystring · optional · one of: low, medium, high, urgentDefault 'medium'.assignee_emailstring · optionalTeam member to assign it to (must match a member's email). Omit to assign to the workspace admin.contact_idstring · optionalOptional contact to attach the task to (a UUID from search_contacts).
add_leads_to_campaignwrite keyAdd people to an EXISTING outbound campaign by their LinkedIn profile URLs. Each profile is verified live first (dead URLs are skipped, never imported), deduped against the campaign's list, imported as a lead, and enrolled in the campaign's sequence — already-present or already-enrolled people are never touched again, so repeat calls are safe. Pass the campaign by exact name or id; up to 20 URLs per call. To start a brand-new campaign, use create_campaign. Requires an API key with the write scope.
Arguments
urlsstring · requiredFree text containing up to 20 LinkedIn profile URLs (linkedin.com/in/…), e.g. one per line.campaignstring · requiredThe target campaign's exact name (case-insensitive) or its id. Must already exist and be active.
create_campaignwrite keyCreate a NEW LinkedIn outbound campaign from a plain-English description of who to target and what you're offering. Runs the same AI pipeline as the in-app campaign wizard: the description becomes the campaign's targeting filters (titles, industries, keywords, locations, company sizes) plus its positioning, with the proven default LinkedIn cadence. Created as a DRAFT by default: nothing is sourced or sent until it's launched in the dashboard. Pass launch=true to go live immediately; lead sourcing then starts within about 15 minutes and messages follow the workspace's approval settings. To add specific people to an existing campaign, use add_leads_to_campaign instead. Requires an API key with the write scope.
Arguments
namestring · requiredCampaign display name, e.g. 'RevOps leaders Q3'. Max 200 characters.descriptionstring · requiredProse describing WHO to target and WHAT the offer is, exactly like the wizard's describe box. Be concrete: roles, company type/size, geography, and the pain or offer. Example: 'VP Sales and Heads of Sales at 50-200 person B2B SaaS companies in the US who struggle with lead routing; we automate rep-to-lead matching.'messaging_stylestring · optional · one of: consultative, defaultHow generated messages read: 'consultative' (low-pressure, qualification-first; the default) or 'default' (the standard pitch-forward writers).launchboolean · optionalDefault false (create a reviewable draft). true = launch now: lead sourcing starts within about 15 minutes and messages follow the workspace's approval settings.
review_prescreen_leadswrite keyApprove or reject pre-screened leads for a campaign — the same decision a human makes in the review queue. approve → the leads enroll into the campaign's sequence and outreach begins (subject to the workspace's send caps + approval settings); reject → the leads go on the do-not-contact list and any in-flight sequence stops. Only leads still awaiting review change, so a repeat/retry call is safe (already-decided leads are skipped). Get the lead_ids from list_prescreen_leads. Requires an API key with the write scope.
Arguments
campaignstring · requiredThe campaign's exact name (case-insensitive) or id — the one the leads belong to.decisionstring · required · one of: approve, reject'approve' to enroll + start outreach, 'reject' to do-not-contact.lead_idsstring[] · requiredThe lead ids to decide on (from list_prescreen_leads). Up to 500 per call.
edit_campaign_targetingwrite keyChange WHO a campaign reaches, then re-source with the new filters. Add/remove/replace titles, industries (validated against LinkedIn's taxonomy — bad ones are rejected with suggestions), locations, seniorities (e.g. Director, VP, C-Level), and company_sizes (e.g. 11-50, 201-500). Set the boolean keyword string, the AND-of-OR keyword_groups, or strict_keywords (when true a lead must match EVERY keyword group). Target by profile language (e.g. English) and add exclusions — including exclude_locations (e.g. India, China) — to filter people OUT. By default it re-arms sourcing so new matching leads flow in (they land in the pre-screen queue if that's on — nothing is contacted without your approval settings). Get the current filters from get_campaign first. Requires the write scope.
Arguments
campaignstring · requiredThe campaign's exact name (case-insensitive) or id.add_titlesstring[] · optionalJob titles to ADD to the target.remove_titlesstring[] · optionalJob titles to remove.set_titlesstring[] · optionalReplace the title list entirely.add_industriesstring[] · optionalIndustries to add (validated against LinkedIn's list; e.g. Computer Games, Mobile Gaming Apps).remove_industriesstring[] · optionalIndustries to remove.set_industriesstring[] · optionalReplace the industry list entirely.add_locationsstring[] · optionalLocations/countries to add (e.g. United States, Germany).remove_locationsstring[] · optionalLocations to remove.set_locationsstring[] · optionalReplace the location list entirely.add_senioritiesstring[] · optionalSeniority levels to add (Owner, Partner, CXO, VP, Director, Manager, Senior, Entry, ...).remove_senioritiesstring[] · optionalSeniority levels to remove.set_senioritiesstring[] · optionalReplace the seniority list entirely.add_company_sizesstring[] · optionalCompany head-count bands to add (1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+).remove_company_sizesstring[] · optionalHead-count bands to remove.set_company_sizesstring[] · optionalReplace the company-size list entirely.keywordsstring · optionalThe raw boolean keyword string (e.g. "gaming AND (influencer OR creator) marketing"). Empty string clears it.keyword_groupsarray[] · optionalAND-of-OR groups: [["gaming","esports"],["influencer","creator"]] means (gaming OR esports) AND (influencer OR creator). Replaces the current groups.strict_keywordsboolean · optionalWhen true, a lead must match EVERY keyword group (narrows hard); false loosens.add_languagesstring[] · optionalProfile languages to TARGET (English, Spanish, French, German, Portuguese, Chinese, …). English-only also drops clearly non-English-primary countries as a safety net.remove_languagesstring[] · optionalProfile languages to remove.set_languagesstring[] · optionalReplace the profile-language list entirely.add_exclude_locationsstring[] · optionalLocations/countries to EXCLUDE (e.g. India, China) — filtered out of sourcing.remove_exclude_locationsstring[] · optionalExcluded locations to remove.set_exclude_locationsstring[] · optionalReplace the excluded-locations list entirely.add_exclude_keywordsstring[] · optionalKeywords that DISQUALIFY a lead.add_exclude_industriesstring[] · optionalIndustries to exclude.re_sourceboolean · optionalRe-source with the new filters after saving (default true). New leads respect the campaign's pre-screen/approval settings.
set_campaign_statuswrite keyPause, resume (active), or archive a campaign. Pause halts all sending immediately; resume restarts only the sends the pause stopped (never the engine's own error-pauses); archive stops it for good (reversible only in the app). Requires the write scope.
Arguments
campaignstring · requiredThe campaign's exact name (case-insensitive) or id.statusstring · required · one of: active, paused, archivedactive = resume/launch sending, paused = halt sending, archived = stop for good.