Skip to main content
Glama
mcp-server-salesforce

mcp-server-salesforce

Salesforce MCP Server

OpenSSF Scorecard

An MCP (Model Context Protocol) server implementation that integrates Claude with Salesforce, enabling natural language interactions with your Salesforce data and metadata. This server allows Claude to query, modify, and manage your Salesforce objects and records using everyday language.

Features

  • Object and Field Management: Create and modify custom objects and fields using natural language

  • Smart Object Search: Find Salesforce objects using partial name matches

  • Detailed Schema Information: Get comprehensive field and relationship details for any object

  • Flexible Data Queries: Query records with relationship support and complex filters

  • Data Manipulation: Insert, update, delete, and upsert records with ease

  • Cross-Object Search: Search across multiple objects using SOSL

  • Apex Code Management: Read, create, and update Apex classes and triggers

  • Intuitive Error Handling: Clear feedback with Salesforce-specific error details

  • Switchable Authentication: Supports multiple orgs. Easily switch your active Salesforce org based on the default org configured in your VS Code workspace (use Salesforce_CLI authentication for this feature).

Related MCP server: Salesforce MCP Server

Installation

Requirements

  • Node.js 20+. The server must run under Node — bun is not supported: jsforce's HTTP transport hangs under bun, so authentication appears to succeed but every Salesforce API call stalls until the MCP host times out (see #118). Use npx/node (not bun x) in your MCP client configuration.

Global Installation (npm)

npm install -g @tsmztech/mcp-server-salesforce

Claude Desktop Quick Installation

For easy setup with Claude Desktop, download the pre-configured extension:

  1. Download salesforce-mcp-extension.dxt from the claude-desktop/ folder

  2. Open Claude Desktop → Settings → Extensions

  3. Drag the .dxt file into the Extensions window

  4. Configure your Salesforce credentials when prompted

For manual Claude Desktop configuration, see Usage with Claude Desktop below.

Tools

salesforce_search_objects

Search for standard and custom objects:

  • Search by partial name matches

  • Finds both standard and custom objects

  • Example: "Find objects related to Account" will find Account, AccountHistory, etc.

salesforce_describe_object

Get detailed object schema information:

  • Field definitions and properties

  • Relationship details

  • Picklist values

  • Example: "Show me all fields in the Account object"

salesforce_query_records

Query records with relationship support:

  • Parent-to-child relationships

  • Child-to-parent relationships

  • Complex WHERE conditions

  • Example: "Get all Accounts with their related Contacts"

  • Note: For queries with GROUP BY or aggregate functions, use salesforce_aggregate_query

salesforce_aggregate_query

Execute aggregate queries with GROUP BY:

  • GROUP BY single or multiple fields

  • Aggregate functions: COUNT, COUNT_DISTINCT, SUM, AVG, MIN, MAX

  • HAVING clauses for filtering grouped results

  • Date/time grouping functions

  • Example: "Count opportunities by stage" or "Find accounts with more than 10 opportunities"

salesforce_dml_records

Perform data operations:

  • Insert new records

  • Update existing records

  • Delete records

  • Upsert using external IDs

  • Example: "Update status of multiple accounts"

salesforce_manage_object

Create and modify custom objects:

  • Create new custom objects

  • Update object properties

  • Configure sharing settings

  • Example: "Create a Customer Feedback object"

salesforce_manage_field

Manage object fields:

  • Add new custom fields

  • Modify field properties

  • Create relationships

  • Automatically grants Field Level Security to System Administrator by default

  • Use grantAccessTo parameter to specify different profiles

  • Example: "Add a Rating picklist field to Account"

salesforce_manage_field_permissions

Manage Field Level Security (Field Permissions):

  • Grant or revoke read/edit access to fields for specific profiles

  • View current field permissions

  • Bulk update permissions for multiple profiles

  • Useful for managing permissions after field creation or for existing fields

  • Example: "Grant System Administrator access to Custom_Field__c on Account"

salesforce_search_all

Search across multiple objects:

  • SOSL-based search

  • Multiple object support

  • Field snippets

  • Example: "Search for 'cloud' across Accounts and Opportunities"

salesforce_read_apex

Read Apex classes:

  • Get full source code of specific classes

  • List classes matching name patterns

  • View class metadata (API version, status, etc.)

  • Support for wildcards (* and ?) in name patterns

  • Example: "Show me the AccountController class" or "Find all classes matching AccountCont"

