Skip to main content
Glama
SalesSuite MCP Server

SalesSuite MCP Server

Official

salessuite-mcp

MCP server for the SalesSuite CRM API: contacts, contact persons, deals, pipelines, notes, calls, emails, forms, action buttons and webhook subscriptions.

The only configuration is your SalesSuite API key; the tenant is derived from it.

Usage

Create an API key in SalesSuite (Settings > General) and add the server to your MCP client.

Claude Code

claude mcp add salessuite --scope user --env SALESSUITE_API_KEY=your-api-key -- npx -y salessuite-mcp

Keep the -- before npx: without it, --env also swallows the command and the server is registered without arguments (it then hangs on "connecting"). --scope user makes it available in every project.

Claude Desktop / Cursor / other clients (claude_desktop_config.json, .cursor/mcp.json, …)

{
  "mcpServers": {
    "salessuite": {
      "command": "npx",
      "args": ["-y", "salessuite-mcp"],
      "env": { "SALESSUITE_API_KEY": "your-api-key" }
    }
  }
}

Variable

Required

Description

SALESSUITE_API_KEY

yes

SalesSuite API key (sent as x-api-key).

SALESSUITE_TOOLSETS

no

Comma-separated toolsets to load (default: all), e.g. contacts,deals,notes. metadata is always loaded.

SALESSUITE_READ_ONLY

no

true registers only tools that do not modify data.

SALESSUITE_BASE_URL

no

