Skip to main content
Glama
semwalajay83-sem

salesforce-metadata-mcp

salesforce-metadata-mcp

npm version npm downloads License: MIT MCP Compatible

The only Salesforce MCP server that builds Agentforce agents, OmniStudio components, and DevOps Center pipelines — alongside a complete daily developer loop (schema describe, Apex read, debug logs) and 228 tools total for building, configuring, and automating Salesforce orgs directly from Claude or any MCP client.


Quick Start

npx -y salesforce-metadata-mcp

Or install globally:

npm install -g salesforce-metadata-mcp
salesforce-metadata-mcp

Related MCP server: salesforce-mcp

Configuration (Claude Desktop / Claude Code)

Add to your MCP configuration (claude_desktop_config.json or .claude/settings.json):

{
  "mcpServers": {
    "salesforce": {
      "command": "npx",
      "args": ["salesforce-metadata-mcp"],
      "env": {
        "SF_INSTANCE_URL": "https://your-org.salesforce.com",
        "SF_ACCESS_TOKEN": "your_access_token"
      }
    }
  }
}

See SETUP.md for all authentication methods and detailed setup instructions.

One-click install (Claude Desktop)

Download salesforce-metadata-mcp-<version>.mcpb from the latest release, then drag it into Claude Desktop → Settings → Extensions. It prompts for your org URL and credentials — no JSON editing.

The bundle resolves the server from npm at launch rather than embedding a copy, so it always runs the current published version and never needs re-downloading after an upgrade.

Docker

docker build -t salesforce-metadata-mcp .
docker run -i --rm \
  -e SF_INSTANCE_URL="https://your-org.my.salesforce.com" \
  -e SF_ACCESS_TOKEN="your_access_token" \
  salesforce-metadata-mcp

The image builds from source, runs as a non-root user, and ships production dependencies only. Because this server speaks MCP over stdio, -i is required — the container is driven by its client, not run as a background service. SF_ALIAS will not work in a container: the Salesforce CLI's login flow needs a browser, so use token, JWT, refresh-token, or client-credentials variables instead.


Toolsets — loading 228 tools without burning your context

All 228 tools are always available. Most are not loaded into the model's context until something asks for them.

Listing every tool up front costs roughly 98,000 tokens — about half a 200k context window, spent before you type anything, whether or not the session ever touches OmniStudio or DevOps Center. A 228-candidate tool list also makes the model measurably worse at picking the right tool. So the server starts with a small core loaded and pulls in the rest on demand:

Startup

Tools listed

Approx. tokens

Default (core,metadata)

20

~9,900

After loading two more toolsets

43

~20,800

SF_TOOLSETS=all

233

~99,100

The default covers what nearly every session needs: describe/list objects, SOQL query, deploy/retrieve/delete metadata, deploy status, and core schema creation (objects, fields, formula fields, picklist values, validation rules, approval processes).

Five tools are always present and make everything else reachable:

  • sf_find_tool — search all 228 tools by name and load whatever contains the matches, in one call. Ask for "create an omniscript" and it finds the tools, loads omnistudio, and they are callable immediately. This is usually all you or the model needs.

  • sf_load_toolset — load named toolsets explicitly.

  • sf_list_toolsets — browse all toolsets, their tool counts, and what is loaded.

  • sf_call_tool — invoke any tool by name, loaded or not, without it having to appear in the tool list first. Arguments are validated and the production guard applies exactly as on a direct call.

  • sf_tool_schema — return any tool's input schema, so sf_call_tool can be constructed for a tool the client cannot see.

In practice you don't manage this by hand: ask for what you want, and the model loads what it needs.

If loaded tools don't show up

Loading a toolset enables it on the server and emits notifications/tools/list_changed. A client is supposed to re-fetch tools/list when it sees that. Some clients don't — and when that happens, the load reports success, the tools really are enabled, and the model still cannot call any of them because they never entered its tool list.

Two things handle this, so no client can lose access to a tool:

  • sf_load_toolset checks whether the client re-fetched and says so in its response, instead of reporting an unqualified success for tools that have become unreachable.

  • sf_call_tool reaches every tool without needing a re-fetch at all. Combined with sf_tool_schema, the full 228-tool surface is usable from the handshake tool list alone — even under SF_TOOLSETS=none.

To restore the previous behaviour of loading everything at startup, set SF_TOOLSETS=all. To start with only the five meta-tools, set SF_TOOLSETS=none. To pick your own core, pass a list:

{ "env": { "SF_TOOLSETS": "metadata,objects,automation,security" } }

Available toolsets: core, metadata, objects, data, flows, automation, security, apex, lwc, ui, pages, actions, agentforce, omnistudio, omnichannel, devops, deployment, integrations, identity, reports, experience, admin, monitoring, audit, einstein, knowledge, cpq, sandbox, streaming, visualforce, aura, comms, mcp, i18n.

Flow tools live in their own flows toolset because sf_create_flow carries the full Flow element schema — 15,266 bytes (~4,126 tokens) on its own, the largest tool definition in the server. Keeping it out of the default means sessions that never build a Flow never pay for it, while sessions that do still get the complete validated schema.


Tools — 228 total

Highlights below; see TOOLS.md for the complete reference with parameters and example prompts.

Objects & Fields

Tool

Description

sf_create_custom_object

Create a custom object with all settings

sf_create_custom_field

Create a field on any object (all types)

sf_create_formula_field

Create formula fields with full formula language support

sf_add_picklist_values

Add values to existing picklist fields

sf_create_custom_metadata_type

Create a Custom Metadata Type (__mdt)

sf_create_custom_metadata_record

Create records for a Custom Metadata Type

sf_create_custom_label

Create or update Custom Labels

sf_create_custom_setting

Create Hierarchy or List Custom Settings

sf_create_global_value_set

Create shared picklist usable across objects

sf_create_record_type

Create Record Types with picklist overrides

sf_create_business_process

Create Business Processes for Opp/Lead/Case

sf_create_page_layout

Create Page Layouts with sections and fields

sf_create_sharing_rule

Create criteria or ownership sharing rules

sf_create_field_dependency

Create controlling/dependent picklist dependency

sf_describe_object

Read an object's full schema — fields, types, picklist values, child relationships, record types

sf_list_objects

Find objects by partial name or label — the discovery step before sf_describe_object

sf_get_metadata_dependencies

Impact analysis: what references this component, and does the field hold data? Read-only

sf_update_custom_object

Update object-level properties, risk-classified with a confirmation gate

sf_update_custom_field

Update a field's definition, risk-classified — destructive changes report impact before applying

Automation

Tool

Description

sf_create_flow

Create any Flow type — Assignment, Decision, GetRecords, CreateRecords (with field values), DeleteRecords, Loop

sf_create_approval_process

Create multi-step approval processes

sf_create_validation_rule

Create data validation rules

sf_create_workflow_field_update

Create workflow field update actions

sf_create_email_alert

Create workflow email alert actions

sf_create_platform_event

Create Platform Event objects

sf_create_assignment_rule

Create Lead/Case assignment rules

sf_create_escalation_rule

Create Case escalation rules

sf_create_auto_response_rule

Create Web-to-Lead/Case auto-response rules

sf_create_matching_rule

Create duplicate matching rules

sf_create_duplicate_rule

Create duplicate detection rules

sf_create_apex_email_service

Create inbound Apex email services

sf_create_scheduled_job

Schedule an Apex class via cron

Security & Access

Tool

Description

sf_create_permission_set

Create Permission Sets with all permissions

sf_create_role

Create roles in the role hierarchy

sf_create_queue

Create queues with members and objects

sf_create_named_credential

Create Named Credentials for callouts

sf_get_field_permissions

Audit current field-level security grants across Profiles and Permission Sets

UI & Experience

Tool

Description

sf_create_lightning_app

Create Lightning Apps with nav/utility bars

sf_create_tab

Create Custom Tabs for objects

sf_create_compact_layout

Create Compact Layouts (highlights panel)

sf_create_list_view

Create List Views with filters and columns

sf_create_email_template

Create HTML/text email templates

sf_create_static_resource

Create Static Resources from text content

sf_create_custom_notification_type

Create Custom Notification Types

sf_create_report_type

Create Custom Report Types

sf_create_dashboard

Create Dashboards with components

Apex Development

Tool

Description

sf_create_apex_class

Deploy any Apex class to the org

sf_create_apex_trigger

Deploy an Apex trigger on any object

sf_create_apex_test_class

Deploy test classes, optionally run tests

sf_run_apex_tests

Run test classes and get pass/fail results

sf_execute_anonymous_apex

Execute anonymous Apex and see output

sf_get_apex_class

Read the source of an existing Apex class

sf_get_apex_trigger

Read the source of an existing Apex trigger

sf_enable_debug_logs

Turn on Apex debug logging for a user (TraceFlag)

sf_disable_debug_logs

Turn Apex debug logging back off (deletes active TraceFlags)

sf_get_debug_logs

List recent Apex debug logs

sf_get_debug_log_body

Read the full content of a debug log

sf_scan_apex_antipatterns

Lightweight heuristic scan for SOQL/DML-in-loop, hardcoded IDs, debug statements

sf_run_code_scanner

Multi-engine static analysis (PMD, SFGE SOQL-injection data-flow, RetireJS, ESLint) via Salesforce Code Analyzer

LWC Development

Tool

Description

sf_create_lwc

Deploy a full LWC with HTML, JS, CSS

sf_update_lwc

Update an existing LWC component

Experience Cloud

Tool

Description

sf_create_experience_site

Create Experience Cloud sites

sf_create_experience_page

Create pages within Experience sites

Agentforce

Tool

Description

sf_create_agent

Create Agentforce Agent (Bot shell)

sf_create_agent_action

Create Agent Actions (GenAiFunction) linked to Flows/Apex

sf_create_agent_topic

Create Agent Topics (GenAiPlugin) with actions wired in

sf_create_agent_planner

Wire agent to its topics (GenAiPlanner) — required for routing

External Integrations

Tool

Description

sf_create_connected_app

Create OAuth Connected Apps

sf_create_external_client_app

Create External Client Apps (OAuth) — Salesforce's newer replacement for Connected Apps; Client Credentials Flow (incl. Run As user) is API-settable here, unlike Connected Apps

