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_contactsread

Search 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

  • query string · optionalMatched case-insensitively against name, email, and company. Example: 'acme' or 'jane@'.
  • limit number · optionalMax results per page, 1-100. Default 25.
  • page number · optional1-based page number. Default 1.
get_contactread

Get 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_id string · requiredThe contact's id (a UUID from search_contacts).
list_dealsread

List 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

  • status string · optional · one of: open, won, lostFilter by deal status. Omit for all.
  • limit number · optionalMax results per page, 1-100. Default 25.
  • page number · optional1-based page number. Default 1.
list_tasksread

List CRM follow-up tasks. Defaults to open (not completed) tasks ordered by due date. Includes the contact and assignee for each task.

Arguments

  • status string · optional · one of: open, completed, allDefault 'open'.
  • limit number · optionalMax results, 1-100. Default 25.
get_revenue_summaryread

Get 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_meetingsread

List 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_id string · optionalOnly this contact's meetings.
  • from_date string · optionalISO date lower bound, e.g. '2026-06-01'.
  • to_date string · optionalISO date upper bound.
  • limit number · optionalMax results, 1-100. Default 25.
get_meeting_summaryread

Get 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_id string · requiredThe meeting id (a UUID from list_meetings).
search_call_transcriptsread

Semantic 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

  • query string · requiredWhat to look for, phrased naturally. Example: 'objections about implementation timeline'.
  • limit number · optionalMax excerpts, 1-20. Default 8.
verify_linkedin_profilesread

Verify 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

  • urls string · requiredFree text containing up to 20 LinkedIn profile URLs (linkedin.com/in/…), e.g. one per line. Bare slugs are accepted too.
list_prescreen_leadsread

For 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

  • campaign string · optionalOptional. A campaign's exact name (case-insensitive) or id. Omit to list all campaigns that have leads awaiting review.
  • limit number · optionalMax pending leads to return for a campaign (default 50, max 200).
list_campaignsread

List 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_campaignread

Full 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

  • campaign string · requiredThe campaign's exact name (case-insensitive) or id.
get_campaign_analyticsread

Outbound 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

  • campaign string · optionalOptional. A campaign's exact name or id. Omit for the whole workspace combined.
  • days number · 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 key

Import 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_text string · requiredThe full transcript, one utterance per line, ideally 'Speaker Name: text'. Plain unlabeled lines are accepted too. Max 500k characters.
  • prospect_email string · requiredEmail of the external participant (the prospect). The meeting attaches to this contact — found case-insensitively or created if new.
  • prospect_name string · optionalProspect's display name, used only if the contact is created. Example: 'Dana Buyer'.
  • prospect_company string · optionalProspect's company, used only if the contact is created.
  • rep_email string · optionalEmail of the team member who ran the call. Must match a Salescadia team member. Omit to attribute to the workspace admin.
  • meeting_date string · optionalWhen the call happened, ISO 8601 (e.g. '2026-07-01T15:00:00Z'). Defaults to now.
  • duration_minutes number · optionalCall length in minutes, 1-480. Estimated from the transcript when omitted.
  • source string · optionalWhere the recording came from: 'otter', 'zoom', 'google_meet', 'teams', or 'other' (default). Shown as the meeting's source badge.
create_taskwrite key

Create 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

  • title string · requiredWhat needs doing, imperative and concrete. Max 300 characters.
  • description string · optionalOptional detail/context for whoever does it. Max 2000 characters.
  • due_date string · optionalOptional ISO 8601 due date, e.g. '2026-07-18' or '2026-07-18T17:00:00Z'.
  • priority string · optional · one of: low, medium, high, urgentDefault 'medium'.
  • assignee_email string · optionalTeam member to assign it to (must match a member's email). Omit to assign to the workspace admin.
  • contact_id string · optionalOptional contact to attach the task to (a UUID from search_contacts).
add_leads_to_campaignwrite key

Add 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

  • urls string · requiredFree text containing up to 20 LinkedIn profile URLs (linkedin.com/in/…), e.g. one per line.
  • campaign string · requiredThe target campaign's exact name (case-insensitive) or its id. Must already exist and be active.
create_campaignwrite key

Create 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

  • name string · requiredCampaign display name, e.g. 'RevOps leaders Q3'. Max 200 characters.
  • description string · 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_style string · optional · one of: consultative, defaultHow generated messages read: 'consultative' (low-pressure, qualification-first; the default) or 'default' (the standard pitch-forward writers).
  • launch boolean · 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 key

Approve 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

  • campaign string · requiredThe campaign's exact name (case-insensitive) or id — the one the leads belong to.
  • decision string · required · one of: approve, reject'approve' to enroll + start outreach, 'reject' to do-not-contact.
  • lead_ids string[] · requiredThe lead ids to decide on (from list_prescreen_leads). Up to 500 per call.
edit_campaign_targetingwrite key

Change 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

  • campaign string · requiredThe campaign's exact name (case-insensitive) or id.
  • add_titles string[] · optionalJob titles to ADD to the target.
  • remove_titles string[] · optionalJob titles to remove.
  • set_titles string[] · optionalReplace the title list entirely.
  • add_industries string[] · optionalIndustries to add (validated against LinkedIn's list; e.g. Computer Games, Mobile Gaming Apps).
  • remove_industries string[] · optionalIndustries to remove.
  • set_industries string[] · optionalReplace the industry list entirely.
  • add_locations string[] · optionalLocations/countries to add (e.g. United States, Germany).
  • remove_locations string[] · optionalLocations to remove.
  • set_locations string[] · optionalReplace the location list entirely.
  • add_seniorities string[] · optionalSeniority levels to add (Owner, Partner, CXO, VP, Director, Manager, Senior, Entry, ...).
  • remove_seniorities string[] · optionalSeniority levels to remove.
  • set_seniorities string[] · optionalReplace the seniority list entirely.
  • add_company_sizes string[] · optionalCompany head-count bands to add (1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+).
  • remove_company_sizes string[] · optionalHead-count bands to remove.
  • set_company_sizes string[] · optionalReplace the company-size list entirely.
  • keywords string · optionalThe raw boolean keyword string (e.g. "gaming AND (influencer OR creator) marketing"). Empty string clears it.
  • keyword_groups array[] · optionalAND-of-OR groups: [["gaming","esports"],["influencer","creator"]] means (gaming OR esports) AND (influencer OR creator). Replaces the current groups.
  • strict_keywords boolean · optionalWhen true, a lead must match EVERY keyword group (narrows hard); false loosens.
  • add_languages string[] · optionalProfile languages to TARGET (English, Spanish, French, German, Portuguese, Chinese, …). English-only also drops clearly non-English-primary countries as a safety net.
  • remove_languages string[] · optionalProfile languages to remove.
  • set_languages string[] · optionalReplace the profile-language list entirely.
  • add_exclude_locations string[] · optionalLocations/countries to EXCLUDE (e.g. India, China) — filtered out of sourcing.
  • remove_exclude_locations string[] · optionalExcluded locations to remove.
  • set_exclude_locations string[] · optionalReplace the excluded-locations list entirely.
  • add_exclude_keywords string[] · optionalKeywords that DISQUALIFY a lead.
  • add_exclude_industries string[] · optionalIndustries to exclude.
  • re_source boolean · optionalRe-source with the new filters after saving (default true). New leads respect the campaign's pre-screen/approval settings.
set_campaign_statuswrite key

Pause, 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

  • campaign string · requiredThe campaign's exact name (case-insensitive) or id.
  • status string · required · one of: active, paused, archivedactive = resume/launch sending, paused = halt sending, archived = stop for good.