salesforce-metadata-mcp
This MCP server provides 223 tools for building, configuring, automating, and managing Salesforce orgs directly from Claude or any MCP client, covering the full development lifecycle from schema design to Agentforce AI agents.
Objects & Schema: Create and manage custom objects, fields (formula, picklist, lookup), picklist values, custom metadata types/records, custom labels, custom settings, global value sets, record types, business processes, page layouts, compact layouts, and field dependencies. Describe object schemas and audit field permissions.
Automation & Logic: Build Flows (AutoLaunched, Screen, Record-Triggered, Scheduled) with advanced elements (Decision, Record operations, Apex actions, Subflows, Loops, Assignments, Screens). Create approval processes, validation rules, workflow rules (email alerts, field updates, outbound messages), platform events, assignment rules, escalation rules, auto-response rules, matching rules, duplicate rules, Apex email services, and scheduled Apex jobs.
Security & Access: Configure permission sets, permission set groups, muting permission sets, custom permissions, roles, queues, sharing rules, field-level security audits, and named credentials for secure callouts.
UI & Experience: Build Lightning apps, custom tabs, list views, email templates, static resources, custom notification types, report types, dashboards, report/dashboard folders (with sharing), and Experience Cloud sites/pages.
Apex & LWC Development: Deploy and read Apex classes, triggers, test classes; run tests and execute anonymous Apex; retrieve debug logs; scan code for anti-patterns (PMD, SFGE, ESLint, RetireJS). Create, update, and test Lightning Web Components; generate LWCs from requirements; get SLDS blueprints and accessibility guidance; migrate Aura components to LWC.
Agentforce: Build AI agents with actions (GenAiFunction from Flows/Apex), topics, planners, and a guided 5-step sequence.
External Integrations: Set up Connected Apps (OAuth), external client apps, external data sources/objects, remote site settings, and CSP trusted sites.
Data Management: Query with SOQL, perform single-record CRUD, and bulk import/update/delete via Bulk API 2.0.
Deployment & DevOps: Deploy, retrieve, and delete metadata; create and manage outbound change sets; check deployment status.
User & Group Management: Create and update users, assign to queues/public groups.
MCP Server Management: Generate new MCP server projects, add tools, and list existing tools.
Provides tools for managing Salesforce metadata, objects, automation, security, Apex, LWC, Agentforce, and deployments.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@salesforce-metadata-mcpdescribe the Account object schema"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
salesforce-metadata-mcp
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-mcpOr install globally:
npm install -g salesforce-metadata-mcp
salesforce-metadata-mcpRelated 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-mcpThe 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 ( | 20 | ~9,900 |
After loading two more toolsets | 43 | ~20,800 |
| 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, loadsomnistudio, 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, sosf_call_toolcan 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_toolsetchecks 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_toolreaches every tool without needing a re-fetch at all. Combined withsf_tool_schema, the full 228-tool surface is usable from the handshake tool list alone — even underSF_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 |
| Create a custom object with all settings |
| Create a field on any object (all types) |
| Create formula fields with full formula language support |
| Add values to existing picklist fields |
| Create a Custom Metadata Type (__mdt) |
| Create records for a Custom Metadata Type |
| Create or update Custom Labels |
| Create Hierarchy or List Custom Settings |
| Create shared picklist usable across objects |
| Create Record Types with picklist overrides |
| Create Business Processes for Opp/Lead/Case |
| Create Page Layouts with sections and fields |
| Create criteria or ownership sharing rules |
| Create controlling/dependent picklist dependency |
| Read an object's full schema — fields, types, picklist values, child relationships, record types |
| Find objects by partial name or label — the discovery step before |
| Impact analysis: what references this component, and does the field hold data? Read-only |
| Update object-level properties, risk-classified with a confirmation gate |
| Update a field's definition, risk-classified — destructive changes report impact before applying |
Automation
Tool | Description |
| Create any Flow type — Assignment, Decision, GetRecords, CreateRecords (with field values), DeleteRecords, Loop |
| Create multi-step approval processes |
| Create data validation rules |
| Create workflow field update actions |
| Create workflow email alert actions |
| Create Platform Event objects |
| Create Lead/Case assignment rules |
| Create Case escalation rules |
| Create Web-to-Lead/Case auto-response rules |
| Create duplicate matching rules |
| Create duplicate detection rules |
| Create inbound Apex email services |
| Schedule an Apex class via cron |
Security & Access
Tool | Description |
| Create Permission Sets with all permissions |
| Create roles in the role hierarchy |
| Create queues with members and objects |
| Create Named Credentials for callouts |
| Audit current field-level security grants across Profiles and Permission Sets |
UI & Experience
Tool | Description |
| Create Lightning Apps with nav/utility bars |
| Create Custom Tabs for objects |
| Create Compact Layouts (highlights panel) |
| Create List Views with filters and columns |
| Create HTML/text email templates |
| Create Static Resources from text content |
| Create Custom Notification Types |
| Create Custom Report Types |
| Create Dashboards with components |
Apex Development
Tool | Description |
| Deploy any Apex class to the org |
| Deploy an Apex trigger on any object |
| Deploy test classes, optionally run tests |
| Run test classes and get pass/fail results |
| Execute anonymous Apex and see output |
| Read the source of an existing Apex class |
| Read the source of an existing Apex trigger |
| Turn on Apex debug logging for a user (TraceFlag) |
| Turn Apex debug logging back off (deletes active TraceFlags) |
| List recent Apex debug logs |
| Read the full content of a debug log |
| Lightweight heuristic scan for SOQL/DML-in-loop, hardcoded IDs, debug statements |
| Multi-engine static analysis (PMD, SFGE SOQL-injection data-flow, RetireJS, ESLint) via Salesforce Code Analyzer |
LWC Development
Tool | Description |
| Deploy a full LWC with HTML, JS, CSS |
| Update an existing LWC component |
Experience Cloud
Tool | Description |
| Create Experience Cloud sites |
| Create pages within Experience sites |
Agentforce
Tool | Description |
| Create Agentforce Agent (Bot shell) |
| Create Agent Actions (GenAiFunction) linked to Flows/Apex |
| Create Agent Topics (GenAiPlugin) with actions wired in |
| Wire agent to its topics (GenAiPlanner) — required for routing |
External Integrations
Tool | Description |
| Create OAuth Connected Apps |
| 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 |
| Create External Data Sources for Connect |
| Create External Objects (__x) |
| Whitelist external URLs for callouts |
| Create CSP trusted sites for LWC |
Change Sets & Deployment
Tool | Description |
| Create Outbound Change Sets |
| Add components to a change set |
| Deploy metadata via Metadata API (supports |
| Check deployment job status |
| Retrieve metadata from the org |
| Permanently delete metadata components (CustomObject, CustomField, Flow, GenAiFunction, Bot, etc.) |
MCP Server Management
Tool | Description |
| Generate a new MCP server project on disk |
| Add a new tool to an existing MCP server |
| 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 |
| Your org URL (e.g. https://org.salesforce.com) | Always |
| Connected App client ID | For OAuth |
| Connected App client secret | For OAuth |
| OAuth refresh token | For OAuth |
| Salesforce CLI org alias | For CLI |
| Static access token (expires ~1hr) | For static |
| HTTP server port (default: 3000) | For HTTP mode |
|
| Optional |
| Toolsets to load at startup: | Optional |
| Set to | Optional |
|
| 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 |
| Destroys metadata and every record in it |
| Destroy data |
| Arbitrary code that leaves no artifact behind |
| Removes a managed package and its data |
| Privilege escalation |
| 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 allThe 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
SETUP.md — Prerequisites, authentication, Claude configuration
TOOLS.md — All 228 tools with full parameter documentation
AGENTFORCE.md — Agentforce agent creation guide
APEX_LWC.md — Apex and LWC development guide
CHANGELOG.md — Version history
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 toolssf_add_picklist_valuesAdd Picklist Values to Existing FieldAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | New picklist values to add (existing values are preserved) | |
| objectFieldFullName | Yes | Full API name of the picklist field, e.g. 'Invoice__c.Status__c' |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| deployId | Yes | Deploy async job ID returned from sf_deploy_metadata |
TDQS
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.
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.
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.
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.
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.
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 ProcessAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Human-readable label, e.g. 'Large Deal Approval Process' | |
| active | No | Activate immediately (warning: cannot change steps after activation) | |
| objectName | Yes | Object API name, e.g. 'Opportunity' or 'Leave_Request__c' | |
| allowRecall | No | Allow submitters to recall approval requests | |
| description | No | Description of the approval process | |
| processName | Yes | API name of the process, e.g. 'Large_Deal_Approval' | |
| entryFormula | No | Formula records must satisfy to enter this process | |
| approvalSteps | Yes | Ordered list of approval steps | |
| emailTemplate | No | Email template for approval notifications, e.g. 'unfiled$public/ApprovalEmail' | |
| allowedSubmitters | Yes | Who can submit: [{type:'owner'}] or [{type:'role', submitter:'SalesRep'}] | |
| finalApprovalLock | No | Lock record after final approval | |
| recordEditability | No | Who can edit locked records during approval | AdminOnly |
| finalRejectionLock | No | Lock record after final rejection | |
| entryFilterCriteria | No | Filter criteria alternative to entryFormula |
TDQS
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.
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.
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.
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.
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.
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 FieldAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Salesforce field type | |
| label | Yes | Display label for the field, e.g. 'Status' | |
| scale | No | Decimal places for Number/Currency/Percent (0–17) | |
| length | No | Max length. Text/TextArea: 1–255 (default 255). LongTextArea/Html (Text Area Long / Rich Text Area): 256–131072 (default 32768). | |
| unique | No | Whether values must be unique (Text, Number, Email) | |
| required | No | Whether the field is required on page layouts | |
| fieldName | Yes | API name of the field, e.g. 'Status__c' | |
| precision | No | Total digits for Number/Currency/Percent (1–18) | |
| externalId | No | Whether this field is an external ID | |
| objectName | Yes | API name of the parent object, e.g. 'Account' or 'Invoice__c' | |
| description | No | Optional description for the field | |
| referenceTo | No | Target object API name for Lookup/MasterDetail, e.g. 'Account' | |
| defaultValue | No | Default value for the field. Use true/false for Checkbox fields. | |
| visibleLines | No | Visible lines. Required for LongTextArea and Html (Text Area Long / Rich Text Area) — default 10. Also used for MultiselectPicklist. | |
| picklistValues | No | Picklist configuration. Required for Picklist / MultiselectPicklist types. | |
| deleteConstraint | No | Delete behaviour for Lookup fields: 'Cascade', 'Restrict', or 'SetNull' | |
| relationshipName | No | API name for the relationship (no spaces) | |
| relationshipLabel | No | Label for the relationship on the related object |
TDQS
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.
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.
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.
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.
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.
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 ObjectAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Singular label shown in the UI, e.g. 'Invoice' | |
| fullName | Yes | API name of the custom object, e.g. 'Invoice__c' | |
| description | No | Optional description for the object | |
| pluralLabel | Yes | Plural label, e.g. 'Invoices' | |
| enableSearch | No | Enable search on this object | |
| sharingModel | No | OWD sharing model for the object | ReadWrite |
| enableHistory | No | Enable field history tracking | |
| enableReports | No | Make the object available for reports | |
| nameFieldType | No | Type of Name field: 'Text' (free-form) or 'AutoNumber' (auto-increment) | Text |
| nameFieldLabel | No | Label for the standard Name field, e.g. 'Invoice Name' | Name |
| autoNumberFormat | No | Format for AutoNumber name field, e.g. 'INV-{0000}'. Required when nameFieldType is AutoNumber. | |
| deploymentStatus | No | Deployment status of the object | Deployed |
| enableActivities | No | Allow activities (tasks/events) on this object |
TDQS
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.
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.
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.
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.
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.
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 FieldAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Field label | |
| scale | No | Decimal places for Number/Currency/Percent return types | |
| formula | Yes | Salesforce 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. | |
| fieldName | Yes | Field name without __c suffix | |
| precision | No | Total number of digits for Number/Currency/Percent return types (default 18) | |
| returnType | Yes | Formula return type | |
| description | No | Field description | |
| objectApiName | Yes | Object API name, e.g. 'Opportunity' | |
| formulaTreatBlanksAs | No | How to treat blank fields in the formula. Defaults to BlankAsZero for numeric types, BlankAsLogicalFalse for Checkbox. |
TDQS
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.
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.
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.
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.
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.
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 RuleAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| active | No | Whether the rule is active | |
| ruleName | Yes | API name for the rule, e.g. 'Require_Close_Date' | |
| objectName | Yes | Object API name, e.g. 'Account', 'Opportunity', 'Invoice__c' | |
| description | No | Description of this validation rule | |
| errorMessage | Yes | Error shown to user when validation fails (max 255 chars) | |
| errorDisplayField | No | Field API name to display error next to, e.g. 'CloseDate'. Blank = top of page. | |
| errorConditionFormula | Yes | Formula returning TRUE when data is INVALID, e.g. "AND(ISPICKVAL(StageName,'Closed Won'),ISBLANK(CloseDate))" |
TDQS
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.
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.
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.
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.
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.
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 ActionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | Field API name to update, e.g. 'StageName' | |
| label | Yes | Human-readable label | |
| formula | No | Formula for the new value, e.g. 'TODAY()' | |
| nullValue | No | Set the field to null/blank | |
| actionName | Yes | API name of the action, e.g. 'Set_Stage_Closed_Won' | |
| objectName | Yes | Object API name, e.g. 'Opportunity' | |
| literalValue | No | Literal string/picklist value to set | |
| notifyAssignee | No | Notify owner/assignee after update |
TDQS
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.
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.
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.
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.
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.
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 MetadataADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fullNames | Yes | Full 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. | |
| metadataType | Yes | Metadata type to delete, e.g. 'CustomObject', 'CustomField', 'Flow', 'GenAiFunction', 'GenAiPlugin', 'GenAiPlannerBundle', 'Bot' |
TDQS
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.
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.
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.
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.
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.
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 MetadataAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| runTests | No | Test classes to run during deployment | |
| checkOnly | No | Validate only, do not actually deploy | |
| testLevel | No | Test level: NoTestRun, RunSpecifiedTests, RunLocalTests, or RunAllTestsInOrg | |
| components | No | Metadata 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. | |
| waitMinutes | No | Max minutes to wait for deploy to complete | |
| componentsXml | No | Optional 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. | |
| rollbackOnError | No | Roll back all changes if any component fails |
TDQS
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.
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.
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.
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.
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.
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 SchemaARead-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)
| Name | Required | Description | Default |
|---|---|---|---|
| fieldsOnly | No | If 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. | |
| objectApiName | Yes | SObject API name to describe, e.g. 'Account', 'My_Object__c' | |
| waitForFields | No | 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. | |
| timeoutSeconds | No | Max time to poll when waitForFields is set. Ignored otherwise. |
TDQS
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.
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.
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.
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.
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.
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 ToolAIdempotent
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".
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What you are looking for, e.g. "validation rule" or "create flow". | |
| autoLoad | No | Load the toolsets containing the matches so they become callable straight away. Default true. |
TDQS
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.
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.
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.
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.
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.
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 AnalysisARead-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".
| Name | Required | Description | Default |
|---|---|---|---|
| componentId | No | Salesforce Id of the component, as an alternative to type+name (required for types not in the supported list). | |
| includeUses | No | Also return what this component itself depends on (the reverse direction). | |
| componentName | No | Component API name. For CustomField use 'Object.Field__c', e.g. 'Account.Revenue__c'. | |
| componentType | No | Metadata type: CustomField, CustomObject, ApexClass, ApexTrigger, Flow, ValidationRule, Layout, PermissionSet, LightningComponentBundle, AuraDefinitionBundle, StaticResource, ApexPage, ApexComponent |
TDQS
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.
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.
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.
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.
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.
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 ObjectsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum objects to return | |
| objectType | No | Restrict to custom or standard objects | all |
| searchTerm | No | Partial API name or label to match, case-insensitive. Omit to list everything. Results rank exact matches first, then prefix, then substring. | |
| queryableOnly | No | Only return objects that support SOQL queries |
TDQS
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.
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.
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.
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.
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.
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 ToolsetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 ToolsetAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| toolsets | Yes | Toolset 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
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.
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.
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.
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.
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.
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)ARead-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").
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records to return (default 200) | |
| query | Yes | Full SOQL query string, e.g. 'SELECT Id, Name FROM Account WHERE Industry = \'Technology\' LIMIT 10' |
TDQS
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.
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.
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.
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.
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.
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 MetadataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| components | No | Metadata components to retrieve | |
| packageXml | No | Raw package.xml content for selective retrieve. If provided, components list is ignored. | |
| metadataType | No | Single metadata type (alternative to components array) | |
| componentName | No | Single component name (used with metadataType) |
TDQS
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.
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.
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.
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.
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.
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.
215 tool updates
v3.0.0- Removed
sf_activate_flexcard - Removed
sf_activate_flow - Removed
sf_activate_integration_procedure - Removed
sf_activate_omniscript - Removed
sf_add_to_change_set - Removed
sf_assign_layout_to_record_type - Removed
sf_assign_presence_status - Removed
sf_assign_queue_member - Removed
sf_assign_skill_to_agent - Removed
sf_assign_territory_to_user - Removed
sf_bulk_delete_records - Removed
sf_bulk_import_records - Removed
sf_bulk_insert_records - Removed
sf_bulk_update_records - Removed
sf_check_code_coverage - Removed
sf_check_devops_commit_status - Removed
sf_checkout_devops_work_item - Removed
sf_commit_devops_work_item - Removed
sf_configure_change_data_capture - Removed
sf_create_agent - Removed
sf_create_agent_action - Removed
sf_create_agent_planner - Removed
sf_create_agent_topic - Removed
sf_create_apex_class - Removed
sf_create_apex_email_service - Removed
sf_create_apex_test_class - Removed
sf_create_apex_trigger - Removed
sf_create_assignment_rule - Removed
sf_create_aura_app - Removed
sf_create_aura_component - Removed
sf_create_aura_event - Removed
sf_create_auth_provider - Removed
sf_create_auto_response_rule - Removed
sf_create_bot_routing - Removed
sf_create_business_hours - Removed
sf_create_business_process - Removed
sf_create_calculation_matrix - Removed
sf_create_calculation_procedure - Removed
sf_create_chat_button - Removed
sf_create_compact_layout - Removed
sf_create_connected_app - Removed
sf_create_connected_app_oauth_policy - Removed
sf_create_csp_setting - Removed
sf_create_custom_application - Removed
sf_create_custom_button - Removed
sf_create_custom_label - Removed
sf_create_custom_metadata_record - Removed
sf_create_custom_metadata_type - Removed
sf_create_custom_notification_type - Removed
sf_create_custom_permission - Removed
sf_create_custom_setting - Removed
sf_create_custom_tab - Removed
sf_create_dashboard - Removed
sf_create_data_category - Removed
sf_create_dataraptor - Removed
sf_create_devops_pull_request - Removed
sf_create_document_generation - Removed
sf_create_duplicate_rule - Removed
sf_create_einstein_bot - Removed
sf_create_einstein_prediction - Removed
sf_create_email_alert - Removed
sf_create_email_template - Removed
sf_create_embedded_service - Removed
sf_create_entitlement_process - Removed
sf_create_escalation_rule - Removed
sf_create_experience_page - Removed
sf_create_experience_site - Removed
sf_create_external_client_app - Removed
sf_create_external_data_source - Removed
sf_create_external_id_field - Removed
sf_create_external_object - Removed
sf_create_field_dependency - Removed
sf_create_field_level_security - Removed
sf_create_field_set - Removed
sf_create_field_update - Removed
sf_create_flexcard - Removed
sf_create_flexipage - Removed
sf_create_flow - Removed
sf_create_flow_from_xml - Removed
sf_create_forecast_hierarchy - Removed
sf_create_global_action - Removed
sf_create_global_value_set - Removed
sf_create_holiday - Removed
sf_create_integration_procedure - Removed
sf_create_knowledge_article_type - Removed
sf_create_letterhead - Removed
sf_create_lightning_app - Removed
sf_create_list_view - Removed
sf_create_lwc - Removed
sf_create_lwc_from_requirements - Removed
sf_create_lwc_jest_test - Removed
sf_create_matching_rule - Removed
sf_create_mcp_server - Removed
sf_create_mcp_tool - Removed
sf_create_messaging_channel - Removed
sf_create_milestone - Removed
sf_create_muting_permission_set - Removed
sf_create_named_credential - Removed
sf_create_next_best_action - Removed
sf_create_notification_type - Removed
sf_create_omniscript - Removed
sf_create_outbound_change_set - Removed
sf_create_outbound_message - Removed
sf_create_package - Removed
sf_create_package_version - Removed
sf_create_page_layout - Removed
sf_create_path_assistant - Removed
sf_create_permission_set - Removed
sf_create_permission_set_group - Removed
sf_create_platform_cache_partition - Removed
sf_create_platform_event - Removed
sf_create_platform_event_trigger - Removed
sf_create_presence_configuration - Removed
sf_create_presence_status - Removed
sf_create_price_book - Removed
sf_create_product - Removed
sf_create_public_group - Removed
sf_create_push_topic - Removed
sf_create_queue - Removed
sf_create_queue_routing_config - Removed
sf_create_quick_action - Removed
sf_create_record - Removed
sf_create_record_type - Removed
sf_create_remote_site_setting - Removed
sf_create_report - Removed
sf_create_report_folder - Removed
sf_create_report_type - Removed
sf_create_role - Removed
sf_create_role_hierarchy - Removed
sf_create_routing_configuration - Removed
sf_create_saml_sso_config - Removed
sf_create_sandbox - Removed
sf_create_scheduled_flow - Removed
sf_create_scheduled_job - Removed
sf_create_scratch_org - Removed
sf_create_search_layout - Removed
sf_create_service_channel - Removed
sf_create_service_territory - Removed
sf_create_sharing_rule - Removed
sf_create_skill - Removed
sf_create_static_resource - Removed
sf_create_tab - Removed
sf_create_territory - Removed
sf_create_user - Removed
sf_create_user_role_hierarchy - Removed
sf_create_visualforce_component - Removed
sf_create_visualforce_email_template - Removed
sf_create_visualforce_page - Removed
sf_create_work_type - Removed
sf_create_workflow_rule - Removed
sf_deactivate_flow - Removed
sf_delete_record - Removed
sf_delete_scratch_org - Removed
sf_detect_devops_merge_conflict - Removed
sf_devops_create_work_item - Removed
sf_devops_promote_work_item - Removed
sf_enable_debug_logs - Removed
sf_execute_anonymous_apex - Removed
sf_explore_slds_blueprints - Removed
sf_export_omnistudio_component - Removed
sf_export_records - Added
sf_find_tool - Removed
sf_freeze_user - Removed
sf_get_apex_class - Removed
sf_get_apex_test_results - Removed
sf_get_apex_trigger - Removed
sf_get_dataraptor - Removed
sf_get_debug_log_body - Removed
sf_get_debug_logs - Removed
sf_get_deployment_history - Removed
sf_get_event_logs - Removed
sf_get_field_history - Removed
sf_get_field_permissions - Removed
sf_get_flexcard - Removed
sf_get_flow_errors - Removed
sf_get_integration_procedure - Removed
sf_get_login_history - Added
sf_get_metadata_dependencies - Removed
sf_get_omniscript - Removed
sf_get_org_limits - Removed
sf_get_record - Removed
sf_get_setup_audit_trail - Removed
sf_guide_lwc_accessibility - Removed
sf_import_omnistudio_component - Removed
sf_install_package - Removed
sf_list_devops_projects - Removed
sf_list_devops_work_items - Removed
sf_list_flow_versions - Removed
sf_list_mcp_tools - Added
sf_list_objects - Removed
sf_list_sandboxes - Added
sf_list_toolsets - Added
sf_load_toolset - Removed
sf_migrate_aura_to_lwc - Removed
sf_promote_devops_work_item - Removed
sf_refresh_sandbox - Removed
sf_reset_user_password - Removed
sf_resolve_devops_merge_conflict - Removed
sf_run_apex_tests - Removed
sf_run_code_scanner - Removed
sf_scan_apex_antipatterns - Removed
sf_search_records - Removed
sf_send_email - Removed
sf_share_report_folder - Removed
sf_translate_custom_label - Removed
sf_translate_field_label - Removed
sf_uninstall_package - Removed
sf_update_dashboard - Removed
sf_update_flexcard - Removed
sf_update_integration_procedure - Removed
sf_update_lwc - Removed
sf_update_omniscript - Removed
sf_update_record - Removed
sf_update_user - Removed
sf_upsert_record
7 tool updates
v2.8.7- Changed
sf_create_agent1 field changed- added
Input schema / properties / skipActionCapabilityCheckAdded 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" +}
- Changed
sf_create_agent_action2 fields changed- changed
Input schema / properties / label / descriptionPrevious value: -"Action label"New value: +"Action label. Defaults to actionName if omitted." - changed
Input schema / requiredPrevious value: -[ - "actionName", - "label", - "description", - "type", - "reference" -]New value: +[ + "actionName", + "description", + "type", + "reference" +]
- Changed
sf_create_connected_app3 fields changed- added
Input schema / properties / enableClientCredentialsFlowAdded 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" +} - changed
Input schema / properties / scopes / descriptionPrevious 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." - changed
Input schema / properties / scopes / items / enumPrevious 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" +]
- Added
sf_create_external_client_app - Changed
sf_create_flow15 fields changed- added
Input schema / properties / elements / items / properties / assignments / items / properties / value / $refAdded value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue" - changed
Input schema / properties / elements / items / properties / assignments / items / properties / value / descriptionPrevious value: -"Literal value"New value: +"Literal value — string, number, or boolean; typed XML element chosen automatically." - removed
Input schema / properties / elements / items / properties / assignments / items / properties / value / typeRemoved value: -"string" - changed
Input schema / properties / elements / items / properties / conditions / items / properties / rightValue / descriptionPrevious 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'." - changed
Input schema / properties / elements / items / properties / conditions / items / properties / rightValue / typePrevious value: -"string"New value: +[ + "string", + "number", + "boolean" +] - added
Input schema / properties / elements / items / properties / filterValue / $refAdded value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue" - changed
Input schema / properties / elements / items / properties / filterValue / descriptionPrevious 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." - removed
Input schema / properties / elements / items / properties / filterValue / typeRemoved value: -"string" - added
Input schema / properties / elements / items / properties / filters / items / properties / value / $refAdded value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue" - changed
Input schema / properties / elements / items / properties / filters / items / properties / value / descriptionPrevious 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." - removed
Input schema / properties / elements / items / properties / filters / items / properties / value / typeRemoved value: -"string" - added
Input schema / properties / elements / items / properties / inputAssignments / items / properties / value / $refAdded value: +"#/properties/elements/items/properties/conditions/items/properties/rightValue" - changed
Input schema / properties / elements / items / properties / inputAssignments / items / properties / value / descriptionPrevious value: -"Literal value to set"New value: +"Literal value to set — string, number, or boolean; typed XML element chosen automatically." - removed
Input schema / properties / elements / items / properties / inputAssignments / items / properties / value / typeRemoved value: -"string" - changed
Input schema / properties / textTemplates / items / properties / text / descriptionPrevious 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."
- Added
sf_delete_metadata - Changed
sf_describe_object2 fields changed- added
Input schema / properties / timeoutSecondsAdded value: +{ + "default": 60, + "description": "Max time to poll when waitForFields is set. Ignored otherwise.", + "maximum": 300, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / waitForFieldsAdded 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" +}
221 tool updates
v2.8.5- First observed
sf_activate_flexcard - First observed
sf_activate_flow - First observed
sf_activate_integration_procedure - First observed
sf_activate_omniscript - First observed
sf_add_picklist_values - First observed
sf_add_to_change_set - First observed
sf_assign_layout_to_record_type - First observed
sf_assign_presence_status - First observed
sf_assign_queue_member - First observed
sf_assign_skill_to_agent - First observed
sf_assign_territory_to_user - First observed
sf_bulk_delete_records - First observed
sf_bulk_import_records - First observed
sf_bulk_insert_records - First observed
sf_bulk_update_records - First observed
sf_check_code_coverage - First observed
sf_check_deploy_status - First observed
sf_check_devops_commit_status - First observed
sf_checkout_devops_work_item - First observed
sf_commit_devops_work_item - First observed
sf_configure_change_data_capture - First observed
sf_create_agent - First observed
sf_create_agent_action - First observed
sf_create_agent_planner - First observed
sf_create_agent_topic - First observed
sf_create_apex_class - First observed
sf_create_apex_email_service - First observed
sf_create_apex_test_class - First observed
sf_create_apex_trigger - First observed
sf_create_approval_process - First observed
sf_create_assignment_rule - First observed
sf_create_aura_app - First observed
sf_create_aura_component - First observed
sf_create_aura_event - First observed
sf_create_auth_provider - First observed
sf_create_auto_response_rule - First observed
sf_create_bot_routing - First observed
sf_create_business_hours - First observed
sf_create_business_process - First observed
sf_create_calculation_matrix - First observed
sf_create_calculation_procedure - First observed
sf_create_chat_button - First observed
sf_create_compact_layout - First observed
sf_create_connected_app - First observed
sf_create_connected_app_oauth_policy - First observed
sf_create_csp_setting - First observed
sf_create_custom_application - First observed
sf_create_custom_button - First observed
sf_create_custom_field - First observed
sf_create_custom_label - First observed
sf_create_custom_metadata_record - First observed
sf_create_custom_metadata_type - First observed
sf_create_custom_notification_type - First observed
sf_create_custom_object - First observed
sf_create_custom_permission - First observed
sf_create_custom_setting - First observed
sf_create_custom_tab - First observed
sf_create_dashboard - First observed
sf_create_data_category - First observed
sf_create_dataraptor - First observed
sf_create_devops_pull_request - First observed
sf_create_document_generation - First observed
sf_create_duplicate_rule - First observed
sf_create_einstein_bot - First observed
sf_create_einstein_prediction - First observed
sf_create_email_alert - First observed
sf_create_email_template - First observed
sf_create_embedded_service - First observed
sf_create_entitlement_process - First observed
sf_create_escalation_rule - First observed
sf_create_experience_page - First observed
sf_create_experience_site - First observed
sf_create_external_data_source - First observed
sf_create_external_id_field - First observed
sf_create_external_object - First observed
sf_create_field_dependency - First observed
sf_create_field_level_security - First observed
sf_create_field_set - First observed
sf_create_field_update - First observed
sf_create_flexcard - First observed
sf_create_flexipage - First observed
sf_create_flow - First observed
sf_create_flow_from_xml - First observed
sf_create_forecast_hierarchy - First observed
sf_create_formula_field - First observed
sf_create_global_action - First observed
sf_create_global_value_set - First observed
sf_create_holiday - First observed
sf_create_integration_procedure - First observed
sf_create_knowledge_article_type - First observed
sf_create_letterhead - First observed
sf_create_lightning_app - First observed
sf_create_list_view - First observed
sf_create_lwc - First observed
sf_create_lwc_from_requirements - First observed
sf_create_lwc_jest_test - First observed
sf_create_matching_rule - First observed
sf_create_mcp_server - First observed
sf_create_mcp_tool - First observed
sf_create_messaging_channel - First observed
sf_create_milestone - First observed
sf_create_muting_permission_set - First observed
sf_create_named_credential - First observed
sf_create_next_best_action - First observed
sf_create_notification_type - First observed
sf_create_omniscript - First observed
sf_create_outbound_change_set - First observed
sf_create_outbound_message - First observed
sf_create_package - First observed
sf_create_package_version - First observed
sf_create_page_layout - First observed
sf_create_path_assistant - First observed
sf_create_permission_set - First observed
sf_create_permission_set_group - First observed
sf_create_platform_cache_partition - First observed
sf_create_platform_event - First observed
sf_create_platform_event_trigger - First observed
sf_create_presence_configuration - First observed
sf_create_presence_status - First observed
sf_create_price_book - First observed
sf_create_product - First observed
sf_create_public_group - First observed
sf_create_push_topic - First observed
sf_create_queue - First observed
sf_create_queue_routing_config - First observed
sf_create_quick_action - First observed
sf_create_record - First observed
sf_create_record_type - First observed
sf_create_remote_site_setting - First observed
sf_create_report - First observed
sf_create_report_folder - First observed
sf_create_report_type - First observed
sf_create_role - First observed
sf_create_role_hierarchy - First observed
sf_create_routing_configuration - First observed
sf_create_saml_sso_config - First observed
sf_create_sandbox - First observed
sf_create_scheduled_flow - First observed
sf_create_scheduled_job - First observed
sf_create_scratch_org - First observed
sf_create_search_layout - First observed
sf_create_service_channel - First observed
sf_create_service_territory - First observed
sf_create_sharing_rule - First observed
sf_create_skill - First observed
sf_create_static_resource - First observed
sf_create_tab - First observed
sf_create_territory - First observed
sf_create_user - First observed
sf_create_user_role_hierarchy - First observed
sf_create_validation_rule - First observed
sf_create_visualforce_component - First observed
sf_create_visualforce_email_template - First observed
sf_create_visualforce_page - First observed
sf_create_work_type - First observed
sf_create_workflow_field_update - First observed
sf_create_workflow_rule - First observed
sf_deactivate_flow - First observed
sf_delete_record - First observed
sf_delete_scratch_org - First observed
sf_deploy_metadata - First observed
sf_describe_object - First observed
sf_detect_devops_merge_conflict - First observed
sf_devops_create_work_item - First observed
sf_devops_promote_work_item - First observed
sf_enable_debug_logs - First observed
sf_execute_anonymous_apex - First observed
sf_explore_slds_blueprints - First observed
sf_export_omnistudio_component - First observed
sf_export_records - First observed
sf_freeze_user - First observed
sf_get_apex_class - First observed
sf_get_apex_test_results - First observed
sf_get_apex_trigger - First observed
sf_get_dataraptor - First observed
sf_get_debug_log_body - First observed
sf_get_debug_logs - First observed
sf_get_deployment_history - First observed
sf_get_event_logs - First observed
sf_get_field_history - First observed
sf_get_field_permissions - First observed
sf_get_flexcard - First observed
sf_get_flow_errors - First observed
sf_get_integration_procedure - First observed
sf_get_login_history - First observed
sf_get_omniscript - First observed
sf_get_org_limits - First observed
sf_get_record - First observed
sf_get_setup_audit_trail - First observed
sf_guide_lwc_accessibility - First observed
sf_import_omnistudio_component - First observed
sf_install_package - First observed
sf_list_devops_projects - First observed
sf_list_devops_work_items - First observed
sf_list_flow_versions - First observed
sf_list_mcp_tools - First observed
sf_list_sandboxes - First observed
sf_migrate_aura_to_lwc - First observed
sf_promote_devops_work_item - First observed
sf_query_records - First observed
sf_refresh_sandbox - First observed
sf_reset_user_password - First observed
sf_resolve_devops_merge_conflict - First observed
sf_retrieve_metadata - First observed
sf_run_apex_tests - First observed
sf_run_code_scanner - First observed
sf_scan_apex_antipatterns - First observed
sf_search_records - First observed
sf_send_email - First observed
sf_share_report_folder - First observed
sf_translate_custom_label - First observed
sf_translate_field_label - First observed
sf_uninstall_package - First observed
sf_update_dashboard - First observed
sf_update_flexcard - First observed
sf_update_integration_procedure - First observed
sf_update_lwc - First observed
sf_update_omniscript - First observed
sf_update_record - First observed
sf_update_user - First observed
sf_upsert_record
TDQS
Scored across 18 tools
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.
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.
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.
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
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
Salesforce-grounded retrieval, diagnoses, and a vetted-Force marketplace for MCP clients.
Let AI agents query data and act across all your business apps via MCP.
327 dev tools via REST API and MCP. Generate Dockerfiles, schemas, K8s, APIs, and more.
100+ MCP tools for AI agents: content metadata, trade intelligence, business-expertise analysis.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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.819MIT
- AlicenseNot gradedqualityDmaintenanceAn 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.425MIT
- AlicenseAqualityCmaintenanceEnables AI agents to interact with Salesforce through MCP, supporting queries, records, metadata, and bulk operations with flexible OAuth authentication.16MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying and modifying Salesforce data (Accounts, Contacts, Opportunities, Leads, Cases) via MCP tools.42MIT