salesforce_write_apex

Create and update Apex classes:

  • Create new Apex classes

  • Update existing class implementations

  • Specify API versions

  • Example: "Create a new Apex class for handling account operations"

salesforce_read_apex_trigger

Read Apex triggers:

  • Get full source code of specific triggers

  • List triggers matching name patterns

  • View trigger metadata (API version, object, status, etc.)

  • Support for wildcards (* and ?) in name patterns

  • Example: "Show me the AccountTrigger" or "Find all triggers for Contact object"

salesforce_write_apex_trigger

Create and update Apex triggers:

  • Create new Apex triggers for specific objects

  • Update existing trigger implementations

  • Specify API versions and event operations

  • Example: "Create a new trigger for the Account object" or "Update the Lead trigger"

salesforce_execute_anonymous

Execute anonymous Apex code:

  • Run Apex code without creating a permanent class

  • View debug logs and execution results

  • Useful for data operations not directly supported by other tools

  • Example: "Execute Apex code to calculate account metrics" or "Run a script to update related records"

salesforce_manage_debug_logs

Manage debug logs for Salesforce users:

  • Enable debug logs for specific users

  • Disable active debug log configurations

  • Retrieve and view debug logs

  • Configure log levels (NONE, ERROR, WARN, INFO, DEBUG, FINE, FINER, FINEST)

  • Example: "Enable debug logs for user@example.com" or "Retrieve recent logs for an admin user"

Setup

Salesforce Authentication

You can connect to Salesforce using one of three authentication methods:

1. Username/Password Authentication (Default)

  1. Set up your Salesforce credentials

  2. Get your security token (Reset from Salesforce Settings)

