Skip to main content
Glama
tsmztech

Salesforce MCP Server

by tsmztech

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of grouped results to return
orderByNoORDER BY clause - can only use grouped fields or aggregate functions
objectNameYesAPI name of the object to query
whereClauseNoWHERE clause to filter rows BEFORE grouping (cannot contain aggregate functions)
havingClauseNoHAVING clause to filter results AFTER grouping (use for aggregate conditions)
selectFieldsYesFields to select - mix of group fields and aggregates. Format: 'FieldName' or 'COUNT(Id) AliasName'
groupByFieldsYesFields to group by - must include all non-aggregate fields from selectFields

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses crucial behavioral constraints: non-aggregate fields must be in groupByFields, ORDER BY limitations, OFFSET not supported, and the distinction between WHERE (before grouping) and HAVING (after grouping). These details give the agent a thorough understanding of the tool's behavior, far exceeding what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear opening, differentiation note, numbered feature list, multiple examples, and an 'Important Rules' section. It is appropriately sized for the tool's complexity, with every sentence contributing essential information and no redundancy. The front-loaded summary immediately conveys the tool's purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, no output schema), the description is exceptionally complete. It covers the tool's function, usage context, parameter relationships, limitations, and provides concrete examples. It also clarifies the difference between this tool and salesforce_query_records, ensuring the agent can make informed decisions. The absence of an output schema is acceptable as return format is implied for a query tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers all parameters (100%), the description adds significant semantic value by explaining how parameters interact: selectFields format, the mandatory relationship between selectFields and groupByFields, whereClause vs. havingClause, and restrictions on orderBy. Multiple examples illustrate exact parameter usage, making the description highly informative beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it executes SOQL queries with GROUP BY, aggregate functions, and statistical analysis, using a specific verb ('Execute') and resource ('SOQL queries'). It explicitly distinguishes from the sibling tool salesforce_query_records by noting that regular queries without GROUP BY should use that alternative, making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Use this tool for queries that summarize and group data rather than returning individual records' and names the alternative tool for regular queries. It also includes examples for various scenarios, reinforcing when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
objectNameYesAPI name of the object (e.g., 'Account', 'Contact', 'Custom_Object__c')

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation is consistent with the non-destructive 'Get' description. The description adds useful context about the scope of metadata returned (all fields, relationships, field properties) beyond the annotation, though it does not detail error handling or special behaviors. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence followed by two illustrative examples. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only describe tool with one fully documented parameter and no output schema, the description adequately conveys the tool's capabilities and return scope. The examples clarify usage without unnecessary detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the objectName parameter fully described including examples. The description's examples (Account, Case) duplicate the schema info and provide no additional semantic depth, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function with a specific verb ('Get') and resource ('detailed schema metadata'), listing fields, relationships, and field properties. The examples ('Account', 'Case') reinforce the purpose and help distinguish it from query or management tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use this tool (when needing schema metadata). However, it does not explicitly mention alternatives or exclusions, though the context is unambiguous given sibling tools like salesforce_query_records. This merits a 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYesArray of records to process
operationYesType of DML operation to perform
objectNameYesAPI name of the object
externalIdFieldNoExternal ID field name for upsert operations

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It transparently discloses that update/delete require Id and upsert relies on an external ID field. It does not mention permissions or error scenarios, but the destructive nature is clear from 'Remove records'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise, well-structured bullet points with a clear opening sentence. Examples are helpful and no extraneous content exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a DML tool with no output schema, the description is fairly complete—it covers all operations, prerequisites, and examples. However, it does not describe the return value or response format, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters, but description adds meaningful context by explaining each operation's constraints (e.g., 'requires Id', 'based on external ID field'), going beyond the enumerated values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs data manipulation operations on Salesforce records, listing all supported operations (insert, update, delete, upsert) with brief explanations. It distinguishes itself from sibling tools like query/describe by focusing on write operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the operation list and examples (e.g., 'Insert new Accounts'), but there is no explicit guidance on when to use this tool versus read-only alternatives like salesforce_query_records. No exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
apexCodeYesApex code to execute anonymously
logLevelNoLog level for debug logs (optional, defaults to DEBUG)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively describes key behaviors: the code 'does not persist,' execution results include 'compilation success/failure, execution success/failure, and debug logs,' and 'some operations may be restricted based on user permissions.' However, it lacks details on rate limits, timeouts, or specific security restrictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, but includes lengthy examples and notes that could be streamlined. While informative, some sentences (e.g., repeating parameter details) don't earn their place given the comprehensive schema. The structure is clear but could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (executing arbitrary code) and lack of annotations and output schema, the description does a good job covering essential context: purpose, usage guidelines, behavioral traits, and parameter examples. However, it could better explain the output format (e.g., what 'execution results' include) since there's no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds minimal value beyond the schema, mainly through examples that illustrate parameter usage. It confirms apexCode is 'required' and logLevel 'defaults to DEBUG,' but these details are already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Execute anonymous Apex code in Salesforce.' It specifies the verb ('Execute'), resource ('anonymous Apex code'), and context ('in Salesforce'), distinguishing it from sibling tools like salesforce_query_records or salesforce_dml_records that handle specific operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: '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.' It also notes this is for operations 'when there are no other specific tools available,' helping differentiate from more specialized siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of logs to retrieve (optional, defaults to 10)
logIdNoID of a specific log to retrieve (optional)
logLevelNoLog level for debug logs (required for 'enable' operation)
usernameYesUsername of the Salesforce user
operationYesOperation to perform on debug logs
includeBodyNoWhether to include the full log content (optional, defaults to false)
expirationTimeNoMinutes until the debug log configuration expires (optional, defaults to 30)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and excels by adding rich context beyond what the input schema provides. It details validation ('validates that the specified user exists'), default behaviors (e.g., defaults for logLevel, expirationTime, limit, includeBody), and interactive aspects ('will ask for clarification' if logLevel unspecified), covering safety, side effects, and system interactions comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, detailed examples, and notes section, but it is somewhat lengthy due to extensive examples and notes. Every sentence earns its place by providing essential guidance, though it could be more front-loaded; the core purpose is stated first, but the depth of detail might overwhelm initial scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, multiple operations) and lack of annotations and output schema, the description is highly complete, covering operations, parameters, defaults, validation, and examples. However, it does not describe the return format or error handling, which are gaps for a tool with no output schema, slightly reducing completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema description coverage, the description adds significant value by explaining parameter semantics beyond the schema. It clarifies dependencies (e.g., 'username parameter is required for all operations'), optionality rules, default values, enum meanings ('Log levels: NONE, ERROR...'), and operational contexts through examples, making the tool much more usable than the schema alone would allow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose with specific verbs ('enable, disable, or retrieve logs') and resource ('debug logs for Salesforce users'), distinguishing it from sibling tools like salesforce_query_records or salesforce_dml_records that handle different Salesforce operations. The title is null, making the description's clarity even more critical, and it successfully communicates the exact functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (managing debug logs) but does not explicitly state when not to use it or name alternatives among sibling tools. The examples implicitly guide usage by showing different operations, but there's no direct comparison to other tools like salesforce_read_apex for log-related tasks, leaving some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoField type (required for create)
labelNoLabel for the field
scaleNoScale for numeric fields
lengthNoLength for text fields
uniqueNoWhether the field value must be unique
requiredNoWhether the field is required
fieldNameYesAPI name for the field (without __c suffix)
operationYesWhether to create new field or update existing
precisionNoPrecision for numeric fields
externalIdNoWhether the field is an external ID
objectNameYesAPI name of the object to add/modify the field
descriptionNoDescription of the field
referenceToNoAPI name of the object to reference (for Lookup/MasterDetail)
grantAccessToNoProfile names to grant field access to (defaults to ['System Administrator'])
picklistValuesNoValues for Picklist/MultiselectPicklist fields
deleteConstraintNoDelete constraint for Lookup fields
relationshipNameNoAPI name for the relationship (for Lookup/MasterDetail)
relationshipLabelNoLabel for the relationship (for Lookup/MasterDetail)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description must carry the burden. It discloses a key side effect – automatically granting FLS to System Administrator (or specified profiles) – and notes the default profile. However, it doesn't mention permissions required, reversibility, or failure modes, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with bullet points, front-loads the purpose, and includes examples. It's appropriately sized, though the note about grantAccessTo slightly duplicates schema info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation tool with no output schema, the description provides a good overview and examples but omits operational details like prerequisites, reversibility, or error handling. The 100% schema coverage helps, but behavioral context is only partially covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds minimal param semantics beyond the schema: it groups field types/properties and gives an example, but does not explain parameter values in more depth than the schema already does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create new custom fields or modify existing fields on any Salesforce object' – a specific verb+resource. It distinguishes from siblings like salesforce_manage_object (objects) and salesforce_manage_field_permissions (FLS), and lists supported field types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Context is clear: it's for creating/updating fields, with examples. However, it doesn't explicitly say when not to use it or name alternatives such as salesforce_manage_field_permissions, so it misses the top tier.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
editableNoGrant/revoke edit access (default: true)
readableNoGrant/revoke read access (default: true)
fieldNameYesAPI name of the field (e.g., 'Custom_Field__c')
operationYesOperation to perform on field permissions
objectNameYesAPI name of the object (e.g., 'Account', 'Custom_Object__c')
profileNamesNoNames of profiles to grant/revoke access (e.g., ['System Administrator', 'Sales User'])

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It states that the tool can grant/revoke/view permissions, but it does not mention prerequisites (e.g., administrative rights), potential side effects (e.g., changes to field security are immediate), reversibility, or what happens when both readable and editable are false. The description also does not clarify whether the tool is read-only for the 'view' operation. This is a significant gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear introductory line, bullets, and numbered examples. It is slightly verbose but every part adds information, such as the examples demonstrating realistic use cases. The format makes it easy to scan and understand the tool's capabilities without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 6 parameters and no output schema or annotations, so the description should explain return values and parameter behavior more thoroughly. It does not describe what the tool returns (e.g., success/failure, updated permissions), nor does it explain how operation interacts with readable/editable or profileNames for different operations. The examples cover basic scenarios but leave gaps for edge cases like bulk updates or viewing permissions without specific profiles. Overall, the description is not complete enough for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage, so the baseline is 3. The description adds value by mapping grant/revoke to readable/editable and providing examples like 'read-only access' (editable=false, readable=true). However, it introduces a discrepancy by mentioning 'permission sets' while the schema only provides profileNames, which could mislead users. The description does not fully clarify parameter combinations for operations like 'view' (e.g., whether profileNames is optional).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose: managing Field Level Security (Field Permissions) for custom and standard fields. It lists specific operations (grant, revoke, view) and distinguishes from sibling tools like salesforce_manage_field by focusing on permissions rather than field definitions. Examples further clarify the scope and usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context through bullets and examples, such as granting System Administrator access, giving read-only access, and checking profile access. It implies when to use the tool (for permission changes) but does not explicitly exclude alternatives or mention when not to use it. No alternative tools are referenced, so it lacks explicit differentiation but still offers clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoLabel for the object
operationYesWhether to create new object or update existing
objectNameYesAPI name for the object (without __c suffix)
descriptionNoDescription of the object
pluralLabelNoPlural label for the object
sharingModelNoSharing model for the object
nameFieldTypeNoType of the name field
nameFieldLabelNoLabel for the name field
nameFieldFormatNoDisplay format for AutoNumber field (e.g., 'A-{0000}')

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden for behavioral disclosure. It mentions that changes affect metadata and require proper permissions, which is useful. However, it does not describe potential side effects, reversibility, or return values, which is a gap for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, using bullets and examples to convey the key operations efficiently. Every sentence adds value, and the note about permissions is a relevant inclusion. It is well-structured without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, 3 enums, no output schema), the description is adequate but incomplete. It does not specify which parameters apply to create vs. update, nor does it explain conditional dependencies or return value. The schema covers parameter descriptions, but the overall operational context could be richer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add meaningful parameter-level detail beyond what the schema already provides; it only mentions fields/relationships/settings at a high level. No parameter syntax or conditional guidance is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates or updates custom objects in Salesforce, with distinct sub-actions (Create/Update) and examples. This distinguishes it from siblings like salesforce_manage_field (fields) and salesforce_dml_records (records).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for using the tool on objects and gives examples, but it does not explicitly state when to prefer this over sibling tools like salesforce_manage_field. The note about metadata changes implies the appropriate use case, but exclusions are not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return
fieldsYesList of fields to retrieve, including relationship fields
orderByNoORDER BY clause, can include fields from related objects
objectNameYesAPI name of the object to query
whereClauseNoWHERE clause, can include conditions on related objects

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true annotation, the safety profile is already known. The description adds valuable context about relationship field syntax (dot notation, subqueries, custom relationship fields ending in __r), which is not in the schema or annotations. It doesn't disclose pagination or return format, but the annotation lowers the bar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but perfectly structured with a clear purpose, a note for alternative tool, and well-organized examples. Every sentence adds value, and the examples are essential for explaining relationship queries. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of relationship queries and the absence of an output schema, the description covers the main usage patterns thoroughly. It lacks explicit mention of return format or pagination behavior, but the examples and parameter description provide sufficient context for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description significantly enriches parameter understanding through examples showing how to use fields for parent/child relationships, whereClause for related object filtering, and orderBy with related fields. This is crucial beyond the schema's brief descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool queries records from any Salesforce object using SOQL, including relationship queries. It distinguishes itself from the sibling tool salesforce_aggregate_query by explicitly directing aggregate queries elsewhere, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use salesforce_aggregate_query for queries with GROUP BY, aggregate functions, or HAVING clauses, providing a clear alternative. The examples also demonstrate when to use relationship queries, giving practical usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
classNameNoName of a specific Apex class to read
namePatternNoPattern to match Apex class names (supports wildcards * and ?)
includeMetadataNoWhether to include metadata about the Apex classes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint annotation by explaining exactly what is returned in each mode: full body with className, only names with namePattern, and additional metadata with includeMetadata. It also discloses the default behavior when neither parameter is provided and documents wildcard support, providing rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear summary but then expands into 4 examples and 5 notes. While each point adds information, the length is excessive for a 3-parameter read tool. Some examples are redundant (e.g., example 3 is similar to example 2 with metadata), making it less concise than it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with no output schema, the description covers the main return behaviors (full body, names, metadata) and default listing. It is missing edge-case context like conflicting parameters or not-found behavior, but given the tool's simplicity and the presence of annotations, it is mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions are present for all parameters (100% coverage), so baseline is 3. The description adds value by showing concrete examples of valid input combinations, clarifying the effect of includeMetadata, and explaining wildcards in namePattern. However, it does not describe the behavior when both className and namePattern are provided, which is a slight gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Read Apex classes from Salesforce' and provides examples of reading a specific class, listing classes by pattern, and fetching metadata. It distinguishes from write operations and from other read tools by focusing on Apex classes, though it doesn't explicitly differentiate from the sibling salesforce_read_apex_trigger.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples and notes imply when to use each parameter (className for full body, namePattern for listing, includeMetadata for metadata), but there is no explicit guidance on when to choose this tool over alternatives like read_apex_trigger or describe_object. Usage is implied rather than explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
namePatternNoPattern to match Apex trigger names (supports wildcards * and ?)
triggerNameNoName of a specific Apex trigger to read
includeMetadataNoWhether to include metadata about the Apex triggers

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already providing safety, the description adds valuable behavioral detail: that triggerName returns the full body, namePattern returns only names, includeMetadata toggles metadata, and wildcards are supported. This goes beyond what annotations disclose and helps the agent predict the output for different input combinations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a one-sentence purpose, four clear examples, and a bulleted list of notes. Every sentence serves the goal of explaining the tool's behavior, and the length is appropriate for the tool's complexity. It front-loads the main verb and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description adequately explains what the tool returns for each input scenario. It covers all three parameters and their combinations, which is sufficient for a read-only tool. It could mention error handling or permission requirements, but these are not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes each parameter (100% coverage), but the description enriches their meaning by explaining the consequences of using them together, such as the fallback when neither triggerName nor namePattern is provided and the effect of includeMetadata. This extra explanation adds clear value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with 'Read Apex triggers from Salesforce', which is a specific verb+resource statement. The examples and notes clarify the exact scope (Apex triggers, not classes or other objects) and the behavior, distinguishing it from sibling tools like salesforce_read_apex (for classes) and salesforce_write_apex_trigger (for writing triggers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on when to use triggerName vs namePattern vs includeMetadata, including the fallback behavior when neither is provided. It does not explicitly name alternative tools, but the purpose statement itself is sufficient to imply this is the tool for reading triggers rather than other Salesforce objects.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
objectsYesList of objects to search and their return fields
searchInNoWhich fields to search in
viewableNoReturn only viewable records
searchTermYesText to search for (supports wildcards * and ?)
updateableNoReturn only updateable records
withClausesNoAdditional WITH clauses for the search

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the readOnlyHint annotation by explaining wildcard usage (* and ?), per-object independent WHERE/ORDER BY/LIMIT clauses, and supported WITH clause types. It provides concrete examples of advanced search configurations, adding useful behavioral context without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with two examples and bullet-point notes, making it easy to scan. It is lengthy but each section earns its place given the tool's complexity, though a brief output format note could improve efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly explains input construction and supported features, covering all parameters with real examples. However, since there is no output schema, a description of the response structure would enhance completeness; this omission prevents a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema descriptions cover 100% of parameters, so baseline is 3. The description adds value by showing how parameters combine in real examples, such as using searchIn, withClauses, and object-level properties together, which the schema alone does not convey clearly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search across multiple Salesforce objects using SOSL (Salesforce Object Search Language)', which identifies the specific verb, resource, and method. It distinguishes from sibling tools like salesforce_query_records by specifying SOSL and 'across multiple objects', making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool through its focus on SOSL cross-object search, providing clear context for selecting it over SOQL-based siblings. However, it does not explicitly state when not to use it or name alternative tools, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchPatternYesSearch pattern to find objects (e.g., 'Account Coverage' will find objects like 'AccountCoverage__c')

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavior beyond the readOnlyHint annotation: it explains the fuzzy/pattern matching behavior with examples ('Account' finds AccountHistory). This gives the agent expectations about partial matches. There is no contradiction with the readOnlyHint, and the description appropriately discloses the search semantics, though it does not detail output format or case sensitivity—still acceptable given the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences and front-loaded with the core purpose. The examples are concise and immediately demonstrate behavior. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter search tool with no output schema, the description is fully sufficient. It states what the tool searches, how the pattern works, and provides representative examples. No additional context is needed for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes searchPattern with 100% coverage, so the baseline is 3. The description adds valuable examples and clarifies the pattern-matching semantics (e.g., 'Order' finds WorkOrder, ServiceOrder__c), which goes beyond the schema's generic description. This earns a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Search' and resource 'Salesforce standard and custom objects' with a specific scope ('by name pattern'). It also distinguishes itself from sibling search tools like salesforce_search_all by focusing specifically on object metadata, and the examples reinforce this purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this is for finding objects by name pattern, which gives clear context for when to use it (e.g., before describing or querying an object) but does not explicitly state exclusions or alternatives. However, the examples and the tool's specificity provide enough implicit guidance; a brief note on when NOT to use it (e.g., for searching records) would be an improvement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesFull body of the Apex class
classNameYesName of the Apex class to create or update
operationYesWhether to create a new class or update an existing one
apiVersionNoAPI version for the Apex class (e.g., '58.0')

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses that 'Status information is returned after successful operations' and includes important behavioral constraints like 'The body must be valid Apex code' and 'The className in the body must match the className parameter.' However, it doesn't mention authentication requirements, error handling, or whether operations are reversible/destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (purpose, examples, notes). Every sentence adds value, though the examples could be more concise. The purpose statement is front-loaded, and the notes section efficiently covers important constraints without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write operation with no annotations and no output schema, the description provides adequate but incomplete context. It covers the main operations and constraints but lacks information about authentication, error responses, rate limits, or what 'Status information' specifically includes. Given the complexity of writing Apex code in Salesforce, more behavioral context would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds some value through examples showing how parameters combine in different operations and clarifying that apiVersion is optional for create operations with a default. However, it doesn't significantly enhance understanding beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create or update Apex classes in Salesforce' - a specific verb (create/update) with a specific resource (Apex classes) and platform (Salesforce). It distinguishes from siblings like salesforce_read_apex (read vs write) and salesforce_write_apex_trigger (classes vs triggers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context through examples showing when to use create vs update operations. It doesn't explicitly state when NOT to use this tool or mention alternatives like salesforce_execute_anonymous for one-off code execution, but the examples provide practical guidance for the two main use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesFull body of the Apex trigger
operationYesWhether to create a new trigger or update an existing one
apiVersionNoAPI version for the Apex trigger (e.g., '58.0')
objectNameNoName of the Salesforce object the trigger is for (required for 'create')
triggerNameYesName of the Apex trigger to create or update

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively communicates that this is a write/mutation tool ('Create or update'), specifies validation requirements (valid Apex code, parameter matching), mentions default behavior (apiVersion defaults to latest), and indicates what happens after operations (status information returned). It doesn't cover permissions, rate limits, or error handling, but provides substantial operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by practical examples and important notes. Every sentence serves a clear purpose: the opening statement defines the tool, examples demonstrate usage, and notes clarify constraints. There's no redundant or unnecessary content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write/mutation tool with 5 parameters, 100% schema coverage, but no annotations or output schema, the description provides strong context. It covers the tool's purpose, usage patterns, parameter requirements, and behavioral expectations. The main gap is the lack of output details (only mentioning 'status information' without specifics), but given the complexity and schema richness, it's mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the schema already documents all parameters well. The description adds some value through examples showing parameter usage patterns and notes about required/optional fields for different operations, but doesn't provide significant semantic information beyond what's in the schema descriptions. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create or update Apex triggers in Salesforce.' It specifies the exact action (create/update) and resource (Apex triggers), and distinguishes it from sibling tools like salesforce_write_apex (for general Apex code) and salesforce_read_apex_trigger (for reading triggers).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool through examples and notes, explaining the required parameters for 'create' vs 'update' operations. However, it doesn't explicitly state when NOT to use it or mention alternatives like salesforce_write_apex for non-trigger Apex code, though the distinction is implied by the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a clearly distinct resource/action pair. Query vs. aggregate query are explicitly disambiguated via cross-references; search objects (metadata) vs. search all (records) are differentiated; Apex class and trigger tools are separate. No genuine overlap.

Naming Consistency5/5

All tools consistently use the 'salesforce_' prefix followed by snake_case names with verb-like prefixes (describe, query, search, manage, read, write, execute). Minor deviations like 'aggregate_query' and 'execute_anonymous' still fit the overall predictable pattern.

Tool Count5/5

15 tools is at the upper end of the ideal range, but each tool earns its place by covering distinct Salesforce workflows: data querying, DML, metadata management, Apex code, and debug logs. No redundancy or bloat.

Completeness4/5

The tool set provides solid lifecycle coverage: record CRUD via dml_records, query and aggregate query, SOSL search, object/field metadata management, Apex class/trigger read/write, and anonymous execution. The main gap is lack of explicit delete operations for metadata (objects, fields, Apex classes/triggers), but execute_anonymous can act as a workaround in some cases.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/tsmztech/mcp-server-salesforce'

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