---
name: "salesforce_connect"
area: "salesforce"
title: "Connect Salesforce"
price: "free"
method: "POST"
url: "https://api.conecto.chat/v1/tools/salesforce_connect"
mcp_server: "https://api.conecto.chat/mcp/salesforce"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/salesforce/salesforce_connect"
---

# Connect Salesforce (`salesforce_connect`)

Connects the company's Salesforce org through its own connected app.

Connect the company's own Salesforce org, which stays the source of truth: the agent queries, reads and changes its records. The company makes a connected app with the OAuth client credentials flow switched on and a run-as user whose profile limits what the agent may touch, and gives the org's My Domain and the app's consumer key and secret, which are checked before anything is kept. On accounts with an owner, changing an existing record waits for the owner's approval by default. Free.

Price: Free. A call that fails costs nothing.

## Use it when

The company keeps its customers in Salesforce and wants the agent to work in them there.

## Say this to your agent

> Connect our Salesforce. Here are the My Domain, the consumer key and the secret.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `my_domain` | string | yes | Like hansen-voss.my.salesforce.com. 10 to 200 characters. |  |  |
| `client_id` | string | yes | 10 to 300 characters. |  |  |
| `secret` | string | yes | The connected app's consumer secret. Never shown again. 8 to 500 characters. Stored encrypted and shown only as [redacted]. |  |  |

## Example

Written for Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff.

MCP: call `salesforce_connect` on the MCP server `https://api.conecto.chat/mcp/salesforce` with these arguments:

```json
{
  "my_domain": "hansen-voss.my.salesforce.com",
  "client_id": "3MVG9example.consumer.key",
  "secret": "example-consumer-secret"
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/salesforce_connect \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"my_domain": "hansen-voss.my.salesforce.com", "client_id": "3MVG9example.consumer.key", "secret": "example-consumer-secret"}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "salesforce_connect",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.00",
  "balance_usd": "$19.75",
  "result": {
    "salesforce": {
      "my_domain": "hansen-voss.my.salesforce.com",
      "connected_at": "2026-10-14T08:00:00+00:00"
    },
    "need_approval": [
      "salesforce_update"
    ]
  }
}
```

`result`: salesforce: my_domain and connected_at; need_approval, the tools that now wait for the owner.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `invalid_input` | 400 | my_domain is not a My Domain. | Give one like acme.my.salesforce.com. |
| `vendor_rejected` | 502 | Salesforce refused the keys. | Switch on the client credentials flow and set a run-as user. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [salesforce_query](https://conecto.chat/tools/salesforce/salesforce_query.md): Runs one SOQL SELECT statement and returns up to 200 records. Free up to 1,000,000 reads a month.
- [salesforce_get](https://conecto.chat/tools/salesforce/salesforce_get.md): One Salesforce record by object and id, with all its fields or the ones named. Free up to 1,000,000 reads a month.
- [salesforce_create](https://conecto.chat/tools/salesforce/salesforce_create.md): Makes a record of any object the run-as user may create. $0.001 a call.
- [salesforce_update](https://conecto.chat/tools/salesforce/salesforce_update.md): Changes a Salesforce record's fields; waits for the owner by default. $0.001 a call.
- [salesforce_disconnect](https://conecto.chat/tools/salesforce/salesforce_disconnect.md): Forgets the connected app's secret; nothing in Salesforce changes. Free.