2. OAuth 2.0 Client Credentials Flow

  1. Create a Connected App in Salesforce

  2. Enable OAuth settings and select "Client Credentials Flow"

  3. Set appropriate scopes (typically "api" is sufficient)

  4. Save the Client ID and Client Secret

  5. Important: Note your instance URL (e.g., https://your-domain.my.salesforce.com) as it's required for authentication

  1. Install and authenticate Salesforce CLI (sf).

  2. Make sure your org is authenticated and accessible via sf org display --json in the root of your Salesforce project.

  3. The server will automatically retrieve the access token and instance url using the CLI.

Optional: Salesforce API Version

By default, the server uses the jsforce library's default Salesforce API version, which may be too old for newer standard objects (for example, AccountPlan requires API version 62.0+ and fails with sObject type 'AccountPlan' is not supported). Set the SALESFORCE_API_VERSION environment variable to pin a specific version with any authentication method:

"env": {
  "SALESFORCE_CONNECTION_TYPE": "...",
  "SALESFORCE_API_VERSION": "62.0"
}

The value must look like "62.0" (major version dot minor version).

Usage with Claude Desktop

Add to your claude_desktop_config.json:

For Salesforce CLI Authentication:

{
  "mcpServers": {
    "salesforce": {
      "command": "npx",
      "args": ["-y", "@tsmztech/mcp-server-salesforce"],
      "env": {
        "SALESFORCE_CONNECTION_TYPE": "Salesforce_CLI"
      }
    }
  }
}

For Username/Password Authentication:

{
  "mcpServers": {
    "salesforce": {
      "command": "npx",
      "args": ["-y", "@tsmztech/mcp-server-salesforce"],
      "env": {
        "SALESFORCE_CONNECTION_TYPE": "User_Password",
        "SALESFORCE_USERNAME": "your_username",
        "SALESFORCE_PASSWORD": "your_password",
        "SALESFORCE_TOKEN": "your_security_token",
        "SALESFORCE_INSTANCE_URL": "org_url"        // Optional. Default value: https://login.salesforce.com
      }
    }
  }
}

For OAuth 2.0 Client Credentials Flow:

{
  "mcpServers": {
    "salesforce": {
      "command": "npx",
      "args": ["-y", "@tsmztech/mcp-server-salesforce"],
      "env": {
        "SALESFORCE_CONNECTION_TYPE": "OAuth_2.0_Client_Credentials",
        "SALESFORCE_CLIENT_ID": "your_client_id",
        "SALESFORCE_CLIENT_SECRET": "your_client_secret",
        "SALESFORCE_INSTANCE_URL": "https://your-domain.my.salesforce.com"  // REQUIRED: Must be your exact Salesforce instance URL
      }
    }
  }
}

Note: For OAuth 2.0 Client Credentials Flow, the SALESFORCE_INSTANCE_URL must be your exact Salesforce instance URL (e.g., https://your-domain.my.salesforce.com). The token endpoint will be constructed as <instance_url>/services/oauth2/token.

For Direct Access Token Authentication:

{
  "mcpServers": {
    "salesforce": {
      "command": "npx",
      "args": ["-y", "@tsmztech/mcp-server-salesforce"],
      "env": {
        "SALESFORCE_CONNECTION_TYPE": "Access_Token",
        "SALESFORCE_INSTANCE_URL": "https://your-domain.my.salesforce.com",
        "SALESFORCE_ACCESS_TOKEN": "your_access_token"
      }
    }
  }
}

Note: Use Access_Token when the OAuth access token is provisioned by an external system (an SSO gateway, the SF CLI on another machine, a refresh-token-based proxy, etc.) and only the resulting access token + instance URL are available at runtime. The server skips the OAuth handshake and uses the provided token directly.

Running with Docker

You can run this MCP server inside a Docker container. Because the server communicates over stdio (standard input/output), the container is typically executed interactively by an MCP client using docker run -i.

1. Clone the Repo

git clone https://github.com/tsmztech/mcp-server-salesforce.git

2. Navigate to directory

cd mcp-server-salesforce

3. Build the Image

docker build -t mcp-server-salesforce .

4. Authentication in Containers

NOTE

The Salesforce CLI (sf) web-based OAuth login flow is unavailable inside headless Docker containers.

When running containerized, use one of the supported environment-variable based authentication methods:

  • Username & Password Authentication

    • SALESFORCE_CONNECTION_TYPE=User_Password

    • SALESFORCE_USERNAME

    • SALESFORCE_PASSWORD

    • SALESFORCE_TOKEN

  • OAuth 2.0 Client Credentials Flow

    • SALESFORCE_CONNECTION_TYPE=OAuth_2.0_Client_Credentials

    • SALESFORCE_CLIENT_ID

    • SALESFORCE_CLIENT_SECRET

    • SALESFORCE_INSTANCE_URL

  • Direct Access Token Authentication

    • SALESFORCE_CONNECTION_TYPE=Access_Token

    • SALESFORCE_ACCESS_TOKEN

    • SALESFORCE_INSTANCE_URL

5. MCP Client Configuration

To register the containerized server with an MCP client (such as Claude Desktop), add the following configuration to your claude_desktop_config.json:

{
  "mcpServers": {
    "salesforce": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "SALESFORCE_CONNECTION_TYPE=User_Password",
        "-e",
        "SALESFORCE_USERNAME=your_username",
        "-e",
        "SALESFORCE_PASSWORD=your_password",
        "-e",
        "SALESFORCE_TOKEN=your_security_token",
        "mcp-server-salesforce"
      ]
    }
  }
}

6. Manual Testing

You can test the containerized server directly from your terminal:

docker run -i --rm \
  -e SALESFORCE_CONNECTION_TYPE="User_Password" \
  -e SALESFORCE_USERNAME="your_username" \
  -e SALESFORCE_PASSWORD="your_password" \
  -e SALESFORCE_TOKEN="your_security_token" \
  mcp-server-salesforce

Once the container is running, you can send an MCP initialize JSON-RPC request through stdin:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": {
      "name": "test-client",
      "version": "1.0.0"
    }
  }
}

Example Usage

Searching Objects

"Find all objects related to Accounts"
"Show me objects that handle customer service"
"What objects are available for order management?"

Getting Schema Information

"What fields are available in the Account object?"
"Show me the picklist values for Case Status"
"Describe the relationship fields in Opportunity"

Querying Records

"Get all Accounts created this month"
"Show me high-priority Cases with their related Contacts"
"Find all Opportunities over $100k"

Aggregate Queries

"Count opportunities by stage"
"Show me the total revenue by account"
"Find accounts with more than 10 opportunities"
"Calculate average deal size by sales rep and quarter"
"Get the number of cases by priority and status"

Managing Custom Objects

"Create a Customer Feedback object"
"Add a Rating field to the Feedback object"
"Update sharing settings for the Service Request object"

Examples with Field Level Security:

