The standard servers give an assistant your records. A custom server gives it your business logic — starting with automation you have already built. A hands-on AI Projects Lab build.
Connecting an assistant to the standard sobject-reads server — covered in I Connected My Salesforce Org to Claude — gets you queries. Useful, but generic: the assistant sees objects and fields, and has to assemble meaning itself.
What it doesn't see is your logic. The account-review routine your team runs, the eligibility check, the rollup nobody remembers the formula for. That logic already exists in your org as automation. A custom MCP server publishes it as a callable tool.
In this build I created a custom server and added one tool backed by an autolaunched Flow that returns an Account with its related Contacts and Cases. One request, one shaped answer — instead of the assistant issuing three queries and stitching them together.
For beginners: a tool is a single callable capability an MCP client can discover and invoke. A custom MCP server is your own named collection of them. Configuring the server itself takes no code — you're choosing which existing capabilities to publish.
@AuraEnabled methods, and API Catalog endpoints. Flow is the fastest starting point; the Apex tool build covers the option with the most control.
The flow needs to be autolaunched — no screens, no user interaction. It runs headlessly and returns data.
accountName reads better than var1.You now have an empty server. It has a URL, but nothing to call yet.
Then copy the Server URL. Custom servers follow this shape:
https://api.salesforce.com/platform/mcp/v1/custom/YourServerApiName
Sandbox and scratch orgs carry a /sandbox/ segment in that path. Always copy the URL from Setup rather than typing it from the pattern.
This is the part that decides whether the build works, and it isn't a technical step.
The assistant never sees your flow. It sees a name, a description, and an input schema, and from those three things alone it decides whether to call your tool and what to pass. A vague description means the tool gets skipped, or called at the wrong moment with the wrong arguments.
A description that works answers three questions:
| Question | Weak | Works |
|---|---|---|
| What does it return? | "Gets account data" | "Returns one Account with its related Contacts and open Cases" |
| What does it need? | Left unsaid | "Requires the exact Account name" |
| When should it be used? | Left unsaid | "Use when asked for a full picture of a single account before a call or review" |
Write it as if briefing a new colleague who has your org's data but none of its context. Avoid implementation detail — "runs a flow", "executes SOQL" — because it tells the assistant nothing about when to reach for it.
The server exists, but nothing can reach it yet. The External Client App is the trust relationship between the client and your org. Classic Connected Apps do not work for this flow.
Setup → External Client App Manager → New External Client App.
https://claude.ai/api/mcp/auth_callback; a desktop or CLI client uses a localhost callback instead. Take it from the client's own connector screen rather than guessing.mcp_api, plus refresh_token and offline_access. Use mcp_api — not the standard Salesforce api scope.Click Create. Then:
One app is enough for several servers. If you already made one for the standard servers in the previous build, reuse its Consumer Key and Secret here — only the server URL differs.
In claude.ai: left sidebar → Customize → Connectors → + → Add custom connector.
salesforce-account-insights.You're redirected to Salesforce to log in. If you're already logged into that org, it may skip the challenge entirely.
Once connected, the connector lists the tools it discovered. Your Flow-backed tool should be there by the name you gave it — that's confirmation the server is activated and reachable, before you ask a single question.
Ask for the thing the tool does, in the words a colleague would use — not the tool's name:
Give me the full picture on the Edge Communications account
before my call — who are the contacts and what's still open?
A good result is the assistant selecting the tool on its own, from that phrasing. If you have to name the tool explicitly to get it invoked, the description is the thing to fix — not the flow.
Sources: Build Custom MCP Servers · Workshop: Create a Custom MCP Server · Create Custom Salesforce MCP Servers in API Catalog