Salesforce MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SF_CLIENT_ID | Yes | The Salesforce connected app client ID | |
| SF_LOGIN_URL | Yes | The Salesforce login URL, e.g. https://your-domain.my.salesforce.com | |
| MCP_TRANSPORT | No | The MCP transport to use: 'stdio' or 'http' (defaults vary by packaging; Python defaults to stdio, Docker defaults to HTTP). | stdio |
| SF_CLIENT_SECRET | Yes | The Salesforce connected app client secret |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| sf_queryB | Run a SOQL query and return matching records. Follows |
| sf_searchA | Run a raw SOSL search and return matching records grouped by object type. Example: FIND {Acme} IN ALL FIELDS RETURNING Account(Name), Contact(Name, Email) Complements sf_query: SOSL matches keywords across multiple object types and text fields at once, where SOQL needs an exact object and field match. |
| sf_get_recordA | Fetch a single record by ID. Pass |
| sf_create_recordC | Create a new record of the given object type with the given field values. |
| sf_update_recordC | Update an existing record's field values. |
| sf_upsert_recordA | Create or update a record identified by an external ID field. The standard idempotent create-or-update integration pattern: safe to call repeatedly with the same external ID without creating duplicates. |
| sf_delete_recordC | Delete a record by ID. |
| sf_describe_objectB | Return field metadata (names, types, picklist values, etc.) for one object. |
| sf_list_objectsA | List objects available in the org (global describe), for discoverability. A Developer Edition org alone has 800+ standard objects, so the
result is trimmed to name/label/custom/queryable/createable/
updateable/deletable per object rather than Salesforce's full raw
payload. Narrow further with |
| sf_bulk_queryA | Run a SOQL query via Bulk API 2.0, for result sets too large for sf_query. Slower (job-based, polls until complete) but not subject to sf_query's interactive per-request limits. Prefer sf_query for everyday lookups; reach for this when you expect a very large result set. |
| sf_bulk_loadA | Insert/update/upsert/delete a batch of records via Bulk API 2.0. Use for record volumes too large for sf_create_record/sf_update_record's
one-record-per-call REST endpoints. |
| sf_compositeA | Bundle multiple sub-requests into one atomic Salesforce API call. Each entry in |
| sf_api_usageA | Report current Salesforce REST API usage against the org's daily limit. Reads the |
| sf_call_apex_restA | Call a custom Apex REST endpoint exposed by the org. For any org-specific capability beyond this server's built-in
standard-API tools: an Apex class annotated This is a thin, generic pass-through — it has no idea what any particular custom endpoint does, expects, or returns; that's between the caller and whatever the org's Apex class implements. |
| sf_org_healthA | Report the org's overall health: what kind of org it is, current API/ storage/async limits, and license seat usage (user licenses, permission set licenses, installed package licenses). A heavier, broader report than sf_api_usage (which only checks the daily API request limit) — use this for "what does this org have and how much of it is used", not for a quick mid-conversation limit check. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| summarize_account | Summarize an Account's health: recent opportunities, open cases, and recommended next steps, using live data pulled from the org. |
| draft_followup_email | Draft a follow-up email for an Opportunity, based on its stage and recent logged activity, using live data pulled from the org. |
| data_hygiene_check | Ask the model to find data-quality issues (likely duplicates, missing required fields) for a given object, using the query/search tools directly rather than pre-fetched data. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Salesforce objects | Global describe: every object available in the org. |
TDQS
Scored across 15 tools
Each tool targets a clearly distinct capability: CRUD, SOQL query, SOSL search, bulk operations, composite calls, metadata lookup, API usage, and org health. Near-overlapping tools like sf_query vs sf_bulk_query and sf_api_usage vs sf_org_health are explicitly differentiated in their descriptions.
The sf_ prefix and snake_case style are consistent, and core record operations follow a clear verb_noun pattern. Minor deviations exist with noun-style names like sf_composite, sf_api_usage, and sf_org_health, but the overall pattern remains predictable.
At 15 tools, the server sits at the upper end of the ideal range but every tool earns its place given Salesforce's broad API surface. There is no obvious redundancy or bloat; the count feels well-scoped for the domain.
The tool set covers the full standard record lifecycle (create, read, update, upsert, delete), plus query/search, metadata discovery, bulk processing, composite transactions, custom Apex REST calls, and API/org health checks. No critical dead ends exist for typical Salesforce integration workflows.