# Default - grants access to System Administrator automatically
"Create a Status picklist field on Custom_Object__c"

# Custom profiles - grants access to specified profiles
"Create a Revenue currency field on Account and grant access to Sales User and Marketing User profiles"

Managing Field Permissions

"Grant System Administrator access to Custom_Field__c on Account"
"Give read-only access to Rating__c field for Sales User profile"
"View which profiles have access to the Custom_Field__c"
"Revoke field access for specific profiles"

Searching Across Objects

"Search for 'cloud' in Accounts and Opportunities"
"Find mentions of 'network issue' in Cases and Knowledge Articles"
"Search for customer name across all relevant objects"

Managing Apex Code

"Show me all Apex classes with 'Controller' in the name"
"Get the full code for the AccountService class"
"Create a new Apex utility class for handling date operations"
"Update the LeadConverter class to add a new method"

Managing Apex Triggers

"List all triggers for the Account object"
"Show me the code for the ContactTrigger"
"Create a new trigger for the Opportunity object"
"Update the Case trigger to handle after delete events"

Executing Anonymous Apex Code

"Execute Apex code to calculate account metrics"
"Run a script to update related records"
"Execute a batch job to process large datasets"

Managing Debug Logs

"Enable debug logs for user@example.com"
"Retrieve recent logs for an admin user"
"Disable debug logs for a specific user"
"Configure log level to DEBUG for a user"

Development

Building from source

# Clone the repository
git clone https://github.com/tsmztech/mcp-server-salesforce.git

# Navigate to directory
cd mcp-server-salesforce

# Install dependencies
npm install

# Build the project
npm run build

Contributing

Contributions are welcome! Feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Issues and Support

If you encounter any issues or need support, please file an issue on the GitHub repository.

Available Tools

15 tools
salesforce_aggregate_queryA
Read-only

Execute SOQL queries with GROUP BY, aggregate functions, and statistical analysis. Use this tool for queries that summarize and group data rather than returning individual records.

NOTE: For regular queries without GROUP BY or aggregates, use salesforce_query_records instead.

This tool handles:

  1. GROUP BY queries (single/multiple fields, related objects, date functions)

  2. Aggregate functions: COUNT(), COUNT_DISTINCT(), SUM(), AVG(), MIN(), MAX()

  3. HAVING clauses for filtering grouped results

  4. Date/time grouping: CALENDAR_YEAR(), CALENDAR_MONTH(), CALENDAR_QUARTER(), FISCAL_YEAR(), FISCAL_QUARTER()

Examples:

  1. Count opportunities by stage:

    • objectName: "Opportunity"

    • selectFields: ["StageName", "COUNT(Id) OpportunityCount"]

    • groupByFields: ["StageName"]

  2. Analyze cases by priority and status:

    • objectName: "Case"

    • selectFields: ["Priority", "Status", "COUNT(Id) CaseCount", "AVG(Days_Open__c) AvgDaysOpen"]

    • groupByFields: ["Priority", "Status"]

  3. Count contacts by account industry:

    • objectName: "Contact"

    • selectFields: ["Account.Industry", "COUNT(Id) ContactCount"]

    • groupByFields: ["Account.Industry"]

  4. Quarterly opportunity analysis:

    • objectName: "Opportunity"

    • selectFields: ["CALENDAR_YEAR(CloseDate) Year", "CALENDAR_QUARTER(CloseDate) Quarter", "SUM(Amount) Revenue"]

    • groupByFields: ["CALENDAR_YEAR(CloseDate)", "CALENDAR_QUARTER(CloseDate)"]

  5. Find accounts with more than 10 opportunities:

    • objectName: "Opportunity"

    • selectFields: ["Account.Name", "COUNT(Id) OpportunityCount"]

    • groupByFields: ["Account.Name"]

    • havingClause: "COUNT(Id) > 10"

Important Rules:

  • All non-aggregate fields in selectFields MUST be included in groupByFields

  • Use whereClause to filter rows BEFORE grouping

  • Use havingClause to filter AFTER grouping (for aggregate conditions)

  • ORDER BY can only use fields from groupByFields or aggregate functions

  • OFFSET is not supported with GROUP BY in Salesforce

Inputs: objectName (required), selectFields (required), groupByFields (required), limit, +3 more.

salesforce_describe_objectA
Read-only