Override the API URL (default https://api.salessuite.com/api), e.g. for a mock server.

Related MCP server: pipedrive-mcp

Tools

One tool per non-deprecated API operation, plus get_api_guide, which returns the API's own documentation (property identification, note HTML, pagination, archived records, rate limits, webhooks), and describe_webhook_event.

Toolset

Tools

metadata (always on)

get_tenant_info, list_pipelines, list_properties, list_cards, list_users, get_user, get_user_by_email

contacts

list_contacts, search_contacts, get_contact, get_contact_by_email, create_contact, upsert_contact_by_email, update_contact

contacts

create_contact_person, get_contact_person, update_contact_person, delete_contact_person, set_main_contact_person

deals

list_deals, list_deals_by_contact, find_deals_by_email, search_deals, get_deal, create_deal, update_deal

notes

list_notes, list_note_feed, get_note, create_note, delete_note

calls

list_call_types, list_call_activities, list_call_activity_feed, get_call_activity, create_call_activity, delete_call_activity

emails

list_email_activities, list_email_activity_feed, get_email_activity, log_email_activity, delete_email_activity

forms

list_forms, list_form_submissions

action_buttons

list_trigger_action_buttons, list_action_button_executions

webhooks

list_webhook_subscriptions, get_webhook_subscription, create_webhook_subscription, update_webhook_subscription, delete_webhook_subscription, describe_webhook_event

Path and query parameters are top-level tool arguments; request bodies go into body.

Context size. All tools together take about 24k tokens of tool definitions (measured as JSON at ~3.5 characters per token); SALESSUITE_TOOLSETS=contacts,deals,notes about 16k, SALESSUITE_READ_ONLY=true about 13k. The webhook subscription tools advertise a compact schema; describe_webhook_event returns the event-specific filter and payload schema on demand, and the full generated schema still validates the body before it is sent.

Custom properties. The SalesSuite OpenAPI spec is tenant-specific: custom properties appear as extra fields in the create/update schemas. The bundled schemas only know the system properties, so the create/update payloads of contacts, contact persons and deals also accept additional keys. Custom properties are keyed by their propertyIdentifier, which starts with x_ (e.g. x_budget); search filters use the full identifier (e.g. contact_x_budget). list_properties with propertyType: "dynamic" lists them with their value types and select options.

License

MIT

Available Tools

53 tools
create_call_activityCreate Call ActivityC

Create Call Activity.

Creates a call activity for a contact and optionally associates it with a deal.

Inputs: body (required).

create_contactCreate ContactB

Create Contact.

Creates a new contact along with its main contact person and optional additional contact persons.

Use Contact Persons to manage contact persons and change the main contact person.

Inputs: body (required).

create_contact_personCreate Contact PersonC

Create Contact Person.

Creates a new contact person for an existing contact. The email address is required.

Inputs: body (required).

create_dealCreate DealA

Create Deal.

Creates a new deal for a specific contact and phase.

Get a phaseId from list_pipelines first.

Inputs: body (required).

create_noteCreate noteA

Create note.

Creates a note on a contact or deal. Use GET /v1/note/{noteId} to retrieve the created note. Exactly one of contactId or dealId must be provided.

Supported formats:

  • text/html: formatted note content. See Notes for the supported tags.

  • text/plain: plain text note content. Line breaks are supported.

Inputs: body (required), dealId, contactId.

create_webhook_subscriptionCreate Webhook SubscriptionA

Create Webhook Subscription.

Registers a webhook subscription. Registering an identical subscription (same hookUrl, event type, and filter) does not create a duplicate: the existing subscription is returned, and a deactivated one is reactivated.

Delivery: When the selected event happens, the application sends a POST request to hookUrl with the related payload in the request body.

Payload types:

Event Type

Payload Type

contact.propertyChanged

WebhookContactPropertyChangedPayload

deal.propertyChanged

WebhookDealPropertyChangedPayload

deal.stageChanged

WebhookDealStageChangedPayload

activity.created

WebhookActivityCreatedPayload

form.submitted

WebhookFormSubmittedPayload

contact.created

WebhookContactCreatedPayload

deal.created

WebhookDealCreatedPayload

actionButton.executed

WebhookActionButtonExecutedPayload

Filters: Supported filter fields and matching behaviour depend on the selected event type.

Inputs: body (required).

delete_call_activityDelete Call ActivityC
DestructiveIdempotent

Delete Call Activity.

Deletes a call activity by ID.

Inputs: callActivityId (required).

delete_contact_personDelete Contact PersonB
DestructiveIdempotent

Delete Contact Person.

Deletes an additional contact person by ID and returns the owning contact ID.

Inputs: contactPersonId (required).

delete_email_activityDelete email activityA
DestructiveIdempotent

Delete email activity.

Deletes a logged email activity by emailActivityId. Email activities that were sent by SalesSuite cannot be deleted with this operation and return 409 Conflict.

Inputs: emailActivityId (required).

delete_noteDelete noteC
DestructiveIdempotent

Delete note.

Deletes a note by noteId.

Inputs: noteId (required).

delete_webhook_subscriptionDelete Webhook SubscriptionB
DestructiveIdempotent

Delete Webhook Subscription.

Deletes a webhook subscription by ID and stops future event delivery to its URL.

Inputs: id (required).

describe_webhook_eventDescribe webhook eventA
Read-only

Returns, for one webhook event type, the JSON Schema of the subscription body (incl. the event-specific filter) for create_webhook_subscription / update_webhook_subscription, and the JSON Schema of the payload delivered to hookUrl.

Inputs: type (required).

find_deals_by_emailFind Deals by EmailB
Read-onlyIdempotent

Find Deals by Email.

Retrieves all deals linked to contacts that have at least one contact person with the specified primary email address.

Inputs: email (required).

get_api_guideSalesSuite API guideA
Read-only

Returns the SalesSuite API guide: data model, property identification for search filters, supported note HTML, cursor pagination, archived records, rate limits and webhooks. Optionally filter by a section heading.

Inputs: section.

get_call_activityGet call activityC
Read-onlyIdempotent

Get call activity.

Retrieves a single call activity by callActivityId.

Inputs: callActivityId (required).

get_contactGet Contact by IDB
Read-onlyIdempotent

Get Contact by ID.

Retrieves a single contact along with its associated contact persons.

Inputs: contactId (required).

get_contact_by_emailGet Contact by EmailA
Read-onlyIdempotent

Get Contact by Email.

Retrieves all contacts that have at least one contact person with the specified primary email address.

For more flexible contact filtering and sorting, use POST /v2/contact/search.

Inputs: email (required).

get_contact_personGet Contact Person by IDB
Read-onlyIdempotent

Get Contact Person by ID.

Retrieves a single contact person with the related contact.

Inputs: contactPersonId (required).

get_dealGet Deal by IDC
Read-onlyIdempotent

Get Deal by ID.

Retrieves a single deal by its unique identifier.

Inputs: dealId (required).

get_email_activityGet email activityB
Read-onlyIdempotent

Get email activity.

Retrieves a single email activity by emailActivityId.

Inputs: emailActivityId (required).

get_noteGet noteB
Read-onlyIdempotent

Get note.

Retrieves a single note by noteId. Use POST /v1/note to create notes.

Inputs: noteId (required).

get_tenant_infoGet Authentication DataA
Read-onlyIdempotent

Get Authentication Data.

Validates the API key and returns basic tenant metadata used by integrations such as Zapier.

The values can be changed in the web app under Settings > General (https://app.salessuite.com/t/{tenantId}/settings/general).

Inputs: no named parameters.

get_userGet User by IDC
Read-onlyIdempotent

Get User by ID.

Retrieves a single user by ID.

Inputs: userId (required).

get_user_by_emailGet User by EmailA
Read-onlyIdempotent

Get User by Email.

Retrieves a single user by normalised exact email match. Email matching is case-insensitive after normalisation.

Inputs: email (required).

get_webhook_subscriptionGet Webhook SubscriptionC
Read-onlyIdempotent

Get Webhook Subscription.

Returns a webhook subscription by ID.

Inputs: id (required).

list_action_button_executionsList Action Button ExecutionsA
Read-onlyIdempotent

List Action Button Executions.

Lists target records with stored executions for one trigger action-button property. The records array is grouped by contact, contact person, or deal; each record contains its stored executions.

Available trigger action buttons: GET /v1/action-button/trigger

Inputs: propertyIdentification (required), limit, cursor, executionsPerRecord.

list_call_activitiesList call activitiesA
Read-onlyIdempotent

List call activities.

Retrieves call activities directly attached to the requested contact or deal. See also GET /v1/call-activity/feed.

The fixed sort order is pinIndex DESC, callStartedAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_call_activity_feedList call activity feedA
Read-onlyIdempotent

List call activity feed.

Retrieves a call activity feed for the requested contact or deal. See also GET /v1/call-activity.

For a contact, the feed contains direct contact call activities and call activities from readable related deals.

For a deal, the feed contains direct deal call activities and call activities from the related contact.

The fixed sort order is pinIndex DESC, callStartedAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_call_typesGet Call TypesA
Read-onlyIdempotent

Get Call Types.

Retrieves all available call types. The values can be changed in the web app under Settings > Calls (https://app.salessuite.com/t/{tenantId}/settings/calls).

Inputs: no named parameters.

list_cardsGet CardsC
Read-onlyIdempotent

Get Cards.

Returns cards with optional filters.

Inputs: sortBy, cardType, isPropertyRequired, contactCardVisibility, +1 more.

list_contactsGet ContactsA
Read-onlyIdempotent

Get Contacts.

Retrieves a paginated list of all contacts.

For more flexible filtering and sorting, use POST /v2/contact/search.

Inputs: page, pageSize.

list_dealsGet DealsC
Read-onlyIdempotent

Get Deals.

Returns a list of deals

For more flexible filtering and sorting, use POST /v1/deal/search.

Inputs: page, sortBy, phaseId, pageSize, +3 more.

list_deals_by_contactGet DealsC
Read-onlyIdempotent

Get Deals.

Returns a list of deals

Inputs: contactId (required), page, pageSize, pipelineId.

list_email_activitiesList email activitiesA
Read-onlyIdempotent

List email activities.

Retrieves email activities directly attached to the requested contact or deal. See also GET /v1/email-activity/feed.

The fixed sort order is pinIndex DESC, createdAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_email_activity_feedList email activity feedA
Read-onlyIdempotent

List email activity feed.

Retrieves an email activity feed for the requested contact or deal. See also GET /v1/email-activity.

For a contact, the feed contains direct contact email activities and email activities from readable related deals.

For a deal, the feed contains direct deal email activities and email activities from the related contact.

The fixed sort order is pinIndex DESC, createdAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_formsGet FormsB
Read-onlyIdempotent

Get Forms.

Retrieves active forms sorted by creation date, newest first.

Inputs: page, pageSize.

list_form_submissionsGet Form SubmissionsB
Read-onlyIdempotent

Get Form Submissions.

Retrieves a page of submissions for a specific form.

Inputs: formId (required), page, after, before, +1 more.

list_note_feedList note feedA
Read-onlyIdempotent

List note feed.

Retrieves a note feed for the requested contact or deal. See also GET /v1/note.

For a contact, the feed contains direct contact notes and notes from related deals.

For a deal, the feed contains direct deal notes and notes from the related contact.

The fixed sort order is pinIndex DESC, createdAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_notesList notesA
Read-onlyIdempotent

List notes.

Retrieves notes directly attached to the requested contact or deal. See also GET /v1/note/feed.

The fixed sort order is pinIndex DESC, createdAt DESC, id DESC.

Provide contactId or dealId. Paginate with the returned cursor until it is null.

Inputs: limit, cursor, dealId, contactId.

list_pipelinesGet PipelinesA
Read-onlyIdempotent

Get Pipelines.

Retrieves the readable pipelines and their phases.

Use this to find phaseIds for creating or moving deals.

Inputs: no named parameters.

list_propertiesGet PropertiesA
Read-onlyIdempotent

Get Properties.

Returns persisted property definitions with optional filters.

Use this to discover property identifiers (incl. custom properties) for search filters and create/update payloads.

Inputs: cardType, dataType, required, propertyType, +1 more.

list_trigger_action_buttonsList Trigger Action ButtonsB
Read-onlyIdempotent

List Trigger Action Buttons.

Returns all trigger-type action buttons with optional filtering by card type.

Inputs: dynamicDbTableName.

list_usersGet UsersC
Read-onlyIdempotent

Get Users.

Retrieves a page of users.

Inputs: page, role, sortBy, pageSize, +2 more.

list_webhook_subscriptionsList Webhook SubscriptionsB
Read-onlyIdempotent

List Webhook Subscriptions.

Returns all webhook subscriptions for the current tenant.

Inputs: no named parameters.

log_email_activityLog email activityA

Log email activity.

Logs an email activity. This operation does not send the email. Use it to log emails that were sent by an external application or email client.

Inputs: body (required).

search_contactsSearch ContactsA
Read-onlyIdempotent

Search Contacts.

Search contacts using flexible filters and sorting.

For filters, condition.type must match the selected property's type (string, number, boolean, dateTime, select). Type mismatches return 400.

Property identifiers look like contact_companyName or contactPerson_email; see list_properties and get_api_guide.

Inputs: body (required).

search_dealsSearch DealsA
Read-onlyIdempotent

Search Deals.

Search deals using flexible filters and sorting.

For filters, condition.type must match the selected property's type (string, number, boolean, dateTime, select). Type mismatches return 400.

Property identifiers look like deal_name or contact_companyName; see list_properties and get_api_guide.

Inputs: body (required).

set_main_contact_personSet Main Contact PersonB
DestructiveIdempotent

Set Main Contact Person.

Makes an existing contact person the main contact person of its owning contact. The contact person must belong to a non-archived contact.

Inputs: contactPersonId (required).

update_contactUpdate ContactA
DestructiveIdempotent

Update Contact.

Updates an existing contact by ID. This endpoint only accepts contact fields and does not update contact persons.

Use Contact Persons to manage contact persons and change the main contact person.

Inputs: body (required), contactId (required), appendMultiSelectValues.

update_contact_personUpdate Contact PersonB
DestructiveIdempotent

Update Contact Person.

Updates an existing contact person by ID. This endpoint only accepts contact person fields.

Inputs: body (required), contactPersonId (required).

update_dealUpdate DealB
DestructiveIdempotent

Update Deal.

Updates a deal by its ID.

Deal properties can be changed, the deal can be moved to another phase, and the deal can be assigned to another contact.

Inputs: body (required), dealId (required), appendMultiSelectValues.

update_webhook_subscriptionUpdate Webhook SubscriptionB
DestructiveIdempotent

Update Webhook Subscription.

Updates an existing webhook subscription.

Delivery: When the selected event happens, the application sends a POST request to hookUrl with the related payload in the request body.

Filters: Supported filter fields and matching behaviour depend on the selected event type. Omit active to preserve the current state. Set active: true to reactivate or active: false to deactivate. Reactivation enables future notifications without replaying missed deliveries.

Inputs: id (required), body (required).

upsert_contact_by_emailCreate or Update Contact by Contact Person EmailA

Create or Update Contact by Contact Person Email.

The submitted email identifies the contact person. This can be the main contact person or an additional contact person.

  • If no contact person uses this email, a new contact with a main contact person is created.

  • If exactly one non-archived contact person uses this email, that contact person and its parent contact are updated.

  • If multiple non-archived contact persons use this email, the request fails with 409 Conflict.

Inputs: body (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 53 tools

    Disambiguation3/5

    Many retrieval tools overlap by resource: list_deals, list_deals_by_contact, find_deals_by_email, and search_deals all return deals; similarly list_notes vs list_note_feed and direct vs feed activity listings are easy to confuse. Descriptions clarify the differences, but the large number of near-parallel list/search/feed variants creates real misselection risk.

    Naming Consistency4/5

    Most tools follow a clear snake_case verb_noun convention (list_contacts, get_deal, create_note, delete_webhook_subscription). Minor deviations such as find_deals_by_email and log_email_activity break the otherwise predictable pattern, but overall naming remains readable and mostly consistent.

    Tool Count2/5

    At 53 tools, the surface is far beyond the typical well-scoped range and feels heavy for an MCP server. While many tools map to distinct CRM resources, the count is excessive and increases selection burden.

    Completeness4/5

    The tool set covers core CRM workflows well: contacts, contact persons, deals, notes, call activities, email activities, webhooks, forms, action buttons, users, pipelines, and properties. Gaps such as deal deletion and contact deletion/archival exist, but they are relatively minor for typical sales workflows.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to read and write CRM data—companies, contacts, opportunities, tasks, and interactions—through MCP, with OAuth and provenance tracking for every value.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables reading and managing Pipedrive CRM records—deals, people, organizations, activities, and notes—over MCP, including searching, writing, and moving deals through pipelines.
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to manage a fully customizable CRM, including contacts, companies, sales pipelines, custom objects and fields, file uploads, and data relationships via MCP over HTTP.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables MCP clients to search, create, and update Yacrum CRM records, log activities, manage tasks, read pipelines and forecasts, and summarize deals through the Yacrum REST API using an API key.
      303 npm
      MIT