sf_create_external_data_source

Create External Data Sources for Connect

sf_create_external_object

Create External Objects (__x)

sf_create_remote_site_setting

Whitelist external URLs for callouts

sf_create_csp_setting

Create CSP trusted sites for LWC

Change Sets & Deployment

Tool

Description

sf_create_outbound_change_set

Create Outbound Change Sets

sf_add_to_change_set

Add components to a change set

sf_deploy_metadata

Deploy metadata via Metadata API (supports testLevel, inline XML)

sf_check_deploy_status

Check deployment job status

sf_retrieve_metadata

Retrieve metadata from the org

sf_delete_metadata

Permanently delete metadata components (CustomObject, CustomField, Flow, GenAiFunction, Bot, etc.)

MCP Server Management

Tool

Description

sf_create_mcp_server

Generate a new MCP server project on disk

sf_create_mcp_tool

Add a new tool to an existing MCP server

sf_list_mcp_tools

List all tools in an MCP server project


Example Prompts

Build a complete object:

"Create a custom object called Project__c with fields: Name (text), Status__c (picklist: Planning/Active/Complete), Budget__c (currency), then add a validation rule requiring Budget when Status is Active."

Deploy Apex:

"Create an Apex class called OpportunityService that queries all Opps with Amount > 100000. Then create a test class for it."

Create a flow:

"Create a record-triggered flow on Opportunity that fires after save when Stage = Closed Won. Send an email alert to the owner and create a follow-up Task due in 30 days."

Set up an LWC:

"Create a Lightning Web Component called accountSummary that displays account name, industry, and annual revenue. Make it available on Record Pages."

Agentforce setup:

"Create an Agentforce agent called SalesAssistant. Then create a GetOrders action linked to the Get_Account_Orders flow. Then create an OrderManagement topic with actions: [GetOrders]. Finally wire SalesAssistant to topic OrderManagement."


Environment Variables

Variable

Description

Required

SF_INSTANCE_URL