Get detailed schema metadata including all fields, relationships, and field properties of any Salesforce object. Examples: 'Account' shows all Account fields including custom fields; 'Case' shows all Case fields including relationships to Account, Contact etc.

Inputs: objectName (required).

salesforce_dml_recordsA

Perform data manipulation operations on Salesforce records:

  • insert: Create new records

  • update: Modify existing records (requires Id)

  • delete: Remove records (requires Id)

  • upsert: Insert or update based on external ID field Examples: Insert new Accounts, Update Case status, Delete old records, Upsert based on custom external ID

Inputs: records (required), operation (required), objectName (required), externalIdField.

salesforce_execute_anonymousA

Execute anonymous Apex code in Salesforce.

Examples:

  1. Execute simple Apex code: { "apexCode": "System.debug('Hello World');" }

  2. Execute Apex code with variables: { "apexCode": "List accounts = [SELECT Id, Name FROM Account LIMIT 5]; for(Account a : accounts) { System.debug(a.Name); }" }

  3. Execute Apex with debug logs: { "apexCode": "System.debug(LoggingLevel.INFO, 'Processing accounts...'); List accounts = [SELECT Id FROM Account LIMIT 10]; System.debug(LoggingLevel.INFO, 'Found ' + accounts.size() + ' accounts');", "logLevel": "DEBUG" }

Notes:

  • The apexCode parameter is required and must contain valid Apex code

  • The code is executed in an anonymous context and does not persist

  • The logLevel parameter is optional (defaults to 'DEBUG')

  • Execution results include compilation success/failure, execution success/failure, and debug logs

  • For security reasons, some operations may be restricted based on user permissions

  • This tool can be used for data operations or updates when there are no other specific tools available

  • When users request data queries or updates that aren't directly supported by other tools, this tool can be used if the operation is achievable using Apex code

Inputs: apexCode (required), logLevel.

salesforce_manage_debug_logsA

Manage debug logs for Salesforce users - enable, disable, or retrieve logs.

Examples:

  1. Enable debug logs for a user: { "operation": "enable", "username": "user@example.com", "logLevel": "DEBUG", "expirationTime": 30 }

  2. Disable debug logs for a user: { "operation": "disable", "username": "user@example.com" }

  3. Retrieve debug logs for a user: { "operation": "retrieve", "username": "user@example.com", "limit": 5 }

  4. Retrieve a specific log with full content: { "operation": "retrieve", "username": "user@example.com", "logId": "07L1g000000XXXXEAA0", "includeBody": true }

Notes:

  • The operation must be one of: 'enable', 'disable', or 'retrieve'

  • The username parameter is required for all operations

  • For 'enable' operation, logLevel is optional (defaults to 'DEBUG')

  • Log levels: NONE, ERROR, WARN, INFO, DEBUG, FINE, FINER, FINEST

  • expirationTime is optional for 'enable' operation (minutes until expiration, defaults to 30)

  • limit is optional for 'retrieve' operation (maximum number of logs to return, defaults to 10)

  • logId is optional for 'retrieve' operation (to get a specific log)

  • includeBody is optional for 'retrieve' operation (to include the full log content, defaults to false)

  • The tool validates that the specified user exists before performing operations

  • If logLevel is not specified when enabling logs, the tool will ask for clarification

Inputs: username (required), operation (required), limit, logId, +3 more.

salesforce_manage_fieldA

Create new custom fields or modify existing fields on any Salesforce object:

  • Field Types: Text, Number, Date, Lookup, Master-Detail, Picklist etc.

  • Properties: Required, Unique, External ID, Length, Scale etc.

  • Relationships: Create lookups and master-detail relationships

  • Automatically grants Field Level Security to System Administrator (or specified profiles) Examples: Add Rating__c picklist to Account, Create Account lookup on Custom Object Note: Use grantAccessTo parameter to specify profiles, defaults to System Administrator

Inputs: fieldName (required), operation (required), objectName (required), type, +14 more.

salesforce_manage_field_permissionsB

Manage Field Level Security (Field Permissions) for custom and standard fields.

  • Grant or revoke read/edit access to fields for specific profiles or permission sets

  • View current field permissions

  • Bulk update permissions for multiple profiles

Examples:

  1. Grant System Administrator access to a field

  2. Give read-only access to a field for specific profiles

  3. Check which profiles have access to a field

Inputs: fieldName (required), operation (required), objectName (required), editable, +2 more.

