Skip to main content
Glama
aaron-pienza

Salesforce MCP Server

by aaron-pienza

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
SALESFORCE_TOKENNoSalesforce security token (for User_Password authentication).
SALESFORCE_PASSWORDNoSalesforce password (for User_Password authentication).
SALESFORCE_USERNAMENoSalesforce username (for User_Password authentication).
SALESFORCE_CLIENT_IDNoOAuth 2.0 Client ID (for OAuth 2.0 authentication).
SALESFORCE_INSTANCE_URLNoSalesforce instance URL. Optional for User_Password (default https://login.salesforce.com), required for OAuth 2.0.
SALESFORCE_CLIENT_SECRETNoOAuth 2.0 Client Secret (for OAuth 2.0 authentication).
SALESFORCE_CONNECTION_TYPENoThe type of Salesforce connection: 'Salesforce_CLI', 'User_Password', or 'OAuth_2.0_Client_Credentials'.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{}
resources
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
salesforce_search_objectsA

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

salesforce_describe_objectA

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.

salesforce_query_recordsA

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.

Pagination: Results default to 200 records per page. Use limit and offset to page through results. Response includes total record count and next offset. Note: Pages are not snapshot-consistent — if data changes between requests, records may shift. For stable pagination, add a deterministic WHERE clause (e.g., WHERE CreatedDate < 2026-04-07T00:00:00Z ORDER BY Id).

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'"

  5. Paginate through results:

    • objectName: "Account"

    • fields: ["Name"]

    • limit: 50

    • offset: 100

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")

salesforce_aggregate_queryA

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

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

salesforce_manage_objectA

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

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

salesforce_manage_field_permissionsA

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

salesforce_search_allA

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

  • The updateable/viewable filters are reserved for future support and currently return a clear error if requested

salesforce_read_apexA

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)

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

salesforce_read_apex_triggerA

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)

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

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

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

salesforce_list_analyticsA

List available Salesforce reports or dashboards. Returns IDs, names, and metadata. Use this to find IDs before describing or running them with salesforce_describe_analytics or salesforce_run_analytics.

Examples:

  1. List recently viewed reports:

    • type: "report"

  2. Search reports by name:

    • type: "report"

    • searchTerm: "Pipeline"

  3. List recently viewed dashboards:

    • type: "dashboard"

  4. Search dashboards by name:

    • type: "dashboard"

    • searchTerm: "Executive"

salesforce_describe_analyticsA

Get detailed metadata for a Salesforce report or dashboard.

For reports: returns columns, groupings, filters, aggregates, date filter, and available filter operators. Use this to understand a report's structure before running it with salesforce_run_analytics.

For dashboards: returns component list (headers, visualization types, associated report IDs), filters, running user, and layout info.

Examples:

  1. Describe a report:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

  2. Describe a dashboard:

    • type: "dashboard"

    • resourceId: "01Zxx000000XXXXX"

salesforce_run_analyticsA

Execute a Salesforce report or retrieve current dashboard component data.

For reports: runs the report synchronously via the Analytics API. Supports optional runtime filter overrides, date filter overrides, and detail row inclusion. When includeDetails is true, defaults to returning 100 rows (override with topRows). The sync API has a hard maximum of 2,000 detail rows — a warning is included if results are truncated. Aggregates and grouping summaries are always returned in full.

For dashboards: retrieves each component's current data (aggregates, grouping summaries) without triggering a refresh. To refresh first, use salesforce_refresh_dashboard.

Examples:

  1. Run a report with saved defaults:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

  2. Run a report with detail rows:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

    • includeDetails: true

  3. Run a report with filter overrides:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

    • includeDetails: true

    • filters: [{ "column": "STAGE_NAME", "operator": "equals", "value": "Closed Won" }]

    • standardDateFilter: { "column": "CLOSE_DATE", "durationValue": "LAST_N_DAYS:90" }

  4. Run a report with row limit:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

    • includeDetails: true

    • topRows: { "rowLimit": 50, "direction": "Desc" }

  5. Run a report with multiple filters and boolean logic:

    • type: "report"

    • resourceId: "00Oxx000000XXXXX"

    • filters: [ { "column": "STAGE_NAME", "operator": "equals", "value": "Closed Won" }, { "column": "AMOUNT", "operator": "greaterThan", "value": "10000" } ]

    • booleanFilter: "1 AND 2"

  6. Get current dashboard component data:

    • type: "dashboard"

    • resourceId: "01Zxx000000XXXXX"

salesforce_refresh_dashboardA

Refresh a Salesforce dashboard or check its refresh status.

Examples:

  1. Trigger a dashboard refresh:

    • operation: "refresh"

    • dashboardId: "01Zxx000000XXXXX"

  2. Check refresh status:

    • operation: "status"

    • dashboardId: "01Zxx000000XXXXX"

Notes:

  • The "refresh" operation triggers a refresh and returns a status URL

  • The "status" operation returns per-component refresh status and data status

  • Use salesforce_run_analytics with type "dashboard" to retrieve the updated data after refresh completes

salesforce_rest_apiA

Make direct REST API calls to any Salesforce REST endpoint. This is a powerful passthrough tool that gives access to the full Salesforce REST API surface — including endpoints not covered by other tools.

Use this for any Salesforce REST API that doesn't have a dedicated tool, such as:

  • Reports and Dashboards API: GET /analytics/reports/{reportId}

  • Composite API: POST /composite

  • Files and ContentDocument: GET /sobjects/ContentDocument/{id}/VersionData

  • Approval Processes: POST /process/approvals

  • Limits and Usage: GET /limits

  • Tabs and Themes: GET /tabs, GET /theme

  • Quick Actions: GET /sobjects/{object}/quickActions

  • Any custom REST endpoint

The endpoint path is relative to /services/data/vXX.0/ (the API version prefix is added automatically).

Examples:

  1. Get org limits:

    • method: "GET"

    • endpoint: "/limits"

  2. Run a report:

    • method: "GET"

    • endpoint: "/analytics/reports/00O5e000004XXXXEAA"

  3. Composite request (multiple operations in one call):

    • method: "POST"

    • endpoint: "/composite"

    • body: { "allOrNone": true, "compositeRequest": [...] }

  4. Get file content:

    • method: "GET"

    • endpoint: "/sobjects/ContentVersion/068XXXXXXXXXXXXXXX/VersionData"

  5. Call a custom REST endpoint:

    • method: "GET"

    • endpoint: "/my-custom-endpoint"

    • rawPath: true

  6. Use a specific API version:

    • method: "GET"

    • endpoint: "/limits"

    • apiVersion: "59.0"

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription
Salesforce MCP Tools — Reference GuideComprehensive guide for using the Salesforce MCP tools: which tool to use for each task, known limitations, workarounds, and patterns that work reliably. Read this before working with Salesforce data.
Salesforce MCP Integration Setup GuideStep-by-step setup instructions for connecting Claude to Salesforce via the MCP server: Salesforce CLI installation, authentication, Claude Code and Claude Desktop configuration, troubleshooting, and security notes.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aaron-pienza/mcp-server-salesforce'

If you have feedback or need assistance with the MCP directory API, please join our Discord server