Skip to main content
Glama
hypn4

Salesforce MCP Server

by hypn4

Salesforce MCP Server

Release Container

A Model Context Protocol (MCP) server that provides Salesforce integration for AI agents with flexible OAuth authentication.

Features

  • Dual OAuth modes - Bearer token validation or full OAuth 2.1 proxy

  • 16 MCP tools across 4 categories for comprehensive Salesforce operations

  • Per-user Salesforce client caching - Efficient connection management

  • Dual transport modes - STDIO for local clients, HTTP for multi-user deployments

  • RFC-compliant OAuth - RFC 8414, RFC 9728, RFC 7591, PKCE support

  • Client OAuth flexibility - ADK agents, Claude Code, Gemini CLI all supported

Available Tools

Category

Tools

Query

salesforce_query, salesforce_query_all, salesforce_query_more, salesforce_search

Records

salesforce_get_record, salesforce_create_record, salesforce_update_record, salesforce_delete_record, salesforce_upsert_record

Metadata

salesforce_describe_object, salesforce_list_objects, salesforce_get_object_fields

Bulk API

salesforce_bulk_query, salesforce_bulk_insert, salesforce_bulk_update, salesforce_bulk_delete

Related MCP server: MCP Salesforce Lite

Prerequisites

Installation

uvx salesforce-mcp-server --transport stdio
# or for HTTP mode:
uvx salesforce-mcp-server --transport http

Option 2: Docker

docker pull ghcr.io/hypn4/salesforce-mcp-server

# HTTP mode (default)
docker run -p 8000:8000 \
  -e SALESFORCE_CLIENT_ID=your_client_id \
  -e SALESFORCE_LOGIN_URL=https://login.salesforce.com \
  ghcr.io/hypn4/salesforce-mcp-server

# STDIO mode
docker run -i \
  -e SALESFORCE_ACCESS_TOKEN=your_token \
  -e SALESFORCE_INSTANCE_URL=https://your-domain.my.salesforce.com \
  ghcr.io/hypn4/salesforce-mcp-server --transport stdio

Option 3: Pre-built Binary

Download from GitHub Releases:

Platform

Download

Linux (x64)

salesforce-mcp-server-linux-amd64.tar.gz

Linux (ARM64)

salesforce-mcp-server-linux-arm64.tar.gz

macOS (ARM64)

salesforce-mcp-server-darwin-arm64.tar.gz

Windows (x64)

salesforce-mcp-server-windows-amd64.zip

Verify checksum:

# Download checksums-sha256.txt from the release
sha256sum -c checksums-sha256.txt

Option 4: From Source

git clone https://github.com/hypn4/salesforce-mcp-server.git
cd salesforce-mcp-server
cp .env.example .env
# Edit .env with your Salesforce credentials
uv sync

Configuration

All configuration is done through environment variables. Copy .env.example to .env and adjust as needed.

OAuth Mode

Variable

Default

Description

OAUTH_MODE

bearer

bearer for client-handled OAuth, proxy for server OAuth proxy

Bearer Mode (Default)

Clients handle OAuth themselves. The server validates Bearer tokens via Salesforce userinfo endpoint.

Variable

Default

Description

SALESFORCE_INSTANCE_URL

https://login.salesforce.com

Token verification URL

Proxy Mode

Server acts as OAuth 2.1 + PKCE proxy to Salesforce. Provides RFC-compliant endpoints:

  • /.well-known/oauth-authorization-server (RFC 8414)

  • /.well-known/oauth-protected-resource (RFC 9728)

  • /register (RFC 7591 Dynamic Client Registration)

  • /authorize, /token, /auth/callback (OAuth 2.1 + PKCE)

Variable

Required

Description

SALESFORCE_CLIENT_ID

Yes

Salesforce Connected App client ID

SALESFORCE_CLIENT_SECRET

No

Client secret (optional, see modes below)

SALESFORCE_LOGIN_URL

No