salesforce_manage_objectB

Create new custom objects or modify existing ones in Salesforce:

  • Create: New custom objects with fields, relationships, and settings

  • Update: Modify existing object settings, labels, sharing model Examples: Create Customer_Feedback__c object, Update object sharing settings Note: Changes affect metadata and require proper permissions

Inputs: operation (required), objectName (required), label, description, +5 more.

salesforce_query_recordsA
Read-only

Query records from any Salesforce object using SOQL, including relationship queries.

NOTE: For queries with GROUP BY, aggregate functions (COUNT, SUM, AVG, etc.), or HAVING clauses, use salesforce_aggregate_query instead.

Examples:

  1. Parent-to-child query (e.g., Account with Contacts):

    • objectName: "Account"

    • fields: ["Name", "(SELECT Id, FirstName, LastName FROM Contacts)"]

  2. Child-to-parent query (e.g., Contact with Account details):

    • objectName: "Contact"

    • fields: ["FirstName", "LastName", "Account.Name", "Account.Industry"]

  3. Multiple level query (e.g., Contact -> Account -> Owner):

    • objectName: "Contact"

    • fields: ["Name", "Account.Name", "Account.Owner.Name"]

  4. Related object filtering:

    • objectName: "Contact"

    • fields: ["Name", "Account.Name"]

    • whereClause: "Account.Industry = 'Technology'"

Note: When using relationship fields:

  • Use dot notation for parent relationships (e.g., "Account.Name")

  • Use subqueries in parentheses for child relationships (e.g., "(SELECT Id FROM Contacts)")

  • Custom relationship fields end in "__r" (e.g., "CustomObject__r.Name")

Inputs: fields (required), objectName (required), limit, orderBy, +1 more.

salesforce_read_apexA
Read-only

Read Apex classes from Salesforce.

Examples:

  1. Read a specific Apex class by name: { "className": "AccountController" }

  2. List all Apex classes with an optional name pattern: { "namePattern": "Controller" }

  3. Get metadata about Apex classes: { "includeMetadata": true, "namePattern": "Trigger" }

  4. Use wildcards in name patterns: { "namePattern": "AccountCont" }

Notes:

  • When className is provided, the full body of that specific class is returned

  • When namePattern is provided, all matching class names are returned (without body)

  • Use includeMetadata to get additional information like API version, length, and last modified date

  • If neither className nor namePattern is provided, all Apex class names will be listed

  • Wildcards are supported in namePattern: * (matches any characters) and ? (matches a single character)

Inputs: className, namePattern, includeMetadata.

salesforce_read_apex_triggerA
Read-only

Read Apex triggers from Salesforce.

Examples:

  1. Read a specific Apex trigger by name: { "triggerName": "AccountTrigger" }

  2. List all Apex triggers with an optional name pattern: { "namePattern": "Account" }

  3. Get metadata about Apex triggers: { "includeMetadata": true, "namePattern": "Contact" }

  4. Use wildcards in name patterns: { "namePattern": "Account*" }

Notes:

  • When triggerName is provided, the full body of that specific trigger is returned

  • When namePattern is provided, all matching trigger names are returned (without body)

  • Use includeMetadata to get additional information like API version, object type, and last modified date

  • If neither triggerName nor namePattern is provided, all Apex trigger names will be listed

  • Wildcards are supported in namePattern: * (matches any characters) and ? (matches a single character)

Inputs: namePattern, triggerName, includeMetadata.

salesforce_search_allA
Read-only

Search across multiple Salesforce objects using SOSL (Salesforce Object Search Language).

Examples:

  1. Basic search across all objects: { "searchTerm": "John", "objects": [ { "name": "Account", "fields": ["Name"], "limit": 10 }, { "name": "Contact", "fields": ["FirstName", "LastName", "Email"] } ] }

  2. Advanced search with filters: { "searchTerm": "Cloud*", "searchIn": "NAME FIELDS", "objects": [ { "name": "Account", "fields": ["Name", "Industry"], "orderBy": "Name DESC", "where": "Industry = 'Technology'" } ], "withClauses": [ { "type": "NETWORK", "value": "ALL NETWORKS" }, { "type": "SNIPPET", "fields": ["Description"] } ] }

