A Salesforce connector MCP Server that provides tools for querying, managing, and manipulating Salesforce data and metadata
Server has 15 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_, describe_, query_, manage_, execute_, read_, write_). Descriptions are detailed (100-400 chars) and include usage context. However, output schemas are not documented in the code, parameter descriptions lack constraint details (ranges, formats), and error handling guidance is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification. Composition is sound, tools are single-responsibility and chainable via IDs.
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. 🚨 CRITICAL DATE FIELD USAGE: - For NEW pipeline analysis: Use CreatedDate (when opportunities were added) - For CLOSING pipeline analysis: Use CloseDate (when opportunities are expected to close) - For "pipeline added this week" → CreatedDate = THIS_WEEK - For "deals closing this week" → CloseDate = THIS_WEEK 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
Output schemas not documented. Tools return results but LLMs cannot see field structure, forcing them to infer response shape. This breaks downstream tool chaining and wastes tokens on parsing.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Server clearly stratifies tools as READ_ONLY vs WRITE but does not expose this via MCP annotations, forcing LLMs to infer risk from descriptions alone.
Parameter constraints lack detail. 'limit' parameters have no min/max bounds; 'operation' enums are present but descriptions do not explain when to use each (insert vs upsert trade-offs). Numeric fields lack precision/scale guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
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.
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
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<Account> 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<Account> 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
Manage debug logs for Salesforce users - enable, disable, or retrieve logs. Examples: 1. Enable debug logs for a user: { "operation": "enable", "username": "[email protected]", "logLevel": "DEBUG", "expirationTime": 30 } 2. Disable debug logs for a user: { "operation": "disable", "username": "[email protected]" } 3. Retrieve debug logs for a user: { "operation": "retrieve", "username": "[email protected]", "limit": 5 } 4. Retrieve a specific log with full content: { "operation": "retrieve", "username": "[email protected]", "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
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
Manage field-level security permissions for Salesforce fields. Grant or revoke read/edit access to specific fields for user profiles.
Create new custom objects or modify existing custom objects in Salesforce. Supports setting object properties like label, plural label, description, and sharing model.
Execute SOQL queries to retrieve records from Salesforce objects. Supports filtering with WHERE clauses, ordering, and limiting results.
Read and retrieve Apex class source code from Salesforce. Useful for viewing existing Apex implementations, understanding custom logic, or auditing code.
Read and retrieve Apex trigger source code from Salesforce. Useful for viewing existing trigger implementations or auditing trigger logic.
Execute Salesforce SOSL (Salesforce Object Search Language) queries to search across multiple objects and fields simultaneously. Supports text search with filtering and field specifications.
Search for Salesforce objects by name or pattern. Returns matching object names and their labels.
Create or update Apex classes in Salesforce. Supports creating new classes or modifying existing ones with full source code control.
Create or update Apex triggers in Salesforce. Supports creating new triggers or modifying existing ones with full source code control.
Error handling lacks recovery guidance. Code throws generic errors ('objectName is required') but does not suggest next steps (e.g., 'Call salesforce_search_objects to find valid object names').
No dry-run or confirmation for destructive operations. Tools like salesforce_dml_records (delete) and salesforce_write_apex_trigger execute immediately without agent confirmation, risking accidental data loss.