Login URL (default: https://login.salesforce.com)

BASE_URL

No

Public URL of the server (default: http://localhost:8000)

OAUTH_REQUIRED_SCOPES

No

Comma-separated scopes (default: api,refresh_token)

Authentication Modes

Mode

SALESFORCE_CLIENT_SECRET

Use Case

Confidential Client

Set

Server-side apps where secret can be stored securely

PKCE-only (Public Client)

Empty/Unset

CLI tools, mobile apps, or when secret storage isn't possible

For PKCE-only mode, configure your Salesforce Connected App:

  • ✅ Enable "Require Proof Key for Code Exchange (PKCE)"

  • ❌ Disable "Require Secret for Web Server Flow"

Storage Configuration (Proxy Mode)

Variable

Default

Description

OAUTH_STORAGE_TYPE

memory

memory or redis

REDIS_URL

redis://localhost:6379

Redis connection URL

STORAGE_ENCRYPTION_KEY

-

Fernet key for token encryption

HTTP Server Settings

Variable

Default

Description

PORT

8000

HTTP server port (cloud platform standard)

FASTMCP_PORT

-

HTTP server port (fallback, for backwards compatibility)

Port Priority: PORTFASTMCP_PORT8000 (default)

Cloud platforms (Heroku, Cloud Run, Railway, etc.) automatically set the PORT environment variable.

Salesforce Instance

Variable

Default

Description

SALESFORCE_LOGIN_URL

https://login.salesforce.com

For sandbox use https://test.salesforce.com

SALESFORCE_INSTANCE_URL

https://login.salesforce.com

Token verification URL (userinfo endpoint)

Logging

Variable

Default

Description

LOG_LEVEL

INFO

DEBUG, INFO, WARNING, ERROR

MCP Integration Guide

Authentication Modes

This server supports two OAuth modes:

Bearer Token Mode (Default)

Standard MCP authentication pattern (like GitHub, Stripe MCP servers):

  • Server: Validates Bearer tokens via Salesforce userinfo endpoint

  • Clients: Handle OAuth authentication themselves

Client Type

OAuth Handling

ADK Agents

Use auth_scheme + auth_credential in McpToolset

Claude Desktop/Code/Gemini CLI

Static access token via environment variables (STDIO Mode)

OAuth Proxy Mode

Full OAuth 2.1 + PKCE proxy with RFC-compliant discovery:

  • Server: Handles complete OAuth flow with Salesforce

  • Clients: Use standard OAuth discovery (automatic with compatible clients)

Client Type

OAuth Handling

Claude Desktop

Native OAuth discovery (automatic)

Claude Code

Native OAuth discovery (automatic)

Gemini CLI

Native OAuth discovery (automatic)

ADK Agents

StreamableHTTPConnectionParams with Bearer token

To enable proxy mode:

export OAUTH_MODE=proxy
export SALESFORCE_CLIENT_ID=your_client_id
export BASE_URL=https://your-server.com

# Optional: Add client_secret for confidential client mode
# Omit for PKCE-only (public client) mode
export SALESFORCE_CLIENT_SECRET=your_client_secret

Transport Modes

Mode

Authentication

Use Case

STDIO

Access Token (env vars)

Local development, single-user

HTTP

Bearer Token (Authorization header)

Multi-user, web-based clients

STDIO Mode Environment Variables

Variable

Required

Description

SALESFORCE_ACCESS_TOKEN

Yes

Salesforce Access Token

SALESFORCE_INSTANCE_URL

Yes

Salesforce Instance URL (e.g., https://your-domain.my.salesforce.com)

SALESFORCE_USER_ID

No

User ID (default: env_user)

SALESFORCE_ORG_ID

No

Org ID (default: env_org)

SALESFORCE_USERNAME

No

Username (default: env_user)

Getting an Access Token for STDIO Mode

Use Salesforce CLI to get your Access Token:

sf org display --target-org <your-org-alias>

From the output, copy the Access Token and Instance Url values for your configuration.


Claude Desktop

Config file location:

  • macOS/Linux: ~/.config/claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

OAuth Proxy Mode (Recommended)

Native OAuth 2.1 + PKCE - no additional tools required.

  1. Configure the server for proxy mode:

export OAUTH_MODE=proxy
export SALESFORCE_CLIENT_ID=your_connected_app_client_id
export BASE_URL=http://localhost:8000
# Optional: SALESFORCE_CLIENT_SECRET for confidential client mode
  1. Start the server:

uvx salesforce-mcp-server --transport http
  1. Configure Claude Desktop:

{
  "mcpServers": {
    "salesforce": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Claude Desktop will automatically discover OAuth endpoints and initiate authentication when you first use a Salesforce tool.

STDIO Mode (Static Token)

{
  "mcpServers": {
    "salesforce": {
      "command": "uvx",
      "args": ["salesforce-mcp-server", "--transport", "stdio"],
      "env": {
        "SALESFORCE_ACCESS_TOKEN": "00D...",
        "SALESFORCE_INSTANCE_URL": "https://your-domain.my.salesforce.com"
      }
    }
  }
}

Claude Code

Config file location:

  • Global: ~/.claude/settings.json

  • Project: .mcp.json

OAuth Proxy Mode (Recommended)

Native OAuth 2.1 + PKCE - no additional tools required.

  1. Configure the server (see Configuration section above)

  2. Start the server:

uvx salesforce-mcp-server --transport http
  1. Add the MCP server:

claude mcp add salesforce --transport http http://localhost:8000/mcp

Or configure manually in ~/.claude/settings.json or .mcp.json:

{
  "mcpServers": {
    "salesforce": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Claude Code will automatically discover OAuth endpoints via RFC 8414 metadata.

STDIO Mode (Static Token)

{
  "mcpServers": {
    "salesforce": {
      "command": "uvx",
      "args": ["salesforce-mcp-server", "--transport", "stdio"],
      "env": {
        "SALESFORCE_ACCESS_TOKEN": "00D...",
        "SALESFORCE_INSTANCE_URL": "https://your-domain.my.salesforce.com"
      }
    }
  }
}

Gemini CLI

Config file: ~/.gemini/settings.json

OAuth Proxy Mode (Recommended)

Native OAuth discovery - Gemini CLI auto-discovers OAuth endpoints.

  1. Configure the server (see Configuration section above)

  2. Start the server:

uvx salesforce-mcp-server --transport http
  1. Add the MCP server:

gemini mcp add salesforce http://localhost:8000/mcp

Or configure manually in ~/.gemini/settings.json:

{
  "mcpServers": {
    "salesforce": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Gemini CLI will automatically discover OAuth endpoints and initiate authentication.

STDIO Mode (Static Token)

{
  "mcpServers": {
    "salesforce": {
      "command": "uvx",
      "args": ["salesforce-mcp-server", "--transport", "stdio"],
      "env": {
        "SALESFORCE_ACCESS_TOKEN": "00D...",
        "SALESFORCE_INSTANCE_URL": "https://your-domain.my.salesforce.com"
      }
    }
  }
}

Running Manually

STDIO Mode:

uvx salesforce-mcp-server --transport stdio
# or with local development:
just run

HTTP Mode:

uvx salesforce-mcp-server --transport http
# or with local development:
just run-http

HTTP mode default endpoint: http://localhost:8000

Salesforce Connected App Setup

  1. In Salesforce Setup, navigate to App Manager

  2. Click New Connected App

  3. Fill in basic information (name, contact email)

  4. Enable OAuth Settings

  5. Set Callback URL to match your deployment:

    • For local development: http://localhost:8000/auth/callback

    • For production: https://your-domain.com/auth/callback

  6. Select OAuth scopes:

    • api (Access and manage your data)

    • refresh_token (Perform requests at any time)

    • offline_access (Perform requests at any time)

  7. Enable Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows

  8. Save and copy the Consumer Key (this is your SALESFORCE_CLIENT_ID)

Development

Commands

Command

Description

just run

Run server in STDIO mode

just run-http

Run server in HTTP mode

just run-debug

Run with DEBUG logging

just test

Run tests

just test-cov

Run tests with coverage

just lint

Run linter

just lint-fix

Run linter with auto-fix

just fmt

Format code

just inspector

Run with MCP Inspector for debugging

just tools

List all registered MCP tools

just docker-build

Build Docker image

just docker-run

Run in Docker (HTTP mode)

just docker-run-stdio

Run in Docker (STDIO mode)

just build-binary

Build standalone binary

Project Structure

salesforce-mcp-server/
├── src/salesforce_mcp_server/
│   ├── server.py          # FastMCP server setup
│   ├── tools/             # MCP tool implementations
│   │   ├── query.py       # SOQL/SOSL query tools
│   │   ├── records.py     # Record CRUD tools
│   │   ├── metadata.py    # Metadata tools
│   │   └── bulk.py        # Bulk API tools
│   ├── oauth/             # OAuth authentication
│   │   ├── proxy.py           # OAuth 2.1 proxy for Salesforce
│   │   ├── token_verifier.py  # Salesforce token validation
│   │   ├── token_access.py    # Token access utilities
│   │   ├── storage.py         # Token storage backends
│   │   └── pkce.py            # PKCE utilities
│   └── salesforce/        # Salesforce client
├── tests/
├── .env.example
├── justfile
└── pyproject.toml

License

MIT

Available Tools

16 tools
salesforce_bulk_deleteA

Bulk delete multiple records.

Use this to delete many records efficiently.

Args: sobject: SObject type (e.g., 'Account', 'Contact') record_ids: List of record IDs to delete. Example: ["001xx000...", "001xx000..."]

Returns: List of results for each record with success status

ParametersJSON Schema
NameRequiredDescriptionDefault
sobjectYes
record_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It does disclose the destructive operation and mentions per-record success status in Returns. However, it does not warn about irreversibility, permission requirements, or partial-failure behavior, which would be valuable for a delete tool with no annotation safety signals.

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 short, structured with Args/Returns, and front-loads the core purpose. The first two sentences slightly overlap ('Bulk delete multiple records' vs 'delete many records efficiently'), but the second does add usage context, so the redundancy is minor.

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 simple two-parameter tool with an output schema, this is largely complete: both arguments are explained, an example is provided, and return intent is stated. It lacks caveats like bulk limits, permanence, or authorization, but these are not defining for this tool's basic invocation.

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?

Schema description coverage is 0%, so the description must compensate. It fully explains both parameters: sobject as SObject type with examples, and record_ids as a list of record IDs with a concrete example. This is enough for an agent to construct a valid call.

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 a specific action and target: 'Bulk delete multiple records.' The word 'bulk' differentiates it from salesforce_delete_record, but it does not explicitly name or contrast that sibling, so it stops short of a 5.

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 sentence 'Use this to delete many records efficiently' provides a clear use case: many records, with efficiency as the reason. However, it does not state when not to use it or explicitly point to alternatives like salesforce_delete_record for single records.

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

salesforce_bulk_insertA

Bulk insert multiple records.

Use this to create many records efficiently. The Bulk API processes records in batches and is optimized for high volumes.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead') records: List of records to insert. Each record is a dict of field name to value. Example: [{"Name": "Acme"}, {"Name": "Globex"}]

Returns: List of results for each record, containing: - success: Whether the insert succeeded - id: The new record ID (if successful) - errors: Any errors that occurred

ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYes
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it does well by disclosing that the Bulk API processes records in batches and returns per-record success, id, and errors. It does not mention rate limits, permissions, or asynchronous timing, but the core operation and result behavior are clearly communicated.

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 purpose sentence, one usage sentence, and organized Args/Returns sections. Every sentence adds value, and there is no unnecessary repetition or 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?

For a tool with two required parameters, no schema descriptions, and no annotations, the description provides sufficient detail to invoke it correctly and interpret results. Some additional context such as maximum batch size, object restrictions, or asynchronous behavior would be useful, but it is not essential for correct basic usage.

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?

The input schema provides no property descriptions (0% coverage), but the description fully compensates by explaining sobject with examples and defining records as a list of field-value dicts with a concrete example. This gives an agent everything needed to construct valid arguments.

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 starts with 'Bulk insert multiple records,' which names a specific action and resource. It also clarifies the scope by emphasizing multiple records and high volumes, distinguishing it from sibling tools like salesforce_create_record or bulk update/delete 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 explicitly says 'Use this to create many records efficiently' and states it is 'optimized for high volumes,' giving clear contextual guidance for when to use it. It does not explicitly name alternatives or provide exclusion criteria, which prevents a 5.

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

salesforce_bulk_queryA

Execute a bulk query for large data sets.

Use this for queries that may return more than 2,000 records. The Bulk API is optimized for large data volumes and runs asynchronously.

Args: sobject: SObject type being queried (e.g., 'Account', 'Contact') soql: SOQL query string

Returns: List of all matching records

ParametersJSON Schema
NameRequiredDescriptionDefault
soqlYes
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 behavioral disclosure burden. It does disclose that the Bulk API is asynchronous and optimized for large volumes, which are important traits. However, it does not explain what 'asynchronous' means for the caller—whether it returns a job ID, whether it polls to completion, or how results are delivered—and simply says 'Returns: List of all matching records,' which could be misleading if results are not returned synchronously.

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 compact and well organized: a one-line summary, a usage condition, an important behavioral note, and clearly labeled Args/Returns sections. Every sentence contributes useful information, and the key usage threshold is front-loaded.

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 two-parameter tool with an output schema available, the description covers the essential invocation details: what to pass, when to use it, and what to expect back. The main gap is the incomplete elaboration of asynchronous behavior and result retrieval, which is relevant for an agent deciding whether to call this versus a simpler tool.

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 description coverage is 0%, so the description must compensate for the bare input schema. It does so by defining 'sobject' with a concrete example ('Account', 'Contact') and 'soql' as a SOQL query string. This gives the agent enough meaning to invoke the tool correctly, though it could add more detail about SOQL expectations or validation.

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 executes a bulk query for large data sets, names the specific resource (Bulk API), and distinguishes it from the regular salesforce_query by the 2,000-record threshold. An agent can tell exactly what this tool does and how it differs from its siblings.

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 gives a concrete selection criterion: use this for queries that may return more than 2,000 records. This effectively tells the agent when to prefer this over the standard query tool. It does not explicitly name alternative tools or mention when not to use it, but the threshold provides clear contextual guidance.

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

salesforce_bulk_updateA

Bulk update multiple records.

Use this to update many records efficiently.

Args: sobject: SObject type (e.g., 'Account', 'Contact') records: List of records to update. Each record MUST include an 'Id' field to identify which record to update. Example: [ {"Id": "001xx...", "Industry": "Tech"}, {"Id": "001xx...", "Industry": "Finance"} ]

Returns: List of results for each record with success status

ParametersJSON Schema
NameRequiredDescriptionDefault
recordsYes
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/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 disclosure burden. It correctly emphasizes that each record must include an 'Id' and states that per-record success status is returned, but it does not explain partial-failure behavior, field replacement semantics, or permissions. Useful but incomplete.

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?

Front-loaded with the core purpose, followed by a usage hint and well-structured Args/Returns sections. The example is compact and functional, with no filler or redundant 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 two-parameter bulk mutation with an output schema, the description covers the essential invocation details: object type, record list, required 'Id', and return shape. It could be more complete by addressing all-or-nothing behavior or batch limits, but it is sufficient for a typical agent to call it correctly.

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?

Schema description coverage is 0%, but the description compensates thoroughly: 'sobject' is defined with examples, and 'records' is explained with the mandatory 'Id' requirement and a concrete JSON example. This adds critical meaning beyond the bare 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?

States a specific verb ('Bulk update') and resource ('multiple records'), and the name plus description clearly distinguish it from single-record update and bulk insert/delete siblings. The phrase 'many records' reinforces that this is the batch update variant.

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?

Explicitly says 'Use this to update many records efficiently', providing clear context for when to choose this tool. It does not name alternatives or state when not to use it, but the batch vs single-record distinction is unambiguous.

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

salesforce_create_recordA

Create a new Salesforce record.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead') data: Record field values as key-value pairs. Example: {"Name": "Acme Corp", "Industry": "Technology"}

Returns: Created record info including: - id: The new record's ID - success: Whether creation succeeded - errors: Any errors that occurred

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

There are no annotations, so the description must carry the behavioral transparency burden. It discloses the write effect and the return shape (id, success, errors), which is useful, but it does not mention permission requirements, validation behavior, or failure modes beyond a generic 'errors' field. Adequate but not rich.

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 well-organized into Args and Returns sections. Every line carries useful information, and the main purpose is stated first with no filler or repetition.

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 two-parameter creation tool with an output schema, the description covers the essential invocation details: object type, field data, and expected response. It could add context about required Salesforce fields or validation behavior, but the description is otherwise complete enough for an agent to call the tool 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 input schema provides only names and types with 0% description coverage, so the description must compensate. It explains that 'sobject' is an SObject type with examples and that 'data' is key-value field values with a concrete example, adding real meaning beyond the bare 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 opens with a clear, specific verb and resource: 'Create a new Salesforce record.' It names the primary parameters and gives example object types, making the tool's purpose obvious and distinguishing it from update, delete, query, and upsert siblings.

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

Usage Guidelines2/5

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

The description says what the tool does but gives no guidance about when to choose it over alternatives such as salesforce_upsert_record or salesforce_bulk_insert. There are no exclusions, prerequisites, or context about when create is preferable to upsert.

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

salesforce_delete_recordA

Delete a Salesforce record.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead') record_id: Salesforce record ID (18-character ID)

Returns: Deletion result with success status

ParametersJSON Schema
NameRequiredDescriptionDefault
sobjectYes
record_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/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 behavioral burden, but it only says deletion returns a success status. It does not disclose that deletion is typically irreversible, whether special permissions are needed, or what happens when the record does not exist. This is thin for a destructive operation.

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 compact and well structured with Args and Returns sections. It front-loads the purpose and contains no filler, repetition, or irrelevant detail.

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?

The two parameters are well described and an output schema exists, so basic invocation is covered. However, the definition omits important context for a delete tool: irreversibility, permission needs, and the distinction between this single-record delete and the sibling salesforce_bulk_delete. These gaps keep it from being fully 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 description coverage is 0%, so the description must add meaning, and it does: it defines 'sobject' as an SObject type with concrete examples and 'record_id' as an 18-character Salesforce ID. This goes well beyond the bare string types in the schema, though it could still add format constraints or valid object names.

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 'Delete a Salesforce record', a specific verb and resource that clearly distinguishes this from siblings like salesforce_create_record, salesforce_update_record, and salesforce_bulk_delete. The singular 'a record' further signals single-record deletion rather than bulk 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?

The phrase 'a Salesforce record' implies this tool is for deleting one record at a time, which provides some usage signal against the bulk sibling. However, it does not explicitly state when to prefer this over salesforce_bulk_delete or mention any preconditions, so the guidance remains implicit.

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

salesforce_describe_objectA

Get metadata for a Salesforce SObject.

Returns detailed information about an object including its fields, relationships, record types, and other metadata.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead', 'Opportunity')

Returns: Object metadata including: - name: API name of the object - label: Display name - fields: List of field definitions with type, length, required, etc. - childRelationships: Related objects - recordTypeInfos: Available record types - keyPrefix: Object ID prefix - And more...

ParametersJSON Schema
NameRequiredDescriptionDefault
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations present, the description carries the full burden. It clearly implies a read-only metadata operation and details the return structure, but it does not disclose potential errors, permission requirements, API limitations, or explicitly confirm that no data is modzed. This is adequate but not comprehensive.

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-organized with a concise summary, an Args section, and a structured Returns list. The only minor issue is slight redundancy between the opening summary and the Returns section, but overall every part is useful and front-loaded.

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 single-parameter tool with an output schema already present, the description properly covers the parameter and the expected return contents. It does not add sibling-tool routing guidance or error-case context, but the basic calling contract is complete.

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?

Schema coverage is 0%, so the parameter semantics must come from the description. The Args section fully defines 'sobject' as an SObject type and provides concrete examples ('Account', 'Contact', 'Lead', 'Opportunity'), leaving no ambiguity for the single required parameter.

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 opening sentence uses a clear verb and resource: 'Get metadata for a Salesforce SObject.' The list of returned components (fields, relationships, record types) makes it distinct from siblings like salesforce_list_objects and salesforce_get_object_fields, so an agent can immediately tell what it does.

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

Usage Guidelines2/5

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

The description explains what the tool does but gives no explicit guidance on when to choose it over alternatives such as get_object_fields, list_objects, or query. There are no 'use this when' or 'instead use' statements, so the agent must infer the intended placement among the many sibling tools.

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

salesforce_get_object_fieldsA

Get field information for a Salesforce SObject.

This is a convenience method that returns just the fields array from the describe call, which is often what's needed.

Args: sobject: SObject type (e.g., 'Account', 'Contact')

Returns: List of field definitions, each containing: - name: API name of the field - label: Display name - type: Field type (string, picklist, reference, etc.) - length: Maximum length for text fields - nillable: Whether the field can be null - createable: Whether the field can be set on create - updateable: Whether the field can be updated - picklistValues: For picklist fields, available values - referenceTo: For reference fields, related object(s)

ParametersJSON Schema
NameRequiredDescriptionDefault
sobjectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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 of behavioral disclosure. It clearly explains the method returns a list of field definitions rather than the full describe response, and it enumerates the included field properties. It does not explicitly state there are no side effects, but 'Get' and 'returns' strongly imply a read-only convenience operation.

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 front-loaded with the purpose and differentiator, followed by a concise Args section and a well-structured Returns section. Every line adds meaningful information; the return field list is detailedbut earned because it tells the agent exactly what to expect.

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 single-parameter read-only getter with an output schema, the description is complete. It covers the parameter semantics, the output structure, and the reason this tool exists relative to the fuller describe call. No critical information needed to invoke it correctly is missing.

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?

The schema only declares sobject as a string with no description, so the schema coverage is 0%. The description fully compensates by naming the parameter, explaining it is the SObject type, and providing examples like 'Account' and 'Contact'.

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 verb and resource: 'Get field information for a Salesforce SObject.' It further differentiates itself from the sibling salesforce_describe_object by noting it is a convenience method that returns only the fields array from the describe call.

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 useful when just the fields array is needed from the describe call, implying it should be used over a full describe operation. It does not explicitly name the sibling alternative or provide exclusion criteria, but the context is clear enough.

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

salesforce_get_recordA

Get a single Salesforce record by ID.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead') record_id: Salesforce record ID (18-character ID) fields: Optional list of specific fields to retrieve. If not provided, returns all accessible fields.

Returns: Record data with requested fields

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
sobjectYes
record_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/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 does add useful behavior details: fields is optional, and if omitted the tool returns all accessible fields. This helps the agent understand default behavior. However, it does not mention read-only guarantees, permission requirements, error behavior for invalid IDs, or handling of inaccessible fields, which would be valuable for a no-annotation 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 compact and well-structured. The one-line summary is front-loaded, followed by a clean Args section that maps directly to the parameters and a Returns section. Every sentence adds information; there is no filler or repetition.

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 relatively simple get-by-ID tool, the description covers the essential invocation surface: parameters, formats, optional behavior, and return content. The existing output schema likely covers the detailed response shape. The only notable gap is the absence of explicit guidance on when not to use this tool and what exception cases look like, but overall the description is sufficient for correct selection and invocation.

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?

The input schema provides only raw property names with no descriptions, so the description fully compensates. It explains that sobject is a Salesforce object type with concrete examples, record_id must be an 18-character Salesforce ID, and fields is an optional list with a clear default behavior. This is exactly the semantic enrichment the schema lacks.

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 a specific verb and resource: 'Get a single Salesforce record by ID.' It clearly identifies the operation, the object type, and the unique identifier, which distinguishes it from sibling tools like query or bulk operations that retrieve multiple records. The purpose is unambiguous and immediately actionable.

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 tool's intended use is implied clearly: when you have a specific SObject type and a Salesforce record ID and need one record. However, it does not explicitly say when to prefer this tool over alternatives like salesforce_query or salesforce_get_object_fields, and it offers no exclusions or caveats. The guidance is functional but not explicit enough for a 4.

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

salesforce_list_objectsA

List all available SObjects in the Salesforce org.

Returns a list of all objects accessible to the current user, including standard objects (Account, Contact, etc.) and custom objects.

Returns: List of object summaries, each containing: - name: API name - label: Display name - keyPrefix: Object ID prefix - custom: Whether it's a custom object - queryable: Whether SOQL queries are supported - createable: Whether records can be created - updateable: Whether records can be updated - deletable: Whether records can be deleted

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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 behavioral burden. It discloses that results are filtered by the current user's access, includes both standard and custom objects, and lists the returned capability flags such as queryable, createable, updateable, and deletable. It does not mention pagination or API limits, but for a zero-parameter listing tool the key behaviors are covered.

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 main purpose is front-loaded in the first sentence, and the follow-up sentences add meaningful detail about scope and return fields. There is minor redundancy between 'List all available SObjects' and 'Returns a list of all objects,' but the overall structure is clear and focused.

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 simplicity, zero parameters, and presence of an output schema, the description is largely complete. It explains what the output contains and the access-based filtering. It does not discuss large-org truncation or pagination, but this is a plausibly acceptable omission for a listing tool.

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 tool has zero parameters, so the input schema is already fully complete. The description does not need to explain parameter meaning. The baseline of 4 applies.

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 the tool's action and resource: 'List all available SObjects in the Salesforce org.' It is specific and conveys the scope (all objects accessible to the current user), but it does not explicitly differentiate itself from sibling tools like salesforce_describe_object or salesforce_get_object_fields.

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 gives clear context for when to use the tool: when you need an enumeration of available standard and custom objects accessible to the current user. It does not mention exclusions or explicitly compare with alternatives, but the 'list all' framing makes the primary use case unambiguous.

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

salesforce_queryA

Execute a SOQL query against Salesforce.

Args: soql: SOQL query string (e.g., "SELECT Id, Name FROM Account LIMIT 10") include_deleted: Include deleted and archived records (default: False)

Returns: Query results including: - totalSize: Total number of records matching the query - done: Whether all records have been returned - records: List of matching records - nextRecordsUrl: URL to fetch more records (if done is False)

ParametersJSON Schema
NameRequiredDescriptionDefault
soqlYes
include_deletedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It does this well by documenting the return structure, totalSize, done, records, and nextRecordsUrl, and by explaining include_deleted semantics and pagination state. It does not cover authentication, errors, or rate limits, but those are less critical for a read-only SOQL query 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 well-structured with a clear one-line purpose followed by Args and Returns sections. Every sentence adds useful information, and the key purpose is front-loaded. No filler or redundant 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 two-parameter query tool with an output schema, the description is largely complete: it covers both parameters and the return shape, including pagination hints. It could be more complete by explicitly directing the agent to salesforce_query_more when nextRecordsUrl is present, but the sibling list makes that inferable.

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 description coverage is 0%, so the description must compensate. It adequately documents soql with a concrete example and include_deleted with its default behavior. This adds meaning beyond the bare schema, though it could provide more detail on SOQL syntax constraints or response limits.

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 the tool executes a SOQL query against Salesforce, using a specific verb and resource. It distinguishes itself from search/CRUD/describe siblings, but it does not explicitly differentiate from salesforce_query_all or salesforce_bulk_query, which also run SOQL queries.

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 description implies this is the tool for running a SOQL query via the provided example. However, it gives no explicit guidance on when to choose this over salesforce_query_all, salesforce_bulk_query, or salesforce_query_more for pagination.

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

salesforce_query_allA

Execute a SOQL query including deleted and archived records.

This is equivalent to calling salesforce_query with include_deleted=True.

Args: soql: SOQL query string

Returns: Query results including deleted/archived records

ParametersJSON Schema
NameRequiredDescriptionDefault
soqlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/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 usefully explains that the query includes deleted and archived records, which is the main behavioral distinction. However, it does not explicitly confirm read-only semantics, mention rate limits or pagination, or describe how results behave beyond the return phrase. Given the absence of annotations, a bit more behavioral context would be valuable.

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 compact, front-loaded with the essential behavior, and avoids redundant filler. The Args/Returns structure makes the content scannable, and every sentence earns its place. The only slight repetition ('including deleted and archived records' twice) is minor and does not hurt clarity.

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?

This is a simple one-parameter tool and an output schema exists, so the description does not need to explain return types in depth. It provides the core behavior, the equivalent underlying call, and the parameter meaning. It could add explicit read-only confirmation or pagination behavior, but those are not critical for a basic SOQL query tool with this simplicity level.

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 0% and the only parameter is a bare string, so the description's 'soql: SOQL query string' adds real semantic meaning by identifying what the string should contain. It does not provide syntax examples or formatting guidance, but for a single self-explanatory SOQL parameter this is adequate, though not rich.

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 a specific action and resource: 'Execute a SOQL query including deleted and archived records.' This clearly differentiates the tool from the sibling salesforce_query while still identifying the core query behavior. An agent can immediately know what this tool does and how it differs from related query 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 explicitly states that this tool is equivalent to salesforce_query with include_deleted=True, which names the relevant alternative and the key condition for choosing this variant. It stops short of saying 'use this when you need deleted/archived records' in explicit terms, but the meaning is clear and actionable.

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

salesforce_query_moreA

Fetch additional records from a previous query.

Use this when a query returns done=False and provides a nextRecordsUrl.

Args: next_records_url: The nextRecordsUrl from a previous query response

Returns: Additional query results

ParametersJSON Schema
NameRequiredDescriptionDefault
next_records_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool fetches additional records and requires a nextRecordsUrl from a previous response, but it does not mention potential errors, token expiration, rate limits, or whether the response may still contain done=False. This is acceptable for a simple read operation but not rich.

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?

Compact and front-loaded with the purpose, followed by a clear usage condition and minimal argument documentation. Every line earns its place with no redundancy.

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 low-complexity tool with one parameter and an output schema, the description covers the invocation context well: purpose, trigger condition, and parameter origin. It does not explicitly instruct the caller to check done again for further pages, but the output schema likely contains that information.

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?

Schema description coverage is 0%, so the description must compensate. It fully explains the only parameter: next_records_url is 'The nextRecordsUrl from a previous query response,' providing essential source context beyond the bare string type 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?

States a specific verb and resource: 'Fetch additional records from a previous query.' This clearly distinguishes it from salesforce_query (which runs an initial query) and salesforce_query_all (which auto-fetches all pages).

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?

Provides a clear trigger condition: 'Use this when a query returns done=False and provides a nextRecordsUrl.' This gives unambiguous context for when to invoke the tool, though it does not explicitly name alternatives or exclusions.

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

salesforce_update_recordB

Update an existing Salesforce record.

Args: sobject: SObject type (e.g., 'Account', 'Contact', 'Lead') record_id: Salesforce record ID (18-character ID) data: Fields to update as key-value pairs. Example: {"Industry": "Finance", "Website": "https://acme.com"}

Returns: Update result with success status

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
sobjectYes
record_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/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 confirms that the operation mutates an existing record and vaguely mentions a 'success status', but it omits permissions, side effects, failure behavior, partial-update semantics, and irreversibility. It adds little beyond what the tool name already conveys.

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 opening line followed by Args and Returns sections. It avoids filler and includes a useful example for the data parameter. The Returns line is somewhat generic but not wasteful.

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?

All required parameters are documented and the return is mentioned, so a basic invocation is possible. However, with no annotations and fifteen sibling tools, the description omits important context such as what happens when the record does not exist, permission requirements, and how this tool relates to upsert or bulk alternatives.

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?

The input schema has 0% property descriptions, but the description fully documents all three parameters: sobject with concrete examples, record_id as an 18-character Salesforce ID, and data as a key-value map with a clear example. This completely compensates for the schema gap and adds practical meaning.

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 states a specific action ('Update') and resource ('existing Salesforce record'), making the core purpose clear. It does not explicitly differentiate from sibling tools like salesforce_upsert_record or salesforce_bulk_update, so it falls short of full sibling distinction.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as salesforce_upsert_record for create-or-update behavior or salesforce_bulk_update for multiple records. 'Update an existing Salesforce record' merely restates the tool's purpose and offers no exclusions or selection criteria.

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

salesforce_upsert_recordA

Upsert a record using an external ID field.

If a record with the external ID exists, it will be updated. Otherwise, a new record will be created.

Args: sobject: SObject type (e.g., 'Account', 'Contact') external_id_field: Name of the external ID field data: Record data including the external ID field value. Example: {"External_Id__c": "EXT-001", "Name": "Acme Corp"}

Returns: Upsert result with success status

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYes
sobjectYes
external_id_fieldYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden of disclosing behavior. It clearly indicates mutation through 'updated' and 'created', but it does not cover permission requirements, error behavior, or whether omitted data fields are preserved during an update. The return value is only vaguely described as 'success status'.

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 compact, front-loaded with the core behavior, and structured with clear Args and Returns sections. Every sentence earns its place without unnecessary filler.

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 no annotations, the description covers the essential invocation details: operation, conditional behavior, parameter meanings, an example, and return outcome. Minor gaps around permissions, error cases, and update semantics prevent full completeness.

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 description coverage is 0%, and the Args section compensates meaningfully with concrete examples and the requirement that data include the external ID field. It explains all three parameters, though external_id_field semantics could be slightly more detailed.

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 opening sentence specifies the action (upsert), the resource (record), and the mechanism (external ID field). The subsequent if/exists/otherwise-create explanation makes the operation unambiguous and clearly distinguishes it from salesforce_create_record and salesforce_update_record.

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 conditional behavior—update when the external ID exists, create otherwise—tells the agent exactly when this tool is appropriate. It does not explicitly name alternative tools or state when not to use upsert, so it stops 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.

Tool Schema Changelog

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

  1. 16 tool updatesv0.1.0
    • First observedsalesforce_bulk_delete
    • First observedsalesforce_bulk_insert
    • First observedsalesforce_bulk_query
    • First observedsalesforce_bulk_update
    • First observedsalesforce_create_record
    • First observedsalesforce_delete_record
    • First observedsalesforce_describe_object
    • First observedsalesforce_get_object_fields
    • First observedsalesforce_get_record
    • First observedsalesforce_list_objects
    • First observedsalesforce_query
    • First observedsalesforce_query_all
    • First observedsalesforce_query_more
    • First observedsalesforce_search
    • First observedsalesforce_update_record
    • First observedsalesforce_upsert_record

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Most tools have distinct, clearly described purposes: query vs. search vs. bulk vs. CRUD. However, salesforce_query_all redundantly duplicates salesforce_query with include_deleted=True, and salesforce_get_object_fields is a subset of salesforce_describe_object, creating minor overlap.

Naming Consistency4/5

The salesforce_ prefix and verb_noun structure are mostly consistent (create_record, update_record, delete_record, bulk_insert). A few names deviate from the strict verb_noun pattern, such as salesforce_query, salesforce_query_more, salesforce_query_all, and salesforce_search, but the overall convention is clear and predictable.

Tool Count4/5

With 16 tools, the set is slightly above the typical 3-15 range but is justified by the breadth of Salesforce operations covered. The redundant salesforce_query_all and the convenience-only salesforce_get_object_fields could be removed without losing capability.

Completeness4/5

The server covers the core Salesforce lifecycle well: SOQL/SOSL querying, single-record CRUD, upsert, metadata inspection, and bulk insert/update/delete. Notable minor gaps include no bulk upsert and no undelete/recycle-bin operation, but the main workflows are well supported.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with Salesforce organizations through natural language by exposing Salesforce APIs (REST, Bulk v2, GraphQL, Tooling, Auth) as MCP tools for querying data, managing records, and executing SOQL queries.
    8 npm
    19
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to securely interact with Salesforce CRM data through SOQL queries, CRUD operations, and metadata exploration. Supports connecting to Salesforce objects like Accounts, Contacts, and Opportunities via OAuth 2.0 authentication.
    8
    2
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Salesforce CRM by executing SOQL queries and performing CRUD operations on records such as Leads. It supports secure OAuth 2.0 authentication and provides management for both standard and custom Salesforce fields.
    -