Notes:

  • Use * and ? for wildcards in search terms

  • Each object can have its own WHERE, ORDER BY, and LIMIT clauses

  • Support for WITH clauses: DATA CATEGORY, DIVISION, METADATA, NETWORK, PRICEBOOKID, SNIPPET, SECURITY_ENFORCED

  • "updateable" and "viewable" options control record access filtering

Inputs: objects (required), searchTerm (required), searchIn, viewable, +2 more.

salesforce_search_objectsA
Read-only

Search for Salesforce standard and custom objects by name pattern. Examples: 'Account' will find Account, AccountHistory; 'Order' will find WorkOrder, ServiceOrder__c etc.

Inputs: searchPattern (required).

salesforce_write_apexA

Create or update Apex classes in Salesforce.

Examples:

  1. Create a new Apex class: { "operation": "create", "className": "AccountService", "apiVersion": "58.0", "body": "public class AccountService { public static void updateAccounts() { /* implementation */ } }" }

  2. Update an existing Apex class: { "operation": "update", "className": "AccountService", "body": "public class AccountService { public static void updateAccounts() { /* updated implementation */ } }" }

Notes:

  • The operation must be either 'create' or 'update'

  • For 'create' operations, className and body are required

  • For 'update' operations, className and body are required

  • apiVersion is optional for 'create' (defaults to the latest version)

  • The body must be valid Apex code

  • The className in the body must match the className parameter

  • Status information is returned after successful operations

Inputs: body (required), className (required), operation (required), apiVersion.

salesforce_write_apex_triggerA

Create or update Apex triggers in Salesforce.

Examples:

  1. Create a new Apex trigger: { "operation": "create", "triggerName": "AccountTrigger", "objectName": "Account", "apiVersion": "58.0", "body": "trigger AccountTrigger on Account (before insert, before update) { /* implementation */ }" }

  2. Update an existing Apex trigger: { "operation": "update", "triggerName": "AccountTrigger", "body": "trigger AccountTrigger on Account (before insert, before update, after update) { /* updated implementation */ }" }

Notes:

  • The operation must be either 'create' or 'update'

  • For 'create' operations, triggerName, objectName, and body are required

  • For 'update' operations, triggerName and body are required

  • apiVersion is optional for 'create' (defaults to the latest version)

  • The body must be valid Apex trigger code

  • The triggerName in the body must match the triggerName parameter

  • The objectName in the body must match the objectName parameter (for 'create')

  • Status information is returned after successful operations

Inputs: body (required), operation (required), triggerName (required), apiVersion, +1 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 15 tools

    Disambiguation4/5

    Most tools map to clearly distinct actions and resources, with explicit cross-references helping separate query_records from aggregate_query. Minor ambiguity exists between execute_anonymous and dml_records, and between search_objects and search_all, but descriptions largely clarify their different purposes.

    Naming Consistency4/5

    All tools consistently use the salesforce_ prefix and snake_case naming, following an action_target pattern such as read_apex_trigger or manage_field_permissions. A few names like dml_records and aggregate_query break the verb_noun pattern, and manage is somewhat generic, so it is not a perfect 5.

    Tool Count5/5

    At 15 tools, the server sits at the high end of the ideal range but each tool addresses a distinct Salesforce capability: querying, searching, DML, metadata management, Apex handling, and debug logs. The breadth is justified by the scope of the Salesforce platform.

    Completeness4/5

    The tool surface covers core record CRUD, SOQL/SOSL querying, object and field metadata discovery/manipulation, Apex class/trigger read/write, and debug log management. Minor gaps include no delete operation for custom objects, fields, Apex classes, or triggers, but most common workflows are well covered.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables natural language interactions with Salesforce data and metadata, supporting queries, data manipulation, custom object/field management, Apex code operations, and debug logging across multiple authentication methods.
      15
      2,670 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables natural language interactions with Salesforce, allowing users to query and modify data, manage custom objects and fields, execute Apex code, and perform SOQL/SOSL searches across Salesforce organizations.
      2,670 npm
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables natural language interactions with Salesforce data and metadata, allowing users to query records, manage custom objects, and manipulate Apex code. It provides comprehensive tools for schema exploration, aggregate queries, and field-level security management.
      15
      2,670 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables interaction with Salesforce orgs to perform operations like querying data with SOQL, managing records, and executing Apex code. It provides configurable access levels and support for both standard and Tooling APIs via natural language interfaces.
      11
      MIT