<!-- Generated by `just docs` from catalog/toolkits/salesforce.yaml, catalog/expansions/salesforce.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Salesforce

CRM for sales and service. Manage accounts, contacts, leads, opportunities, and cases, log activity, and query with SOQL.

| Property | Value |
| --- | --- |
| Slug | `salesforce` |
| Definition version | `0.1.0` |
| Base URL | `https://your-instance.my.salesforce.com` |
| Auth schemes | `oauth2` |
| Action tools | 40 |
| By class | 17 read, 17 write, 6 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

60 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 40 cases written by hand and 20 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 28/60 | 46.7% |
| top-8 | 51/60 | 85.0% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://login.salesforce.com/services/oauth2/authorize` |
| Token URL | `https://login.salesforce.com/services/oauth2/token` |
| Default scopes | `api`, `refresh_token` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

## Tools

40 action tools. The catalog-wide slug is `salesforce.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `salesforce.create_account`

Create a new Salesforce account: a company or organization record in the CRM, distinct from an individual contact or a lead. Use when the user wants to add a business to Salesforce, not a person. Requires a name; industry, phone, website, and billing address are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Account`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `AnnualRevenue` | number | no | Account's annual revenue. |
| `BillingCity` | string | no | Billing address city. |
| `BillingCountry` | string | no | Billing address country. |
| `BillingState` | string | no | Billing address state or province. |
| `Description` | string | no | Free-text notes about the account. |
| `Industry` | string | no | Industry, e.g. "Technology", "Healthcare". |
| `Name` | string | **yes** | Account name. |
| `Phone` | string | no | Account's main phone number. |
| `Website` | string | no | Account's website, e.g. "https://acme.com". |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "add a new company to salesforce", "register a business in the crm", "put this organization into salesforce", "log a new client's company", "set up a fresh account record".

### `salesforce.get_account`

Get one Salesforce account's full record by id: name, industry, phone, website, billing address, and revenue. Use when the user names a specific company already in Salesforce. For finding an account by name use search_accounts instead.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/Account/{{params.account_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `account_id` | string | **yes** | Salesforce account record id (starts with "001"). |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AnnualRevenue` | number |  |
| `BillingCity` | string |  |
| `BillingCountry` | string |  |
| `BillingState` | string |  |
| `CreatedDate` | string (date-time) |  |
| `Id` | string |  |
| `Industry` | string |  |
| `LastModifiedDate` | string (date-time) |  |
| `Name` | string |  |
| `OwnerId` | string |  |
| `Phone` | string |  |
| `Website` | string |  |

Also retrieved by: "pull up this company's salesforce record", "show me what we have on this account", "look up an organization's details in the crm", "check a business's file in salesforce".

### `salesforce.update_account`

Update fields on an existing Salesforce account: name, industry, phone, website, billing address, or revenue. Use when the user wants to edit or correct a company's record, not create a new one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Account/{{params.account_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `AnnualRevenue` | number | no | Account's annual revenue. |
| `BillingCity` | string | no | Billing address city. |
| `BillingState` | string | no | Billing address state or province. |
| `Industry` | string | no | Industry, e.g. "Technology", "Healthcare". |
| `Name` | string | no | Account name. |
| `Phone` | string | no | Account's main phone number. |
| `Website` | string | no | Account's website. |
| `account_id` | string | **yes** | Salesforce account record id to edit. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "fix the industry on this company in salesforce", "change an account's phone number", "edit a business's billing address on file", "correct info on a company record".

### `salesforce.delete_account`