Your org URL (e.g. https://org.salesforce.com)

Always

SF_CLIENT_ID

Connected App client ID

For OAuth

SF_CLIENT_SECRET

Connected App client secret

For OAuth

SF_REFRESH_TOKEN

OAuth refresh token

For OAuth

SF_ALIAS

Salesforce CLI org alias

For CLI

SF_ACCESS_TOKEN

Static access token (expires ~1hr)

For static

PORT

HTTP server port (default: 3000)

For HTTP mode

TRANSPORT

stdio or http (default: stdio)

Optional

SF_TOOLSETS

Toolsets to load at startup: all, none, or a comma-separated list (default: core,metadata)

Optional

SF_TOOLSETS_VERBOSE

Set to 1 to print the full toolset list to stderr on startup

Optional

SF_PRODUCTION_GUARD

destructive (default), strict, or off — see below

Optional


Production write guard

This server hands an LLM a Salesforce credential, and the LLM decides what to do with it. Any text the model reads on the way — a case comment, a field description, a retrieved .flow file, an email body — can carry an instruction, and nothing downstream can tell it apart from one you typed.

So against a production org, nine tools are refused by default:

Blocked on production

Why

sf_delete_metadata

Destroys metadata and every record in it

sf_delete_record, sf_bulk_delete_records

Destroy data

sf_execute_anonymous_apex

Arbitrary code that leaves no artifact behind

sf_uninstall_package

Removes a managed package and its data

sf_create_user, sf_update_user

Privilege escalation

sf_reset_user_password, sf_freeze_user

Account takeover / lockout

Metadata creation is not affected. All 137 sf_create_* tools, sf_deploy_metadata and sf_retrieve_metadata work against production exactly as before — authoring metadata by natural language is the point of this package, and a guard that taxed it would just get switched off.

Apex authoring (sf_create_apex_class, sf_create_apex_trigger) is also not blocked, even though a trigger runs on every DML. The line drawn is auditability: created Apex is metadata — it has a name, an author and a deploy record, and can be found and removed. sf_execute_anonymous_apex leaves nothing to find, which is why that one is blocked.

An org counts as production only when it is not a sandbox, not a Developer Edition org, and not on a trial/scratch expiry. Sandboxes, dev orgs and scratch orgs are never gated.

{ "env": { "SF_PRODUCTION_GUARD": "strict" } }   // refuse ALL writes on production
{ "env": { "SF_PRODUCTION_GUARD": "off" } }      // no guard at all

The guard is a hard refusal, not a confirmation prompt: a prompt the calling agent can approve by itself is not a control, and this server is often run with client permissions bypassed. Only the environment variable lifts it.


Documentation


Bugs & Feature Requests

Found a bug or want a new tool? Open an issue — there are templates for bug reports and feature requests. Please include the package version and the tool name, and remove any org URLs or credentials before posting.


License

MIT

Available Tools

18 tools
sf_add_picklist_valuesAdd Picklist Values to Existing FieldA
Idempotent

Adds new picklist values to an existing Picklist or MultiselectPicklist field without removing existing values. Use when a user wants to add new options to a dropdown.

ParametersJSON Schema
NameRequiredDescriptionDefault
valuesYesNew picklist values to add (existing values are preserved)
objectFieldFullNameYesFull API name of the picklist field, e.g. 'Invoice__c.Status__c'

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already communicate readOnly=false, destructive=false, and idempotentHint=true. The description adds a critical behavioral trait: 'without removing existing values', which directly addresses what is preserved (i.e., nothing existing is destroyed). This adds value beyond the annotations and clarifies the operation's non-destructive nature.

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?

Two short sentences, front-loaded with the action. The first sentence states the purpose and key constraint; the second provides the use case. Every word earns its place 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?

The tool has only 2 parameters with rich schema descriptions and an open-world annotation. No output schema exists, but the description adequately covers the operation scope and expected outcome. It does not mention error handling or permissions, but for an additive, non-destructive operation this seems sufficient. Minor gap: no mention that adding a duplicate value might fail, but not critical.

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%; all parameters (objectFieldFullName and values) have detailed descriptions in the schema, including the nested value properties (label, fullName, color, etc.). The tool description itself adds no extra parameter information, so baseline 3 applies.

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 uses a specific verb ('Adds') and identifies the resource ('new picklist values to an existing Picklist or MultiselectPicklist field') with a key differentiator: 'without removing existing values'. This distinguishes it from potential update/replace operations and from sibling tools like sf_create_custom_field.

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 explicit when-to-use guidance: 'Use when a user wants to add new options to a dropdown.' It does not name alternatives (e.g., for replacing values) but the 'without removing existing values' clause clarifies it is not for editing. This is clear context, though not an explicit exclusion list.

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

sf_check_deploy_statusCheck Deployment StatusA
Read-onlyIdempotent

Checks the status of an in-progress or recently completed metadata deployment by async job ID. Returns the status (Pending, InProgress, Succeeded, Failed, Canceled), component successes, failures, and test results. Use with the deploy ID returned from sf_deploy_metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
deployIdYesDeploy async job ID returned from sf_deploy_metadata

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable context: what the response includes (statuses, component successes/failures, test results) and the 'recently completed' limitation, implying retention boundaries.

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?

Two sentences, zero filler, front-loaded with the action and resource. Every word contributes meaning.

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 read-only tool with no output schema, the description sufficiently explains the return payload, usage context, and relationship to sf_deploy_metadata. It is complete enough for an agent to invoke correctly.

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% and the sole parameter deployId is well-described in the schema. The description reinforces the meaning but adds no additional semantics 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 uses a specific verb ('Checks') and resource ('status of a metadata deployment') with the async job ID qualifier. It clearly distinguishes from siblings like sf_deploy_metadata (which performs the deployment) and sf_get_deployment_history (which lists past deployments).

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 states explicit usage context with 'in-progress or recently completed deployment' and 'Use with the deploy ID returned from sf_deploy_metadata.' This gives clear when-to-use guidance, though it does not explicitly contrast with alternative status/history tools.

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

sf_create_approval_processCreate Salesforce Approval ProcessA
Idempotent

Creates or updates a Salesforce Approval Process via the Metadata API. Define who can submit, approval steps with approvers, entry criteria, and what happens on approval or rejection.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesHuman-readable label, e.g. 'Large Deal Approval Process'
activeNoActivate immediately (warning: cannot change steps after activation)
objectNameYesObject API name, e.g. 'Opportunity' or 'Leave_Request__c'
allowRecallNoAllow submitters to recall approval requests
descriptionNoDescription of the approval process
processNameYesAPI name of the process, e.g. 'Large_Deal_Approval'
entryFormulaNoFormula records must satisfy to enter this process
approvalStepsYesOrdered list of approval steps
emailTemplateNoEmail template for approval notifications, e.g. 'unfiled$public/ApprovalEmail'
allowedSubmittersYesWho can submit: [{type:'owner'}] or [{type:'role', submitter:'SalesRep'}]
finalApprovalLockNoLock record after final approval
recordEditabilityNoWho can edit locked records during approvalAdminOnly
finalRejectionLockNoLock record after final rejection
entryFilterCriteriaNoFilter criteria alternative to entryFormula

TDQS

A4/5.0
Behavior3/5

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

The annotations already indicate idempotency and non-read-only behavior. The description adds that it uses the Metadata API and can create or update, but doesn't disclose additional behavioral nuances like the irreversibility of activation (which is only in the schema). This is 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 two sentences long, with the action immediately stated. Every phrase adds value—the verb, resource, API method, and key configurable aspects—without 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?

With 14 parameters and no output schema, the description provides a useful overview of the tool's capabilities, while the rich schema and annotations cover the detailed semantics. It could mention return values or activation warnings, but these are either obvious from the create/update context or present in the 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?

The input schema provides 100% detailed descriptions of all 14 parameters, so the description doesn't need to add much. It lists high-level categories (submitters, steps, approvers, entry criteria, actions) that map to parameters, but adds no new semantic detail.

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 uses specific verb 'Creates or updates' and names the resource 'Salesforce Approval Process' via 'Metadata API', clearly distinguishing it from sibling tools like sf_create_validation_rule or sf_create_workflow_rule.

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 identifies the tool's domain (approval processes) and the operation (create/update), making it obvious when to use it. However, it doesn't explicitly mention alternatives or exclusion conditions, 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.

sf_create_custom_fieldCreate Salesforce Custom FieldA
Idempotent

Creates a new custom field on an existing Salesforce object. The field API name must end with '__c'. Supports all field types: Text, Number, Picklist, Lookup, etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesSalesforce field type
labelYesDisplay label for the field, e.g. 'Status'
scaleNoDecimal places for Number/Currency/Percent (0–17)
lengthNoMax length. Text/TextArea: 1–255 (default 255). LongTextArea/Html (Text Area Long / Rich Text Area): 256–131072 (default 32768).
uniqueNoWhether values must be unique (Text, Number, Email)
requiredNoWhether the field is required on page layouts
fieldNameYesAPI name of the field, e.g. 'Status__c'
precisionNoTotal digits for Number/Currency/Percent (1–18)
externalIdNoWhether this field is an external ID
objectNameYesAPI name of the parent object, e.g. 'Account' or 'Invoice__c'
descriptionNoOptional description for the field
referenceToNoTarget object API name for Lookup/MasterDetail, e.g. 'Account'
defaultValueNoDefault value for the field. Use true/false for Checkbox fields.
visibleLinesNoVisible lines. Required for LongTextArea and Html (Text Area Long / Rich Text Area) — default 10. Also used for MultiselectPicklist.
picklistValuesNoPicklist configuration. Required for Picklist / MultiselectPicklist types.
deleteConstraintNoDelete behaviour for Lookup fields: 'Cascade', 'Restrict', or 'SetNull'
relationshipNameNoAPI name for the relationship (no spaces)
relationshipLabelNoLabel for the relationship on the related object

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, covering the mutation safety profile. The description adds only the '__c' naming rule and 'existing object' scope, which are also present in the schema or purpose, so it contributes little new 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.

Conciseness5/5

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

The description is two sentences, front-loaded with the core action, and avoids redundant detail already present in annotations or schema. It is appropriately succinct.

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?

With 18 parameters, nested objects, and type-specific requirements, the description is far too sparse. It fails to warn that Picklist requires picklistValues, Lookup/MasterDetail requires referenceTo, or that Number fields need precision/scale. No output schema exists, so the description should help guide correct invocation; it does not.

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 repeats the '__c' suffix (already in fieldName's pattern) and lists field types (already in the type enum), adding no new meaning beyond the structured 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 creates a custom field on an existing Salesforce object, using a specific verb and resource. It distinguishes itself from sibling tools like sf_create_custom_object by focusing on fields, and the '__c' suffix constraint adds precision.

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 it is the general tool for creating custom fields ('Supports all field types') but does not explicitly mention when to use it versus specialized alternatives like sf_create_formula_field or sf_add_picklist_values. No exclusions or alternative references are provided.

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

sf_create_custom_objectCreate Salesforce Custom ObjectA
Idempotent

Creates a new Salesforce Custom Object using the Metadata API. The object name must end with '__c'. Use this when a user asks to create a new object, entity, or table in Salesforce.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesSingular label shown in the UI, e.g. 'Invoice'
fullNameYesAPI name of the custom object, e.g. 'Invoice__c'
descriptionNoOptional description for the object
pluralLabelYesPlural label, e.g. 'Invoices'
enableSearchNoEnable search on this object
sharingModelNoOWD sharing model for the objectReadWrite
enableHistoryNoEnable field history tracking
enableReportsNoMake the object available for reports
nameFieldTypeNoType of Name field: 'Text' (free-form) or 'AutoNumber' (auto-increment)Text
nameFieldLabelNoLabel for the standard Name field, e.g. 'Invoice Name'Name
autoNumberFormatNoFormat for AutoNumber name field, e.g. 'INV-{0000}'. Required when nameFieldType is AutoNumber.
deploymentStatusNoDeployment status of the objectDeployed
enableActivitiesNoAllow activities (tasks/events) on this object

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate a write operation (readOnlyHint=false) and idempotent hint. The description adds that the operation uses the Metadata API and enforces the '__c' suffix rule, which are useful behavioral constraints not captured in annotations.

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?

Two sentences, front-loaded with the action, and no filler. The second sentence provides selection guidance and a naming constraint efficiently.

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 full schema coverage and annotations that clarify safety, the description provides sufficient context for selection and invocation. It clearly states what it creates and when to use it, though it doesn't describe return values or deployment behavior—acceptable given 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 fully documents all 13 parameters. The description's naming rule is already embedded in the fullName pattern, so it adds no additional semantic 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?

Specifically identifies the action ('Creates') and resource ('Salesforce Custom Object'), and distinguishes from siblings like sf_create_external_object by specifying the custom object type. The phrase 'using the Metadata API' adds technical context.

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?

Gives an explicit trigger: 'Use this when a user asks to create a new object, entity, or table in Salesforce.' This clearly indicates when to select the tool, though it doesn't discuss exclusions or mention alternatives like external objects.

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

sf_create_formula_fieldCreate Formula FieldA
Idempotent

Creates a formula field on any Salesforce object. Supports all return types (Text, Number, Currency, Date, DateTime, Checkbox, Percent) and the full Salesforce formula language: IF/AND/OR/NOT, BLANKVALUE, TEXT, VALUE, DATE, DATEVALUE, TODAY, NOW, date functions (MONTH/YEAR/DAY), math (FLOOR/CEILING/MOD), string functions (LEN/LEFT/RIGHT/MID/TRIM/UPPER/LOWER/CONTAINS/BEGINS), record type and picklist functions (ISPICKVAL, ISNULL, ISBLANK), cross-object field references (e.g. Account.Owner.Name), and VLOOKUP. Complex multi-line formulas are fully supported.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesField label
scaleNoDecimal places for Number/Currency/Percent return types
formulaYesSalesforce formula expression. Supports all Salesforce formula functions: IF, AND, OR, NOT, BLANKVALUE, TEXT, VALUE, DATE, DATEVALUE, TODAY, NOW, MONTH, YEAR, DAY, FLOOR, CEILING, MOD, LEN, LEFT, RIGHT, MID, TRIM, UPPER, LOWER, CONTAINS, BEGINS, ISPICKVAL, ISNULL, ISBLANK, cross-object fields (e.g. Account.Owner.Name), etc.
fieldNameYesField name without __c suffix
precisionNoTotal number of digits for Number/Currency/Percent return types (default 18)
returnTypeYesFormula return type
descriptionNoField description
objectApiNameYesObject API name, e.g. 'Opportunity'
formulaTreatBlanksAsNoHow to treat blank fields in the formula. Defaults to BlankAsZero for numeric types, BlankAsLogicalFalse for Checkbox.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations cover the safety profile (not read-only, not destructive, idempotent). The description adds valuable behavioral context beyond annotations, such as support for all return types, full formula language, cross-object references, and complex multi-line formulas. This helps the agent understand the tool's capabilities 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 front-loaded with the purpose and then expands on capabilities. The second sentence is long but packed with specific useful details (function list, feature support). It is appropriately sized for a tool with complex capabilities, though slightly verbose.

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, the description is fairly complete: it covers return types, formula language features, cross-object references, and multi-line support. It lacks explicit alternatives or prerequisites, but the rich schema and annotations fill in most gaps, making it adequately complete for an agent to use the tool correctly.

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 parameters are already well documented. The description adds context about supported formula functions and return types, but this largely overlaps with the schema's own parameter descriptions. It does not provide significant additional meaning beyond what the schema already covers.

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 and resource: 'Creates a formula field on any Salesforce object.' It distinguishes itself from siblings like sf_create_custom_field by explicitly focusing on formula fields and enumerating supported return types and formula language features.

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 usage context: this tool is for creating formula fields. However, it does not explicitly state when to use this over alternatives (e.g., sf_create_custom_field for non-formula fields) or provide exclusions. The context is implied but not spelled out.

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

sf_create_validation_ruleCreate Salesforce Validation RuleA
Idempotent

Creates or updates a Salesforce Validation Rule on any object via the Metadata API. The errorConditionFormula returns TRUE when data is INVALID. Use for data quality enforcement.

ParametersJSON Schema
NameRequiredDescriptionDefault
activeNoWhether the rule is active
ruleNameYesAPI name for the rule, e.g. 'Require_Close_Date'
objectNameYesObject API name, e.g. 'Account', 'Opportunity', 'Invoice__c'
descriptionNoDescription of this validation rule
errorMessageYesError shown to user when validation fails (max 255 chars)
errorDisplayFieldNoField API name to display error next to, e.g. 'CloseDate'. Blank = top of page.
errorConditionFormulaYesFormula returning TRUE when data is INVALID, e.g. "AND(ISPICKVAL(StageName,'Closed Won'),ISBLANK(CloseDate))"

TDQS

A4.2/5.0
Behavior4/5

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

The description adds valuable behavior beyond annotations: it reveals the tool is an upsert ('Creates or updates'), explains the key formula semantics (TRUE = invalid), and names the API method (Metadata API). Annotations already cover read-only/destructive/idempotent flags, so the description complements rather than repeats them.

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?

Three short sentences: the first states the action and scope, the second clarifies the core formula behavior, and the third gives the primary use case. 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?

With a fully described schema and solid annotations, the description is adequately complete. It covers the main behavioral nuance (upsert and formula direction) and use case. It could optionally mention permissions or deployment impact, but the lack is not a glaring gap.

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 mentions errorConditionFormula semantics, but this is essentially identical to the schema description and does not add extra parameter meaning.

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 states a specific action ('Creates or updates') and resource ('Salesforce Validation Rule') plus scope ('on any object via the Metadata API'). It clearly distinguishes from sibling tools by naming the metadata type and its use for data quality enforcement.

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?

'Use for data quality enforcement' provides clear context for when to invoke the tool, but it does not explicitly exclude alternatives or name sibling tools (e.g., workflow rules) for comparison. Thus it earns a 4 rather than a 5.

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

sf_create_workflow_field_updateCreate Salesforce Workflow Field Update ActionA
Idempotent

Creates a Workflow Field Update action that can be referenced by Approval Processes, Workflow Rules, or Flows. Sets a field to a literal value, formula result, or null.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYesField API name to update, e.g. 'StageName'
labelYesHuman-readable label
formulaNoFormula for the new value, e.g. 'TODAY()'
nullValueNoSet the field to null/blank
actionNameYesAPI name of the action, e.g. 'Set_Stage_Closed_Won'
objectNameYesObject API name, e.g. 'Opportunity'
literalValueNoLiteral string/picklist value to set
notifyAssigneeNoNotify owner/assignee after update

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already indicate this is a non-read-only, idempotent, non-destructive operation. The description adds that it creates an action and sets a field to a literal, formula, or null, providing contextual behavior. However, it does not disclose potential caveats like required permissions or metadata component creation, though annotations diminish the need for that.

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 two concise sentences, front-loaded with the action verb, and every word adds value. No redundant or inflated 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?

Given the 8-parameter schema and good annotations, the description covers purpose, usage context, and value options. It does not explain return values (no output schema) or prerequisites, but this is acceptable for a straightforward create operation with detailed schema descriptions.

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 coverage is 100%, so baseline is 3. The description adds meaningful grouping by stating that the field can be set to 'a literal value, formula result, or null', which directly maps to the parameters literalValue, formula, and nullValue. This enriches parameter understanding beyond the individual schema descriptions.

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 action: 'Creates a Workflow Field Update action that can be referenced by Approval Processes, Workflow Rules, or Flows.' This is a specific verb+resource, and it also mentions the value-setting behavior (literal, formula, null). It does not explicitly differentiate from the sibling 'sf_create_field_update', but the mention of referencing contexts provides some distinction.

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?

It implies usage context by noting the action can be referenced by Approval Processes, Workflow Rules, or Flows, but it does not explicitly state when to use this tool versus alternatives like sf_create_field_update or sf_create_workflow_rule. The guidance is embedded but not explicit.

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

sf_delete_metadataDelete MetadataA
DestructiveIdempotent

Permanently deletes one or more metadata components of a given type via the Metadata API's deleteMetadata call — works for CustomObject, CustomField, Flow, GenAiFunction, GenAiPlugin, GenAiPlannerBundle, Bot, ApexClass, and most other metadata types. There was previously no way to remove anything created by this MCP server (sf_deploy_metadata only supports adding/updating components, not destructiveChanges) — diagnostic or abandoned metadata had nowhere to go. Deletes each fullName independently: check the response's deleted/errors lists rather than assuming all all-or-nothing. Some types have dependency order requirements (e.g. delete a Bot's GenAiFunction/GenAiPlugin/GenAiPlannerBundle before the Bot itself, delete CustomField before its parent CustomObject) — Salesforce will reject a delete that still has dependents, naming them in the error.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNamesYesFull names of the components to delete, e.g. ['My_Object__c'] or ['My_Object__c.My_Field__c']. Deletes each independently — some may succeed while others fail; check the response's deleted/errors lists rather than assuming all-or-nothing.
metadataTypeYesMetadata type to delete, e.g. 'CustomObject', 'CustomField', 'Flow', 'GenAiFunction', 'GenAiPlugin', 'GenAiPlannerBundle', 'Bot'

TDQS

A4.5/5.0
Behavior5/5

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

The description goes well beyond the annotation flags (readOnlyHint=false, destructiveHint=true, idempotentHint=true). It discloses that deletes are independent per fullName, that responses must be checked for partial failures, and that dependency-order requirements exist (e.g., deleting a Bot before its children, CustomField before CustomObject). This rich behavioral detail is not present in the annotations and is crucial for safe usage.

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 moderately long but every sentence contributes value: it states the core operation, the motivation, the independent-delete behavior, and dependency warnings. It is front-loaded with the purpose and uses clear structure. While it could be slightly more compact, it is not verbose or redundant.

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 moderate complexity (2 parameters, no output schema), the description is quite complete. It covers the operation, supported types, failure mode (check deleted/errors lists), and dependency constraints. It does not fully describe the response structure, but it references the key response fields, which is sufficient for an agent to infer the return format. Overall, it adequately prepares the agent for invoking 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 already has 100% description coverage for both parameters. The tool description adds context beyond the schema by explaining how fullNames are processed independently and how metadataType interacts with dependency rules. It also provides concrete examples (delete CustomField before CustomObject) that enrich the semantic understanding of the parameters.

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: 'Permanently deletes one or more metadata components of a given type via the Metadata API's deleteMetadata call'. It names common metadata types and explicitly contrasts with sf_deploy_metadata, which only adds/updates, clearly distinguishing this delete-oriented tool 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 provides clear context for when to use the tool: when metadata components need to be removed, especially those created previously by the MCP server, noting that sf_deploy_metadata does not support destructiveChanges. It also explains dependency-order prerequisites for certain types, giving practical usage guidance. It does not explicitly enumerate exclusions, but the alternatives are implied by the contrast with sf_deploy_metadata and sibling data-deletion tools.

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

sf_deploy_metadataDeploy MetadataA
Idempotent

Deploys a set of metadata components directly to the org using the Metadata API SOAP deploy operation. Builds a package.xml and deployment zip in memory. Supports validate-only (checkOnly:true) for pre-deployment validation without making changes. Specify runTests to execute test classes during deployment (required for production). Polls until complete or timeout.

ParametersJSON Schema
NameRequiredDescriptionDefault
runTestsNoTest classes to run during deployment
checkOnlyNoValidate only, do not actually deploy
testLevelNoTest level: NoTestRun, RunSpecifiedTests, RunLocalTests, or RunAllTestsInOrg
componentsNoMetadata components to include in the deployment package. These reference components already in the org. Can be empty when using componentsXml to deploy new/updated components with inline XML.
waitMinutesNoMax minutes to wait for deploy to complete
componentsXmlNoOptional inline XML components to deploy. Each entry provides the complete XML definition (type, name, xml). The file path is inferred from type/name. When provided alongside components, both are deployed together.
rollbackOnErrorNoRoll back all changes if any component fails

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already state readOnlyHint=false and idempotentHint=true, so the tool's mutating nature is known. The description adds valuable behavioral context: it 'Builds a package.xml and deployment zip in memory' and 'Polls until complete or timeout,' plus explains the checkOnly flag avoids changes. This goes beyond annotations without contradicting them.

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 consists of four focused sentences, each with a distinct purpose: core action, in-memory packaging, validation shortcut, and production test requirement plus polling. There is no fluff or redundant information.

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 complex deploy tool with 7 parameters and no output schema, the description covers the main behaviors (deploy, validate-only, runTests, polling) and operational effects. It omits explicit return-value details and scenarios like combining 'components' with 'componentsXml', but the rich schema fills those gaps. It is reasonably 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 coverage is 100%, so the baseline is 3. The description adds meaningful semantics by highlighting 'runTests' as required for production and explaining checkOnly as a validation-only mode. It also references the packaging process that relates to components/componentsXml, but does not over-repeat schema details.

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 'Deploys a set of metadata components directly to the org using the Metadata API SOAP deploy operation,' using a specific verb and resource. It clearly distinguishes this from sibling tools like sf_retrieve_metadata and sf_check_deploy_status by naming the Metadata API deploy operation and the in-memory package.xml/zip construction.

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?

It provides concrete usage guidance: 'Supports validate-only (checkOnly:true) for pre-deployment validation without making changes' and 'Specify runTests ... required for production.' It implies the primary use case is deploying metadata, but it does not explicitly mention alternatives or exclusions, such as when to prefer individual create tools or sf_check_deploy_status.

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

sf_describe_objectDescribe Object SchemaA
Read-onlyIdempotent

Retrieves schema metadata for a Salesforce object via the REST Describe API: fields (name, label, type, required, picklist values, length, references), child relationships, and record type info. Call this before querying or creating records on an unfamiliar object, or when a user asks what fields exist on an object.

objectApiName: SObject API name, e.g. 'Account', 'My_Object__c' fieldsOnly: set true for a smaller/faster response with just the field list, omitting child relationships and record types waitForFields: field API names to poll for after a sf_create_custom_field call — Salesforce's own REST describe/SOQL schema cache can lag several minutes behind the Metadata API on some orgs even though the field is fully deployed; this retries so you don't have to. Not caused by this MCP server and not fixable here — it's Salesforce-side. timeoutSeconds: max time to poll when waitForFields is set (default 60, max 300)

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsOnlyNoIf true, returns only the field list (name, label, type, required, picklist values) and omits child relationships/record type info — use for a smaller, faster response when you only need field names/types before a query or DML call.
objectApiNameYesSObject API name to describe, e.g. 'Account', 'My_Object__c'
waitForFieldsNoField API names to wait for. Salesforce's own REST describe/SOQL schema cache can lag several minutes behind a metadata deploy on some orgs (confirmed live 2026-07-31: a field visible via Tooling API and the Metadata API can still be invisible to REST describe and SOQL long after creation) — this isn't caused by anything in this MCP server (no caching happens here; every call is a fresh HTTP request), so it can't be fixed client-side, only worked around. When set, retries describe until every named field appears or timeoutSeconds elapses, instead of you polling manually.
timeoutSecondsNoMax time to poll when waitForFields is set. Ignored otherwise.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, openWorld), the description discloses important behavioral traits: it uses the REST Describe API, can return only fields with fieldsOnly, and includes a retry mechanism when waitForFields is used due to Salesforce-side schema cache lag. This is substantive context not available from 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 main description is concise and front-loaded, but the parameter explanations become somewhat lengthy, especially waitForFields. However, each sentence provides valuable context and none is redundant, so it remains well structured.

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 tool with no output schema, the description fully covers what the response contains, when to use it, and parameter-specific edge cases. It also explains the fieldsOnly and waitForFields behaviors, making the tool self-sufficient for an agent.

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?

Although the input schema already covers all parameters (100%), the description adds meaningful context: fieldsOnly's performance rationale, waitForFields detailed explanation about Salesforce cache lag and retry behavior, and timeoutSeconds default/max. This goes beyond schema descriptions, though the schema itself also carries clear 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 'Retrieves schema metadata for a Salesforce object via the REST Describe API' and enumerates the specific data returned (fields, child relationships, record type info). This is a specific verb+resource that distinguishes it from sibling tools like sf_get_field_permissions or sf_query_records.

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?

It explicitly advises when to use the tool: 'Call this before querying or creating records on an unfamiliar object, or when a user asks what fields exist on an object.' This provides clear contextual guidance and differentiates from alternatives without ambiguity.

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

sf_find_toolFind ToolA
Idempotent

Searches all 228 Salesforce tools by name — including tools in toolsets that are not loaded — and by default loads whichever toolsets contain the matches, so you can call them immediately. Use this whenever a tool you expect does not appear in the tool list, or when you do not know which toolset a capability lives in. Example queries: "flow", "permission set", "agent", "omniscript", "debug log".

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesWhat you are looking for, e.g. "validation rule" or "create flow".
autoLoadNoLoad the toolsets containing the matches so they become callable straight away. Default true.

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses a non-obvious side effect beyond the annotations: it searches unloaded toolsets and by default loads whichever toolsets contain matches so they become callable immediately. This adds meaningful behavioral context even though annotations already mark the tool as idempotent.

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?

Two tight sentences plus concrete example queries. The key behavior is front-loaded, and every sentence earns its place without padding.

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 discovery tool, the description covers purpose, when to use it, the auto-loading side effect, and query examples. It does not describe the return shape, but that is not critical for an agent to invoke the tool correctly, and the schema covers the parameters.

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%, and the description mostly restates what the schema already documents for 'query' and 'autoLoad'. The example queries add a little flavor but no substantially new meaning 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 names a specific verb ('searches') and a specific resource ('all 228 Salesforce tools by name'), and distinguishes itself by noting it includes tools in unloaded toolsets and auto-loads matching toolsets. This clearly differentiates it from siblings like sf_list_toolsets and sf_load_toolset.

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?

It gives explicit usage triggers: 'Use this whenever a tool you expect does not appear in the tool list, or when you do not know which toolset a capability lives in.' This is clear context, but it does not explicitly name alternatives or state when not to use it, 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.

sf_get_metadata_dependenciesMetadata Impact AnalysisA
Read-onlyIdempotent

Answers "what breaks if I change this?" for any metadata component. Read-only — it changes nothing.

Returns every component that REFERENCES the target (Apex classes, triggers, flows, validation rules, layouts, report types, formulas), grouped by type. For custom fields it also reports how many records currently hold a value, which is usually the deciding factor in whether a change is safe.

componentType + componentName: e.g. CustomField + 'Account.Revenue__c', or ApexClass + 'AccountService' componentId: alternatively pass the Salesforce Id directly (needed for types outside the supported list) includeUses: also return what the component itself depends on

Run this BEFORE deleting or reshaping anything that holds data. Note the blindSpots list returned with every response: this API cannot see dynamic SOQL, string-built field names, managed-package internals, or external integrations, so an empty result means "nothing found", never "safe to change".

ParametersJSON Schema
NameRequiredDescriptionDefault
componentIdNoSalesforce Id of the component, as an alternative to type+name (required for types not in the supported list).
includeUsesNoAlso return what this component itself depends on (the reverse direction).
componentNameNoComponent API name. For CustomField use 'Object.Field__c', e.g. 'Account.Revenue__c'.
componentTypeNoMetadata type: CustomField, CustomObject, ApexClass, ApexTrigger, Flow, ValidationRule, Layout, PermissionSet, LightningComponentBundle, AuraDefinitionBundle, StaticResource, ApexPage, ApexComponent

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: results grouped by type, custom-field record counts as the safety deciding factor, and the critical blindSpots caveat that an empty result means 'nothing found,' never 'safe to change.' The read-only sentence reinforces readOnlyHint=true rather than merely repeating it, and nothing contradicts the annotation set.

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 core purpose is front-loaded in the first sentence, and each subsequent segment (return behavior, param routing, when-to-run, blind spots) adds unique value. It is longer than average, but every sentence earns its place, and paragraph breaks keep it scannable rather than wall-of-text.

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?

With no output schema present, the description carries the full burden of return semantics and covers it: referenced components grouped by type, custom-field record counts, and the blindSpots list. Nothing an agent needs to invoke it correctly or interpret results safely is missing, including the dual invocation modes derived from the param set.

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 coverage is 100%, so the baseline is 3. The description earns the extra point by spelling out the two mutually-exclusive invocation patterns with worked examples (CustomField + 'Account.Revenue__c', ApexClass + 'AccountService') and clarifying when componentId is the correct path. This relationship between parameters is not visible from reading the schema properties in isolation.

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?

Opens with a concrete, question-scoped statement — 'Answers what breaks if I change this?' — then names the resource ('any metadata component') with precise referential semantics. It is plainly distinct from the sibling create/deploy/retrieve/query tools, so an agent can select it correctly without opening the schema.

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?

Gives explicit when-to-use guidance: 'Run this BEFORE deleting or reshaping anything that holds data.' It lacks an explicit when-not-to-use clause or a named alternative, but no sibling competes for this impact-analysis job, so an exclusion statement would be redundant. The guidance is actionable and tied to a concrete workflow moment.

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

sf_list_objectsList / Search ObjectsA
Read-onlyIdempotent

Finds Salesforce objects by PARTIAL name or label — the discovery step before sf_describe_object, which needs an exact API name you may not know yet.

Use this whenever the user refers to objects loosely ("what objects handle cases?", "is there a custom object for invoices?", "show me the custom objects") rather than by exact API name.

searchTerm: partial API name or label, case-insensitive. Omit to list every object in the org. objectType: 'all' (default), 'custom' (only __c), or 'standard' queryableOnly: true to hide objects that cannot be queried with SOQL limit: max results (default 50)

Results rank exact matches first, then prefix matches, then substring matches, so a search for "Account" returns Account before AccountBrandShare. Returns name, label, keyPrefix and CRUD-ability per object; call sf_describe_object with an exact name for full field detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum objects to return
objectTypeNoRestrict to custom or standard objectsall
searchTermNoPartial API name or label to match, case-insensitive. Omit to list everything. Results rank exact matches first, then prefix, then substring.
queryableOnlyNoOnly return objects that support SOQL queries

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate read-only, idempotent, open-world, and non-destructive behavior. The description adds substantial behavioral context beyond that: partial and case-insensitive matching, ranking order (exact, prefix, substring), default limit, the objectType semantics including 'custom (only __c)', and the returned fields. These details meaningfully improve the agent's ability to predict results.

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 efficiently organized: purpose is front-loaded, usage guidance follows, then a compact parameter summary, then return and ranking behavior. Every sentence adds useful information, and the parameter list is short and directly relevant. No filler or redundancy.

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 tool with four optional parameters and no output schema, this description is complete. It covers all parameters, default behavior, ranking, returned fields, and the appropriate follow-up action. An agent has enough information to decide when to invoke it and what results to expect.

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 coverage is 100%, so the baseline is 3. The description adds extra semantic value by explaining 'custom (only __c)', clarifying that omitting searchTerm lists every object, and summarizing the ranking behavior for searchTerm. This goes slightly beyond the structured schema descriptions without fully re-explaining what is already documented.

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 a specific verb and resource: it finds Salesforce objects by partial name or label, positioning itself as the discovery step before sf_describe_object. This distinguishes it from the sibling describe tool, which requires an exact API name. The discovery purpose is explicit and cannot be confused with querying records or modifying metadata.

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 gives explicit when-to-use guidance: whenever the user refers to objects loosely rather than by exact API name. It also names the alternative, sf_describe_object, and specifies the follow-up condition—call it once you have an exact name. This is strong routing guidance with a clear exclusion and next step.

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

sf_list_toolsetsList ToolsetsA
Read-onlyIdempotent

Lists every available Salesforce toolset, how many tools each contains, and which are currently loaded. This server keeps most of its 228 tools unloaded to save context; unloaded tools do not appear in the tool list until you load their toolset with sf_load_toolset. Call this when you need a capability you cannot see.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds valuable behavioral context beyond annotations: the server keeps most of its 228 tools unloaded to save context, and unloaded tools are invisible until their toolset is loaded. This explains a non-obvious tool-listing behavior agents need to understand.

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 front-loaded: it states the primary function first, then adds necessary context about unloaded tools and a usage trigger. Each sentence contributes a distinct piece of information 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 zero-parameter listing tool, the description is fully sufficient. It specifies what is listed, why some tools are not visible, and when to call it. The output schema is absent, but the description already enumerates the returned information: toolset names, tool counts, and load state.

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 takes zero parameters, so the schema is fully covered and parameter semantics are moot. Per the calibration baseline, a zero-parameter tool receives a 4, and the description correctly focuses on behavior and output rather than inventing parameter detail.

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: 'Lists every available Salesforce toolset,' and adds what is returned: tool counts and current loaded state. It also distinguishes itself from sibling sf_load_toolset by explaining that unloaded tools do not appear in the tool list until the toolset is loaded.

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 clear trigger for use: 'Call this when you need a capability you cannot see.' It also explains the context of unloaded toolsets and directs the agent toward loading via sf_load_toolset, but it does not explicitly state when not to use this tool or compare it directly to sibling tools like sf_find_tool.

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

sf_load_toolsetLoad ToolsetA
Idempotent

Loads one or more Salesforce toolsets, making their tools callable and visible in the tool list. Available toolsets: core, metadata, objects, data, flows, automation, security, apex, lwc, ui, pages, actions, agentforce, omnistudio, omnichannel, devops, deployment, integrations, identity, reports, experience, admin, monitoring, audit, einstein, knowledge, cpq, sandbox, streaming, visualforce, aura, comms, mcp, i18n. Call sf_list_toolsets for descriptions and tool counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolsetsYesToolset names to load. One or more of: core, metadata, objects, data, flows, automation, security, apex, lwc, ui, pages, actions, agentforce, omnistudio, omnichannel, devops, deployment, integrations, identity, reports, experience, admin, monitoring, audit, einstein, knowledge, cpq, sandbox, streaming, visualforce, aura, comms, mcp, i18n

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish idempotent, non-destructive, non-read-only behavior. The description adds the state-changing effect: tools become callable and visible in the tool list, and it enumerates all valid toolset names. No contradiction with 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 core behavior is in the first sentence, followed by a closed list and a sibling pointer. The toolset list is long, but it is the only required parameter value set and compensates for the lack of enums in the schema. Slight redundancy with the schema prevents a 5.

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 one required array parameter, the description plus schema covers valid values and the effect of loading. It references the natural alternative for more detail. It does not describe the tool's return or confirmation message, and since no output schema exists, that is a minor omission.

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%; the schema already describes 'toolsets' as 'Toolset names to load' and lists valid values. The description repeats the values but does not add new semantic details such as aliases, ordering, or load behavior.

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 action ('Loads') on a concrete resource ('Salesforce toolsets') and defines the observable effect ('making their tools callable and visible in the tool list'). It also distinguishes itself from sf_list_toolsets by pointing to that sibling for descriptions and tool counts.

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 the trigger: load before using tools from a listed toolset. It gives an explicit alternative for when the agent only needs metadata ('Call sf_list_toolsets for descriptions and tool counts'). It does not spell out when-not-to-use or whether loading is additive, 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.

sf_query_recordsQuery Records (SOQL)A
Read-onlyIdempotent

Executes a SOQL query against the org and returns matching records. Provide the full SOQL string in the query param. Use for reading data, checking existing records before creating, or verifying changes.

Supports aggregate queries — GROUP BY with COUNT(), SUM(), AVG(), MAX(), MIN(), e.g.: 'SELECT StageName, COUNT(Id), SUM(Amount) FROM Opportunity GROUP BY StageName' Aggregate results come back as regular records with the aggregate expressions as field keys (e.g. "expr0").

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum records to return (default 200)
queryYesFull SOQL query string, e.g. 'SELECT Id, Name FROM Account WHERE Industry = \'Technology\' LIMIT 10'

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context by explaining aggregate query support and the resulting field-key format (e.g., 'expr0'), which goes beyond annotations.

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, with a direct first sentence followed by a concrete aggregate query example. Every sentence earns its place; no redundant or vague 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?

The description covers the core functionality and the special case of aggregate queries, including return format. It does not explain pagination or error behavior, but the schema covers the limit parameter, and the annotations cover safety. Adequate for a query 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 coverage is 100%, so both parameters have descriptions. The description enhances this with a full SOQL example and explains aggregate result mapping, adding meaning beyond what the schema 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 the tool executes a SOQL query against the org and returns matching records, using a specific verb and resource. It distinguishes from sibling tools like sf_get_record and sf_search_records by emphasizing raw SOQL flexibility.

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 lists use cases: reading data, checking existing records before creating, and verifying changes. This gives clear context, but it does not mention alternatives or when not to use this tool, so it stops short of a full 5.

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

sf_retrieve_metadataRetrieve MetadataA
Read-onlyIdempotent

Retrieves metadata components from the org and returns their actual file contents. Use this to read existing configuration before making changes, to back up metadata, or to check what is really deployed rather than what you think is deployed. Waits for the async retrieve to finish and unpacks the resulting zip, returning each file's path and source. Large files are truncated. Accepts 'components' (array), or 'metadataType'+'componentName' as a single-item shortcut, or a raw 'packageXml' document — provide exactly one form.

ParametersJSON Schema
NameRequiredDescriptionDefault
componentsNoMetadata components to retrieve
packageXmlNoRaw package.xml content for selective retrieve. If provided, components list is ignored.
metadataTypeNoSingle metadata type (alternative to components array)
componentNameNoSingle component name (used with metadataType)

TDQS

A4.7/5.0
Behavior5/5

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

The description reveals significant runtime behavior beyond annotations: it 'waits for the async retrieve to finish,' 'unpacks the resulting zip,' returns 'each file's path and source,' truncates large files, and requires exactly one parameter form. None of these details are present in the annotations, so they add real value. There is no contradiction with the readOnly/idempotent hints.

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 packs purpose, usage scenarios, async behavior, return format, truncation, and parameter-form constraints into four sentences with no filler. Information is front-loaded with the core action, and every sentence earns its place.

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 there is no output schema, the description adequately covers invocation forms, async behavior, return shape, and the truncation edge case. It does not mention error conditions or permission requirements, but the annotations already cover the safety profile for a read-only, non-destructive tool, so the missing details are minor.

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 describes each parameter, the description adds crucial relational semantics: the equivalence of 'metadataType'+'componentName' as a shortcut, the packageXml alternative that overrides components, and the 'exactly one form' constraint. These usage rules are not evident from the schema alone and prevent invalid calls.

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 states a specific verb and resource: 'Retrieves metadata components from the org and returns their actual file contents.' It also distinguishes itself from sibling create/deploy tools by emphasizing 'actual file contents' and checking 'what is really deployed rather than what you think is deployed.' This makes the tool's role clear without needing to open any schema.

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 lists use cases: read existing configuration before making changes, back up metadata, or verify actual deployed state. It does not explicitly name alternative tools or state when-not-to-use, but the contrast with create/deploy siblings and the read-only framing make the appropriate context clear.

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. 215 tool updatesv3.0.0
    • Removedsf_activate_flexcard
    • Removedsf_activate_flow
    • Removedsf_activate_integration_procedure
    • Removedsf_activate_omniscript
    • Removedsf_add_to_change_set
    • Removedsf_assign_layout_to_record_type
    • Removedsf_assign_presence_status
    • Removedsf_assign_queue_member
    • Removedsf_assign_skill_to_agent
    • Removedsf_assign_territory_to_user
    • Removedsf_bulk_delete_records
    • Removedsf_bulk_import_records
    • Removedsf_bulk_insert_records
    • Removedsf_bulk_update_records
    • Removedsf_check_code_coverage
    • Removedsf_check_devops_commit_status
    • Removedsf_checkout_devops_work_item
    • Removedsf_commit_devops_work_item
    • Removedsf_configure_change_data_capture
    • Removedsf_create_agent
    • Removedsf_create_agent_action
    • Removedsf_create_agent_planner
    • Removedsf_create_agent_topic
    • Removedsf_create_apex_class
    • Removedsf_create_apex_email_service
    • Removedsf_create_apex_test_class
    • Removedsf_create_apex_trigger
    • Removedsf_create_assignment_rule
    • Removedsf_create_aura_app
    • Removedsf_create_aura_component
    • Removedsf_create_aura_event
    • Removedsf_create_auth_provider
    • Removedsf_create_auto_response_rule
    • Removedsf_create_bot_routing
    • Removedsf_create_business_hours
    • Removedsf_create_business_process
    • Removedsf_create_calculation_matrix
    • Removedsf_create_calculation_procedure
    • Removedsf_create_chat_button
    • Removedsf_create_compact_layout
    • Removedsf_create_connected_app
    • Removedsf_create_connected_app_oauth_policy
    • Removedsf_create_csp_setting
    • Removedsf_create_custom_application
    • Removedsf_create_custom_button
    • Removedsf_create_custom_label
    • Removedsf_create_custom_metadata_record
    • Removedsf_create_custom_metadata_type
    • Removedsf_create_custom_notification_type
    • Removedsf_create_custom_permission
    • Removedsf_create_custom_setting
    • Removedsf_create_custom_tab
    • Removedsf_create_dashboard
    • Removedsf_create_data_category
    • Removedsf_create_dataraptor
    • Removedsf_create_devops_pull_request
    • Removedsf_create_document_generation
    • Removedsf_create_duplicate_rule
    • Removedsf_create_einstein_bot
    • Removedsf_create_einstein_prediction
    • Removedsf_create_email_alert
    • Removedsf_create_email_template
    • Removedsf_create_embedded_service
    • Removedsf_create_entitlement_process
    • Removedsf_create_escalation_rule
    • Removedsf_create_experience_page
    • Removedsf_create_experience_site
    • Removedsf_create_external_client_app
    • Removedsf_create_external_data_source
    • Removedsf_create_external_id_field
    • Removedsf_create_external_object
    • Removedsf_create_field_dependency
    • Removedsf_create_field_level_security
    • Removedsf_create_field_set
    • Removedsf_create_field_update
    • Removedsf_create_flexcard
    • Removedsf_create_flexipage
    • Removedsf_create_flow
    • Removedsf_create_flow_from_xml
    • Removedsf_create_forecast_hierarchy
    • Removedsf_create_global_action
    • Removedsf_create_global_value_set
    • Removedsf_create_holiday
    • Removedsf_create_integration_procedure
    • Removedsf_create_knowledge_article_type
    • Removedsf_create_letterhead
    • Removedsf_create_lightning_app
    • Removedsf_create_list_view
    • Removedsf_create_lwc
    • Removedsf_create_lwc_from_requirements
    • Removedsf_create_lwc_jest_test
    • Removedsf_create_matching_rule
    • Removedsf_create_mcp_server
    • Removedsf_create_mcp_tool
    • Removedsf_create_messaging_channel
    • Removedsf_create_milestone
    • Removedsf_create_muting_permission_set
    • Removedsf_create_named_credential
    • Removedsf_create_next_best_action
    • Removedsf_create_notification_type
    • Removedsf_create_omniscript
    • Removedsf_create_outbound_change_set
    • Removedsf_create_outbound_message
    • Removedsf_create_package
    • Removedsf_create_package_version
    • Removedsf_create_page_layout
    • Removedsf_create_path_assistant
    • Removedsf_create_permission_set
    • Removedsf_create_permission_set_group
    • Removedsf_create_platform_cache_partition
    • Removedsf_create_platform_event
    • Removedsf_create_platform_event_trigger
    • Removedsf_create_presence_configuration
    • Removedsf_create_presence_status
    • Removedsf_create_price_book
    • Removedsf_create_product
    • Removedsf_create_public_group
    • Removedsf_create_push_topic
    • Removedsf_create_queue
    • Removedsf_create_queue_routing_config
    • Removedsf_create_quick_action
    • Removedsf_create_record
    • Removedsf_create_record_type
    • Removedsf_create_remote_site_setting
    • Removedsf_create_report
    • Removedsf_create_report_folder
    • Removedsf_create_report_type
    • Removedsf_create_role
    • Removedsf_create_role_hierarchy
    • Removedsf_create_routing_configuration
    • Removedsf_create_saml_sso_config
    • Removedsf_create_sandbox
    • Removedsf_create_scheduled_flow
    • Removedsf_create_scheduled_job
    • Removedsf_create_scratch_org
    • Removedsf_create_search_layout
    • Removedsf_create_service_channel
    • Removedsf_create_service_territory
    • Removedsf_create_sharing_rule
    • Removedsf_create_skill
    • Removedsf_create_static_resource
    • Removedsf_create_tab
    • Removedsf_create_territory
    • Removedsf_create_user
    • Removedsf_create_user_role_hierarchy
    • Removedsf_create_visualforce_component
    • Removedsf_create_visualforce_email_template
    • Removedsf_create_visualforce_page
    • Removedsf_create_work_type
    • Removedsf_create_workflow_rule
    • Removedsf_deactivate_flow
    • Removedsf_delete_record
    • Removedsf_delete_scratch_org
    • Removedsf_detect_devops_merge_conflict
    • Removedsf_devops_create_work_item
    • Removedsf_devops_promote_work_item
    • Removedsf_enable_debug_logs
    • Removedsf_execute_anonymous_apex
    • Removedsf_explore_slds_blueprints
    • Removedsf_export_omnistudio_component
    • Removedsf_export_records
    • Addedsf_find_tool
    • Removedsf_freeze_user
    • Removedsf_get_apex_class
    • Removedsf_get_apex_test_results
    • Removedsf_get_apex_trigger
    • Removedsf_get_dataraptor
    • Removedsf_get_debug_log_body
    • Removedsf_get_debug_logs
    • Removedsf_get_deployment_history
    • Removedsf_get_event_logs
    • Removedsf_get_field_history
    • Removedsf_get_field_permissions
    • Removedsf_get_flexcard
    • Removedsf_get_flow_errors
    • Removedsf_get_integration_procedure
    • Removedsf_get_login_history
    • Addedsf_get_metadata_dependencies
    • Removedsf_get_omniscript
    • Removedsf_get_org_limits
    • Removedsf_get_record
    • Removedsf_get_setup_audit_trail
    • Removedsf_guide_lwc_accessibility
    • Removedsf_import_omnistudio_component
    • Removedsf_install_package
    • Removedsf_list_devops_projects
    • Removedsf_list_devops_work_items
    • Removedsf_list_flow_versions
    • Removedsf_list_mcp_tools
    • Addedsf_list_objects
    • Removedsf_list_sandboxes
    • Addedsf_list_toolsets
    • Addedsf_load_toolset
    • Removedsf_migrate_aura_to_lwc
    • Removedsf_promote_devops_work_item
    • Removedsf_refresh_sandbox
    • Removedsf_reset_user_password
    • Removedsf_resolve_devops_merge_conflict
    • Removedsf_run_apex_tests
    • Removedsf_run_code_scanner
    • Removedsf_scan_apex_antipatterns
    • Removedsf_search_records
    • Removedsf_send_email
    • Removedsf_share_report_folder
    • Removedsf_translate_custom_label
    • Removedsf_translate_field_label
    • Removedsf_uninstall_package
    • Removedsf_update_dashboard
    • Removedsf_update_flexcard
    • Removedsf_update_integration_procedure
    • Removedsf_update_lwc
    • Removedsf_update_omniscript
    • Removedsf_update_record
    • Removedsf_update_user
    • Removedsf_upsert_record
  2. 7 tool updatesv2.8.7
    • Changedsf_create_agent1 field changed
      • addedInput schema / properties / skipActionCapabilityCheck
        Added value: +{
        +  "description": "Skip the pre-flight probe for GenAiFunction (custom agent action) support. The probe exists to fail fast before creating an orphaned agent shell in orgs that can't create custom actions — set this true only if you already know the agent needs topics/instructions with no custom Flow/Apex-backed actions, or already know the probe's answer from a prior call.",
        +  "type": "boolean"
        +}
    • Changedsf_create_agent_action2 fields changed
      • changedInput schema / properties / label / description
        Previous value: -"Action label"New value: +"Action label. Defaults to actionName if omitted."
      • changedInput schema / required
        Previous value: -[
        -  "actionName",
        -  "label",
        -  "description",
        -  "type",
        -  "reference"
        -]New value: +[
        +  "actionName",
        +  "description",
        +  "type",
        +  "reference"
        +]
    • Changedsf_create_connected_app3 fields changed
      • addedInput schema / properties / enableClientCredentialsFlow
        Added value: +{
        +  "description": "Sets isClientCredentialEnabled/isAdminApproved on the deployed ConnectedApp (verified accepted by Metadata API 2026-07-31). NOTE: Salesforce still requires an admin to open Setup → App Manager → Edit Policies and pick the 'Run As' user for Client Credentials Flow, and the Consumer Secret can only ever be viewed/copied from that same Setup UI — neither is exposed by any API. This flag alone does not make the flow usable. PREFER sf_create_external_client_app instead: on External Client Apps, Client Credentials Flow (including its 'Run As' user) IS fully settable via the Metadata API — only the Consumer Secret still requires a one-time Setup UI visit, for either app type.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / scopes / description
        Previous value: -"OAuth scopes to request"New value: +"OAuth scopes to request. Use 'chatbot_api' (deploys as the metadata literal 'Chatbot', verified against a live org 2026-07-31) for any external client calling a Salesforce bot/Agentforce agent — without it, Agent API calls using this app's tokens are rejected regardless of the agent's own state."
      • changedInput schema / properties / scopes / items / enum
        Previous value: -[
        -  "api",
        -  "web",
        -  "full",
        -  "chatter_api",
        -  "wave_api",
        -  "eclair_api",
        -  "visualforce",
        -  "content",
        -  "openid",
        -  "profile",
        -  "email",
        -  "address",
        -  "phone",
        -  "offline_access",
        -  "custom_permissions",
        -  "pardot_api"
        -]New value: +[
        +  "api",
        +  "web",
        +  "full",
        +  "chatter_api",
        +  "wave_api",
        +  "eclair_api",
        +  "visualforce",
        +  "content",
        +  "openid",
        +  "profile",
        +  "email",
        +  "address",
        +  "phone",
        +  "offline_access",
        +  "custom_permissions",
        +  "pardot_api",
        +  "chatbot_api"
        +]
    • Addedsf_create_external_client_app
    • Changedsf_create_flow15 fields changed
      • addedInput schema / properties / elements / items / properties / assignments / items / properties / value / $ref
        Added value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue"
      • changedInput schema / properties / elements / items / properties / assignments / items / properties / value / description
        Previous value: -"Literal value"New value: +"Literal value — string, number, or boolean; typed XML element chosen automatically."
      • removedInput schema / properties / elements / items / properties / assignments / items / properties / value / type
        Removed value: -"string"
      • changedInput schema / properties / elements / items / properties / conditions / items / properties / rightValue / description
        Previous value: -"Right side literal value. For IsNull/IsNotNull use 'true' or 'false'."New value: +"Right side literal value — string, number, or boolean. For IsNull/IsNotNull use true/false or 'true'/'false'."
      • changedInput schema / properties / elements / items / properties / conditions / items / properties / rightValue / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "number",
        +  "boolean"
        +]
      • addedInput schema / properties / elements / items / properties / filterValue / $ref
        Added value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue"
      • changedInput schema / properties / elements / items / properties / filterValue / description
        Previous value: -"Literal filter value string (uses stringValue XML). Use filterValueRef when the value comes from a flow variable."New value: +"Literal filter value — string, number, or boolean; typed XML element (stringValue/numberValue/booleanValue) is chosen automatically. Use filterValueRef when the value comes from a flow variable."
      • removedInput schema / properties / elements / items / properties / filterValue / type
        Removed value: -"string"
      • addedInput schema / properties / elements / items / properties / filters / items / properties / value / $ref
        Added value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue"
      • changedInput schema / properties / elements / items / properties / filters / items / properties / value / description
        Previous value: -"Literal string/number/boolean value (uses stringValue XML)"New value: +"Literal filter value — string, number, or boolean; typed XML element (stringValue/numberValue/booleanValue) is chosen automatically."
      • removedInput schema / properties / elements / items / properties / filters / items / properties / value / type
        Removed value: -"string"
      • addedInput schema / properties / elements / items / properties / inputAssignments / items / properties / value / $ref
        Added value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue"
      • changedInput schema / properties / elements / items / properties / inputAssignments / items / properties / value / description
        Previous value: -"Literal value to set"New value: +"Literal value to set — string, number, or boolean; typed XML element chosen automatically."
      • removedInput schema / properties / elements / items / properties / inputAssignments / items / properties / value / type
        Removed value: -"string"
      • changedInput schema / properties / textTemplates / items / properties / text / description
        Previous value: -"Template body; may embed merge fields like {!$Record.Name}"New value: +"Template body; may embed merge fields like {!$Record.Name}. IMPORTANT (confirmed live 2026-08-01): Salesforce strips leading/trailing whitespace from the deployed template's content while preserving internal newlines — concatenating per-iteration templates in a loop without a separator runs lines together (e.g. 'first line last...NEXT: first line'). Put separators (spaces, newlines) INSIDE the template body, not relying on its edges."
    • Addedsf_delete_metadata
    • Changedsf_describe_object2 fields changed
      • addedInput schema / properties / timeoutSeconds
        Added value: +{
        +  "default": 60,
        +  "description": "Max time to poll when waitForFields is set. Ignored otherwise.",
        +  "maximum": 300,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / waitForFields
        Added value: +{
        +  "description": "Field API names to wait for. Salesforce's own REST describe/SOQL schema cache can lag several minutes behind a metadata deploy on some orgs (confirmed live 2026-07-31: a field visible via Tooling API and the Metadata API can still be invisible to REST describe and SOQL long after creation) — this isn't caused by anything in this MCP server (no caching happens here; every call is a fresh HTTP request), so it can't be fixed client-side, only worked around. When set, retries describe until every named field appears or timeoutSeconds elapses, instead of you polling manually.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  3. 221 tool updatesv2.8.5
    • First observedsf_activate_flexcard
    • First observedsf_activate_flow
    • First observedsf_activate_integration_procedure
    • First observedsf_activate_omniscript
    • First observedsf_add_picklist_values
    • First observedsf_add_to_change_set
    • First observedsf_assign_layout_to_record_type
    • First observedsf_assign_presence_status
    • First observedsf_assign_queue_member
    • First observedsf_assign_skill_to_agent
    • First observedsf_assign_territory_to_user
    • First observedsf_bulk_delete_records
    • First observedsf_bulk_import_records
    • First observedsf_bulk_insert_records
    • First observedsf_bulk_update_records
    • First observedsf_check_code_coverage
    • First observedsf_check_deploy_status
    • First observedsf_check_devops_commit_status
    • First observedsf_checkout_devops_work_item
    • First observedsf_commit_devops_work_item
    • First observedsf_configure_change_data_capture
    • First observedsf_create_agent
    • First observedsf_create_agent_action
    • First observedsf_create_agent_planner
    • First observedsf_create_agent_topic
    • First observedsf_create_apex_class
    • First observedsf_create_apex_email_service
    • First observedsf_create_apex_test_class
    • First observedsf_create_apex_trigger
    • First observedsf_create_approval_process
    • First observedsf_create_assignment_rule
    • First observedsf_create_aura_app
    • First observedsf_create_aura_component
    • First observedsf_create_aura_event
    • First observedsf_create_auth_provider
    • First observedsf_create_auto_response_rule
    • First observedsf_create_bot_routing
    • First observedsf_create_business_hours
    • First observedsf_create_business_process
    • First observedsf_create_calculation_matrix
    • First observedsf_create_calculation_procedure
    • First observedsf_create_chat_button
    • First observedsf_create_compact_layout
    • First observedsf_create_connected_app
    • First observedsf_create_connected_app_oauth_policy
    • First observedsf_create_csp_setting
    • First observedsf_create_custom_application
    • First observedsf_create_custom_button
    • First observedsf_create_custom_field
    • First observedsf_create_custom_label
    • First observedsf_create_custom_metadata_record
    • First observedsf_create_custom_metadata_type
    • First observedsf_create_custom_notification_type
    • First observedsf_create_custom_object
    • First observedsf_create_custom_permission
    • First observedsf_create_custom_setting
    • First observedsf_create_custom_tab
    • First observedsf_create_dashboard
    • First observedsf_create_data_category
    • First observedsf_create_dataraptor
    • First observedsf_create_devops_pull_request
    • First observedsf_create_document_generation
    • First observedsf_create_duplicate_rule
    • First observedsf_create_einstein_bot
    • First observedsf_create_einstein_prediction
    • First observedsf_create_email_alert
    • First observedsf_create_email_template
    • First observedsf_create_embedded_service
    • First observedsf_create_entitlement_process
    • First observedsf_create_escalation_rule
    • First observedsf_create_experience_page
    • First observedsf_create_experience_site
    • First observedsf_create_external_data_source
    • First observedsf_create_external_id_field
    • First observedsf_create_external_object
    • First observedsf_create_field_dependency
    • First observedsf_create_field_level_security
    • First observedsf_create_field_set
    • First observedsf_create_field_update
    • First observedsf_create_flexcard
    • First observedsf_create_flexipage
    • First observedsf_create_flow
    • First observedsf_create_flow_from_xml
    • First observedsf_create_forecast_hierarchy
    • First observedsf_create_formula_field
    • First observedsf_create_global_action
    • First observedsf_create_global_value_set
    • First observedsf_create_holiday
    • First observedsf_create_integration_procedure
    • First observedsf_create_knowledge_article_type
    • First observedsf_create_letterhead
    • First observedsf_create_lightning_app
    • First observedsf_create_list_view
    • First observedsf_create_lwc
    • First observedsf_create_lwc_from_requirements
    • First observedsf_create_lwc_jest_test
    • First observedsf_create_matching_rule
    • First observedsf_create_mcp_server
    • First observedsf_create_mcp_tool
    • First observedsf_create_messaging_channel
    • First observedsf_create_milestone
    • First observedsf_create_muting_permission_set
    • First observedsf_create_named_credential
    • First observedsf_create_next_best_action
    • First observedsf_create_notification_type
    • First observedsf_create_omniscript
    • First observedsf_create_outbound_change_set
    • First observedsf_create_outbound_message
    • First observedsf_create_package
    • First observedsf_create_package_version
    • First observedsf_create_page_layout
    • First observedsf_create_path_assistant
    • First observedsf_create_permission_set
    • First observedsf_create_permission_set_group
    • First observedsf_create_platform_cache_partition
    • First observedsf_create_platform_event
    • First observedsf_create_platform_event_trigger
    • First observedsf_create_presence_configuration
    • First observedsf_create_presence_status
    • First observedsf_create_price_book
    • First observedsf_create_product
    • First observedsf_create_public_group
    • First observedsf_create_push_topic
    • First observedsf_create_queue
    • First observedsf_create_queue_routing_config
    • First observedsf_create_quick_action
    • First observedsf_create_record
    • First observedsf_create_record_type
    • First observedsf_create_remote_site_setting
    • First observedsf_create_report
    • First observedsf_create_report_folder
    • First observedsf_create_report_type
    • First observedsf_create_role
    • First observedsf_create_role_hierarchy
    • First observedsf_create_routing_configuration
    • First observedsf_create_saml_sso_config
    • First observedsf_create_sandbox
    • First observedsf_create_scheduled_flow
    • First observedsf_create_scheduled_job
    • First observedsf_create_scratch_org
    • First observedsf_create_search_layout
    • First observedsf_create_service_channel
    • First observedsf_create_service_territory
    • First observedsf_create_sharing_rule
    • First observedsf_create_skill
    • First observedsf_create_static_resource
    • First observedsf_create_tab
    • First observedsf_create_territory
    • First observedsf_create_user
    • First observedsf_create_user_role_hierarchy
    • First observedsf_create_validation_rule
    • First observedsf_create_visualforce_component
    • First observedsf_create_visualforce_email_template
    • First observedsf_create_visualforce_page
    • First observedsf_create_work_type
    • First observedsf_create_workflow_field_update
    • First observedsf_create_workflow_rule
    • First observedsf_deactivate_flow
    • First observedsf_delete_record
    • First observedsf_delete_scratch_org
    • First observedsf_deploy_metadata
    • First observedsf_describe_object
    • First observedsf_detect_devops_merge_conflict
    • First observedsf_devops_create_work_item
    • First observedsf_devops_promote_work_item
    • First observedsf_enable_debug_logs
    • First observedsf_execute_anonymous_apex
    • First observedsf_explore_slds_blueprints
    • First observedsf_export_omnistudio_component
    • First observedsf_export_records
    • First observedsf_freeze_user
    • First observedsf_get_apex_class
    • First observedsf_get_apex_test_results
    • First observedsf_get_apex_trigger
    • First observedsf_get_dataraptor
    • First observedsf_get_debug_log_body
    • First observedsf_get_debug_logs
    • First observedsf_get_deployment_history
    • First observedsf_get_event_logs
    • First observedsf_get_field_history
    • First observedsf_get_field_permissions
    • First observedsf_get_flexcard
    • First observedsf_get_flow_errors
    • First observedsf_get_integration_procedure
    • First observedsf_get_login_history
    • First observedsf_get_omniscript
    • First observedsf_get_org_limits
    • First observedsf_get_record
    • First observedsf_get_setup_audit_trail
    • First observedsf_guide_lwc_accessibility
    • First observedsf_import_omnistudio_component
    • First observedsf_install_package
    • First observedsf_list_devops_projects
    • First observedsf_list_devops_work_items
    • First observedsf_list_flow_versions
    • First observedsf_list_mcp_tools
    • First observedsf_list_sandboxes
    • First observedsf_migrate_aura_to_lwc
    • First observedsf_promote_devops_work_item
    • First observedsf_query_records
    • First observedsf_refresh_sandbox
    • First observedsf_reset_user_password
    • First observedsf_resolve_devops_merge_conflict
    • First observedsf_retrieve_metadata
    • First observedsf_run_apex_tests
    • First observedsf_run_code_scanner
    • First observedsf_scan_apex_antipatterns
    • First observedsf_search_records
    • First observedsf_send_email
    • First observedsf_share_report_folder
    • First observedsf_translate_custom_label
    • First observedsf_translate_field_label
    • First observedsf_uninstall_package
    • First observedsf_update_dashboard
    • First observedsf_update_flexcard
    • First observedsf_update_integration_procedure
    • First observedsf_update_lwc
    • First observedsf_update_omniscript
    • First observedsf_update_record
    • First observedsf_update_user
    • First observedsf_upsert_record

TDQS

A4/5.0

Scored across 18 tools

Disambiguation4/5

Most tools target clearly distinct metadata operations, and the verb-first names make the separation obvious. The main ambiguity is between sf_create_custom_field and sf_create_formula_field, since the former says it supports all field types and the latter is specifically for formula fields. sf_find_tool and sf_load_toolset also overlap slightly, though their search/load roles are distinguishable.

Naming Consistency5/5

All tools follow a consistent sf_verb_noun pattern in snake_case, e.g., sf_create_custom_object, sf_deploy_metadata, sf_query_records. Verbs vary by action but are consistently placed first, and the object nouns are descriptive, making the naming highly predictable.

Tool Count3/5

The visible set has 18 tools, which sits in the 16-25 range that starts to feel heavy, and the server further advertises 228 possible tools across lazy-loaded toolsets. The three tool-management tools add overhead, though lazy loading mitigates the context cost.

Completeness4/5

Core metadata lifecycle is covered: creating specific components, deploying/retrieving/deleting generic metadata, checking deploy status, discovering objects, and inspecting dependencies. The main gaps are no inventory listing for existing validation rules or approval processes and reliance on generic deploy for updates, but the toolset/find_tool mechanism lets an agent reach missing capabilities.

Maintenance

ActivityActive
ResponsivenessSlow

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

  • 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
    19
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides comprehensive access to Salesforce Tooling API for metadata management, SOQL queries, code analysis, and debugging through Claude and other AI assistants.
    42
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to interact with Salesforce through MCP, supporting queries, records, metadata, and bulk operations with flexible OAuth authentication.
    16
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying and modifying Salesforce data (Accounts, Contacts, Opportunities, Leads, Cases) via MCP tools.
    42
    MIT