Permanently delete a Salesforce account record. Use when the user wants to remove, purge, or erase a company from Salesforce entirely. This also deletes or orphans the account's related contacts and opportunities depending on the org's cascade settings. Irreversible once the recycle bin retention period passes.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/Account/{{params.account_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `account_id` | string | **yes** | Salesforce account record id to delete. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "wipe this company from salesforce for good", "purge an account entirely", "get rid of an organization's record permanently", "erase a business from the crm".

### `salesforce.search_accounts`

Search Salesforce accounts by name. Use when the user describes a company rather than naming a known account id, for example finding an organization before creating a contact or opportunity under it. Returns up to 25 matches via a SOQL name search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Free text to match against the account name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].Id` | string |  |
| `records[].Industry` | string |  |
| `records[].Name` | string |  |
| `records[].Phone` | string |  |
| `records[].Website` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "find a business by its name in salesforce", "look up a company account", "hunt down which organization this is", "who do we have on file matching this company name".

### `salesforce.create_contact`

Create a new Salesforce contact: a person associated with an account, distinct from a lead that has not yet become a customer. Use when the user wants to add a person to Salesforce who already belongs to a known company. Requires a last name; email, phone, title, and the parent account are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Contact`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `AccountId` | string | no | Salesforce account id this contact belongs to. Find one with search_accounts. |
| `Department` | string | no | Department the contact works in. |
| `Email` | string | no | Contact's email address. |
| `FirstName` | string | no | Contact's first name. |
| `LastName` | string | **yes** | Contact's last name. |
| `Phone` | string | no | Contact's phone number. |
| `Title` | string | no | Contact's job title. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "add a new person to salesforce", "register someone tied to an existing account", "put this person's details into the crm", "log a new point of contact for a client".

### `salesforce.get_contact`

Get one Salesforce contact's full record by id: name, email, phone, title, department, and the account they belong to. Use when the user names a specific person already in Salesforce.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/Contact/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Salesforce contact record id (starts with "003"). |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AccountId` | string |  |
| `CreatedDate` | string (date-time) |  |
| `Department` | string |  |
| `Email` | string |  |
| `FirstName` | string |  |
| `Id` | string |  |
| `LastName` | string |  |
| `Phone` | string |  |
| `Title` | string |  |

Also retrieved by: "pull up someone's salesforce profile", "look up this person in the crm", "show me what we have on this contact", "check somebody's file in salesforce".

### `salesforce.update_contact`

Update fields on an existing Salesforce contact: name, email, phone, title, or department. Use when the user wants to edit or correct a person's record, not create a new one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Contact/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Email` | string | no | Contact's email address. |
| `FirstName` | string | no | Contact's first name. |
| `LastName` | string | no | Contact's last name. |
| `Phone` | string | no | Contact's phone number. |
| `Title` | string | no | Contact's job title. |
| `contact_id` | string | **yes** | Salesforce contact record id to edit. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "fix this person's phone number in salesforce", "change someone's job title on file", "edit a contact's email address", "correct details on a person's record".

### `salesforce.delete_contact`

Permanently delete a Salesforce contact record. Use when the user wants to remove, purge, or erase a person from Salesforce entirely. This does not delete the account the contact belonged to. Irreversible once the recycle bin retention period passes.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/Contact/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Salesforce contact record id to delete. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "wipe this person from salesforce for good", "purge someone's contact record entirely", "get rid of this person permanently", "erase a contact from the crm".

### `salesforce.search_contacts`

Search Salesforce contacts by name or email. Use when the user describes a person rather than naming a known contact id. Returns up to 25 matches via a SOQL name and email search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Free text to match against the contact's name or email. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].AccountId` | string |  |
| `records[].Email` | string |  |
| `records[].FirstName` | string |  |
| `records[].Id` | string |  |
| `records[].LastName` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "find someone by email in salesforce", "look up a contact by name", "who do we have on file matching this person", "hunt down a contact's record".

### `salesforce.create_lead`

Create a new Salesforce lead: a person or company that has not yet been qualified as a customer, distinct from a contact already tied to an account. Use when the user wants to add a prospect from a form fill, a trade show, or a cold inbound inquiry. Requires a last name and a company name.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Lead`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Company` | string | **yes** | Company the lead works for. |
| `Email` | string | no | Lead's email address. |
| `FirstName` | string | no | Lead's first name. |
| `LastName` | string | **yes** | Lead's last name. |
| `LeadSource` | string | no | Where the lead came from, e.g. "Web", "Trade Show", "Referral". |
| `Phone` | string | no | Lead's phone number. |
| `Status` | string | no | Lead status, e.g. "Open - Not Contacted", "Working", "Qualified". |
| `Title` | string | no | Lead's job title. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "add a new prospect to salesforce", "register someone who filled out a form", "log a cold inquiry as a lead", "put a trade show contact into the pipeline".

### `salesforce.get_lead`

Get one Salesforce lead's full record by id: name, company, email, phone, status, and source. Use when the user names a specific prospect already in Salesforce.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/Lead/{{params.lead_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `lead_id` | string | **yes** | Salesforce lead record id (starts with "00Q"). |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `Company` | string |  |
| `Email` | string |  |
| `FirstName` | string |  |
| `Id` | string |  |
| `IsConverted` | boolean |  |
| `LastName` | string |  |
| `LeadSource` | string |  |
| `Phone` | string |  |
| `Status` | string |  |

Also retrieved by: "pull up this prospect's salesforce record", "show me what we know about this lead", "look up a lead's details in the crm".

### `salesforce.update_lead`

Update fields on an existing Salesforce lead: name, company, email, phone, status, or source. Use when the user wants to move a prospect through qualification, for example marking it "Working" after a first call, without converting it yet.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Lead/{{params.lead_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Company` | string | no | Company the lead works for. |
| `Email` | string | no | Lead's email address. |
| `LeadSource` | string | no | Where the lead came from. |
| `Phone` | string | no | Lead's phone number. |
| `Status` | string | no | Lead status, e.g. "Working", "Qualified", "Unqualified". |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `lead_id` | string | **yes** | Salesforce lead record id to edit. |

Also retrieved by: "mark this prospect as working", "change a lead's status in salesforce", "edit a prospect's contact details", "move a lead further along qualification".

### `salesforce.delete_lead`

Permanently delete a Salesforce lead record. Use when the user wants to remove, purge, or erase a prospect from Salesforce entirely, for example a spam or duplicate submission. For a lead that already became a customer use convert_lead instead of deleting it. Irreversible once the recycle bin retention period passes.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/Lead/{{params.lead_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `lead_id` | string | **yes** | Salesforce lead record id to delete. |

Also retrieved by: "wipe this prospect from salesforce for good", "purge a spam lead entirely", "get rid of a duplicate submission", "erase a lead permanently".

### `salesforce.convert_lead`

Convert a qualified Salesforce lead into an account, a contact, and optionally an opportunity. Use when the user says a prospect is ready to become a customer or has signed. Irreversible: the lead record becomes permanently converted and stops appearing as an open lead.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/actions/standard/convertLead`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `converted_status` | string | no | Lead status to record on conversion, e.g. "Closed - Converted". |
| `do_not_create_opportunity` | boolean | no | True to skip creating an opportunity from this lead. Defaults to false, which creates one. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `lead_id` | string | **yes** | Salesforce lead record id to convert. |

Also retrieved by: "turn this prospect into a customer", "promote a qualified lead to an account and contact", "this prospect signed, make it official in salesforce", "graduate a lead into a real opportunity".

### `salesforce.search_leads`

Search Salesforce leads by name or company. Use when the user describes a prospect rather than naming a known lead id. Returns up to 25 matches via a SOQL name and company search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Free text to match against the lead's name or company. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].Company` | string |  |
| `records[].FirstName` | string |  |
| `records[].Id` | string |  |
| `records[].LastName` | string |  |
| `records[].Status` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "find a prospect by company name", "look up a lead in the pipeline", "hunt down a specific inquiry".

### `salesforce.create_opportunity`

Create a new Salesforce opportunity: a deal or sale moving through a pipeline toward a close date. Use when the user wants to open, start, or log a sale, not a support case or a marketing lead. Requires a name, a pipeline stage, and an expected close date.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Opportunity`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `AccountId` | string | no | Salesforce account id this opportunity belongs to. |
| `Amount` | number | no | Deal value. |
| `CloseDate` | string (date) | **yes** | Expected close date, YYYY-MM-DD. |
| `Description` | string | no | Free-text notes about the opportunity. |
| `Name` | string | **yes** | Opportunity's name, e.g. "Acme Corp - Annual Renewal". |
| `StageName` | string | **yes** | Pipeline stage, e.g. "Prospecting", "Negotiation/Review", "Closed Won". |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "open a new deal in salesforce", "start tracking a potential sale", "log a piece of revenue in the pipeline", "kick off a new opportunity for this account".

### `salesforce.get_opportunity`

Get one Salesforce opportunity's full record by id: name, stage, amount, close date, and the account it belongs to. Use when the user names a specific deal or sale.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/Opportunity/{{params.opportunity_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `opportunity_id` | string | **yes** | Salesforce opportunity record id (starts with "006"). |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AccountId` | string |  |
| `Amount` | number |  |
| `CloseDate` | string (date) |  |
| `Id` | string |  |
| `IsClosed` | boolean |  |
| `IsWon` | boolean |  |
| `Name` | string |  |
| `Probability` | number |  |
| `StageName` | string |  |

Also retrieved by: "check the status of this deal", "pull up details on a sale in progress", "show me where this opportunity stands".

### `salesforce.update_opportunity`

Update fields on an existing Salesforce opportunity: name, stage, amount, or close date. Use when the user wants to advance, reprice, or reschedule a deal, for example moving it to the next pipeline stage or marking it Closed Won.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Opportunity/{{params.opportunity_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Amount` | number | no | Deal value. |
| `CloseDate` | string (date) | no | Expected or actual close date, YYYY-MM-DD. |
| `Name` | string | no | Opportunity's name. |
| `StageName` | string | no | Pipeline stage to move the opportunity to. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `opportunity_id` | string | **yes** | Salesforce opportunity record id to edit. |

Also retrieved by: "move this deal to the next stage", "reprice a sale in the pipeline", "push back the close date on this opportunity", "mark this deal as won".

### `salesforce.delete_opportunity`

Permanently delete a Salesforce opportunity record. Use when the user wants to remove a deal from the pipeline entirely, rather than mark it Closed Lost. Irreversible once the recycle bin retention period passes.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/Opportunity/{{params.opportunity_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `opportunity_id` | string | **yes** | Salesforce opportunity record id to delete. |

Also retrieved by: "scrap this deal for good", "remove a sale from the pipeline entirely", "wipe this opportunity from salesforce".

### `salesforce.search_opportunities`

Search Salesforce opportunities by name. Use when the user describes a deal rather than naming a known opportunity id. Returns up to 25 matches via a SOQL name search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Free text to match against the opportunity name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].Amount` | number |  |
| `records[].Id` | string |  |
| `records[].Name` | string |  |
| `records[].StageName` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "find a deal by name", "look up a sale in the pipeline", "hunt down a specific opportunity".

### `salesforce.create_case`

Create a new Salesforce case: a customer service or support issue tracked against an account or contact. Use when the user wants to open, file, or log a customer support problem in Salesforce, not an engineering bug in Jira or Linear. Requires a subject.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Case`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `AccountId` | string | no | Salesforce account id this case is filed against. |
| `ContactId` | string | no | Salesforce contact id who reported the issue. |
| `Description` | string | no | Case body describing the issue. |
| `Origin` | string | no | Where the case came from, e.g. "Email", "Phone", "Web". |
| `Priority` | string | no | Priority, e.g. "Low", "Medium", "High". |
| `Status` | string | no | Case status, e.g. "New", "Working", "Closed". |
| `Subject` | string | **yes** | One-line case subject. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "open a customer support case in salesforce", "file a service issue for a client", "log a complaint from a customer", "start a help desk case in the crm".

### `salesforce.get_case`

Get one Salesforce case's full record by id: subject, description, status, priority, and the account or contact it's filed against. Use when the user names a specific support case.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/Case/{{params.case_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `case_id` | string | **yes** | Salesforce case record id (starts with "500"). |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `AccountId` | string |  |
| `CaseNumber` | string |  |
| `ContactId` | string |  |
| `Description` | string |  |
| `Id` | string |  |
| `Origin` | string |  |
| `Priority` | string |  |
| `Status` | string |  |
| `Subject` | string |  |

Also retrieved by: "pull up a customer's support case", "check the status of a service issue", "show me what this complaint says".

### `salesforce.update_case`

Update fields on an existing Salesforce case: subject, description, status, or priority. Use when the user wants to move a support case forward, escalate it, or close it out.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Case/{{params.case_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Description` | string | no | Case body describing the issue. |
| `Priority` | string | no | Priority, e.g. "Low", "Medium", "High". |
| `Status` | string | no | Case status, e.g. "Working", "Escalated", "Closed". |
| `Subject` | string | no | One-line case subject. |
| `case_id` | string | **yes** | Salesforce case record id to edit. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "move a support case to the next stage", "change the priority on a service issue", "escalate a customer complaint", "close out a support case".

### `salesforce.delete_case`

Permanently delete a Salesforce case record. Use when the user wants to remove a support case from Salesforce entirely, for example a duplicate or a test case, rather than close it. Irreversible once the recycle bin retention period passes.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/Case/{{params.case_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `case_id` | string | **yes** | Salesforce case record id to delete. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "remove a support case from salesforce for good", "purge a duplicate service issue", "wipe a test case entirely".

### `salesforce.search_cases`

Search Salesforce cases by subject. Use when the user describes a customer issue rather than naming a known case number or id. Returns up to 25 matches via a SOQL subject search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Free text to match against the case subject. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].CaseNumber` | string |  |
| `records[].Id` | string |  |
| `records[].Priority` | string |  |
| `records[].Status` | string |  |
| `records[].Subject` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "find a support case by subject", "look up a service issue", "hunt down a customer complaint".

### `salesforce.create_task`

Create a Salesforce task: a to-do reminder for a sales or service rep, optionally linked to a record such as a contact, lead, or opportunity. Use when the user wants a follow-up reminder in Salesforce, distinct from a Jira ticket or a Linear issue. Requires a subject.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Task`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `ActivityDate` | string (date) | no | Due date, YYYY-MM-DD. |
| `Description` | string | no | Longer task detail or instructions. |
| `Priority` | string | no | Priority, e.g. "Low", "Normal", "High". |
| `Subject` | string | **yes** | One-line task title. |
| `WhatId` | string | no | Salesforce account, opportunity, or case id this task relates to. |
| `WhoId` | string | no | Salesforce contact or lead id this task is about. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "set a follow-up reminder in salesforce", "schedule a to-do on this account", "remind me to check back on a lead", "put a reminder on my plate for this deal".

### `salesforce.update_task`

Update a Salesforce task's subject, due date, priority, or status. Use when the user wants to reschedule a follow-up or mark it done.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PATCH /services/data/v59.0/sobjects/Task/{{params.task_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `ActivityDate` | string (date) | no | Due date, YYYY-MM-DD. |
| `Priority` | string | no | Priority, e.g. "Low", "Normal", "High". |
| `Status` | string | no | Task status, e.g. "Not Started", "In Progress", "Completed". |
| `Subject` | string | no | One-line task title. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `task_id` | string | **yes** | Salesforce task record id to edit. |

Also retrieved by: "mark a follow-up as done", "push back a reminder's due date", "reschedule a rep's to-do".

### `salesforce.list_tasks`

List open Salesforce tasks, most recently created first. Use for browsing a rep's outstanding to-dos rather than looking for one specific task. Returns up to 25 tasks via SOQL.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].ActivityDate` | string (date) |  |
| `records[].Id` | string |  |
| `records[].Priority` | string |  |
| `records[].Status` | string |  |
| `records[].Subject` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "show me what's on my plate today in salesforce", "what follow-ups are still open", "browse my outstanding reminders".

### `salesforce.create_event`

Create a Salesforce calendar event: a scheduled meeting or call tied to a start and end time, optionally linked to a contact, lead, or account. Use when the user wants to book time on the calendar, not log that a call already happened (use log_call in a phone system toolkit for that). Requires a subject, start time, and end time.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Event`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Description` | string | no | Meeting agenda or notes. |
| `EndDateTime` | string (date-time) | **yes** | Event end time, RFC 3339. |
| `Location` | string | no | Meeting location or video call link. |
| `StartDateTime` | string (date-time) | **yes** | Event start time, RFC 3339. |
| `Subject` | string | **yes** | One-line event title. |
| `WhatId` | string | no | Salesforce account or opportunity id this event relates to. |
| `WhoId` | string | no | Salesforce contact or lead id this event is with. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "book a meeting on the salesforce calendar", "schedule a call with this contact", "set up time with a prospect", "put a meeting on the calendar tied to this deal".

### `salesforce.list_events`

List upcoming Salesforce calendar events, soonest first. Use for browsing what's scheduled rather than looking for one specific meeting. Returns up to 25 events via SOQL.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].EndDateTime` | string (date-time) |  |
| `records[].Id` | string |  |
| `records[].Location` | string |  |
| `records[].StartDateTime` | string (date-time) |  |
| `records[].Subject` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "what's on my calendar this week", "show me upcoming meetings in salesforce", "browse scheduled calls".

### `salesforce.create_note`

Log a note attached to a Salesforce record: free-text commentary on an account, contact, lead, opportunity, or case. Use when the user wants to jot down context in Salesforce, not send a message. Requires a title and the record to attach it to.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/Note`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `Body` | string | no | The note's text. |
| `ParentId` | string | **yes** | Id of the account, contact, lead, opportunity, or case this note attaches to. |
| `Title` | string | **yes** | One-line note title. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "jot down some context on this account", "leave a comment on a crm record", "save some background on this lead", "write down what happened on a call".

### `salesforce.attach_file`

Upload a file and attach it to a Salesforce record: a contract, a screenshot, or any document tied to an account, contact, opportunity, or case. Use when the user wants to add a file to a record in Salesforce, not send it as an email attachment. Content is base64-encoded.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/ContentVersion`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `PathOnClient` | string | **yes** | File name with extension, e.g. "contract.pdf". |
| `Title` | string | **yes** | File title as it appears in Salesforce. |
| `VersionData` | string | **yes** | File content, base64-encoded. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `record_id` | string | **yes** | Id of the account, contact, opportunity, or case to attach the file to. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "upload a contract to this record", "attach a document to this account", "add a file to this opportunity in salesforce", "drop a screenshot onto this case".

### `salesforce.add_contact_to_campaign`

Add a Salesforce contact or lead to a marketing campaign as a campaign member. Use when the user wants to build an audience or enroll someone in a campaign, not add them to Salesforce itself.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /services/data/v59.0/sobjects/CampaignMember`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `CampaignId` | string | **yes** | Salesforce campaign id to enroll into. |
| `ContactId` | string | no | Salesforce contact id to add. Provide this or LeadId, not both. |
| `LeadId` | string | no | Salesforce lead id to add. Provide this or ContactId, not both. |
| `Status` | string | no | Campaign member status, e.g. "Sent", "Responded". |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `errors` | array of string |  |
| `id` | string |  |
| `success` | boolean |  |

Also retrieved by: "enroll a contact in a marketing campaign", "add this lead to a campaign audience", "put someone into an email blast list".

### `salesforce.remove_contact_from_campaign`

Remove a Salesforce contact or lead from a campaign by campaign member id, without deleting the contact, lead, or campaign itself. Use when the user wants to unenroll someone from a campaign audience.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `DELETE /services/data/v59.0/sobjects/CampaignMember/{{params.campaign_member_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `campaign_member_id` | string | **yes** | Salesforce campaign member id to remove, from list_campaign_members. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Also retrieved by: "take someone off a campaign", "unenroll a contact from a marketing list", "drop a lead from a campaign audience".

### `salesforce.list_campaign_members`

List the contacts and leads enrolled in a Salesforce campaign. Use when the user asks who is in a campaign, or before removing a member by id. Returns up to 200 members via SOQL.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `campaign_id` | string | **yes** | Salesforce campaign id to list members of. |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `records[].ContactId` | string |  |
| `records[].Id` | string |  |
| `records[].LeadId` | string |  |
| `records[].Status` | string |  |
| `totalSize` | integer |  |

Also retrieved by: "who's enrolled in this campaign", "show everyone signed up for this marketing push", "browse a campaign's audience".

### `salesforce.run_soql_query`

Run a raw SOQL query against Salesforce and return the matching records. Use for a request that names specific fields, filters, or sort order the per-object search tools don't cover, or that spans a relationship between objects. Requires SOQL syntax knowledge; prefer search_accounts, search_contacts, search_leads, search_opportunities, or search_cases for a plain-language lookup.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/query`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `query` | string | **yes** | Full SOQL query, e.g. "SELECT Id, Name FROM Account WHERE Industry = 'Technology'". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `done` | boolean |  |
| `records` | array of object |  |
| `totalSize` | integer |  |

Also retrieved by: "run a custom query against salesforce", "pull records with a specific filter", "write a soql query for this".

### `salesforce.search_records`

Run a raw SOSL search across multiple Salesforce object types at once, for example finding a name that could be an account, a contact, or a lead without knowing which. Use when the user's search spans object types; for a search scoped to one kind of record use search_accounts, search_contacts, search_leads, search_opportunities, or search_cases instead. Requires SOSL syntax knowledge.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `sosl` | string | **yes** | Full SOSL search, e.g. "FIND {Acme} IN ALL FIELDS RETURNING Account(Id, Name), Contact(Id, Name, Email)". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `searchRecords` | array of object |  |

Also retrieved by: "search across every object for this name", "find this person or company anywhere in salesforce", "do a global search across accounts and contacts".

### `salesforce.describe_object`

Get the field and relationship schema for a Salesforce object: which fields exist, their types, and whether they're required or picklist. Use when the user asks what fields an object has, or before building a SOQL query or a create call against a custom object this toolkit doesn't model by name.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/data/v59.0/sobjects/{{params.object_name}}/describe`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |
| `object_name` | string | **yes** | API name of the object, e.g. "Account", "Case", "My_Custom_Object__c". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `fields` | array of object |  |
| `fields[].label` | string |  |
| `fields[].name` | string |  |
| `fields[].nillable` | boolean |  |
| `fields[].picklistValues` | array of object |  |
| `fields[].picklistValues[].label` | string |  |
| `fields[].picklistValues[].value` | string |  |
| `fields[].type` | string |  |
| `label` | string |  |
| `name` | string |  |

Also retrieved by: "what fields does this salesforce object have", "show me the schema for this object", "list the picklist values on this field".

### `salesforce.get_current_user`

Get the identity of the Salesforce user this connection is authenticated as: name, email, user id, and organization id. Use when the user asks who they're logged in as, or which Salesforce org a connection points at, before running a query or making a change.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /services/oauth2/userinfo`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `instance` | string | **yes** | Salesforce instance hostname (My Domain) for the connected org, e.g. "acmecorp.my.salesforce.com". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `email` | string |  |
| `name` | string |  |
| `organization_id` | string |  |
| `preferred_username` | string |  |
| `user_id` | string |  |

Also retrieved by: "who am i logged in as in salesforce", "what org is this connection pointed at", "show my salesforce user id".
