Overview
The Hutte MCP (Model Context Protocol) server exposes your Hutte projects, sandboxes, features, and scratch orgs directly to AI assistants β Claude, Claude Code, Cursor, Hermes, and any other MCP-compatible client. Once connected, you can discover and provision Salesforce development environments conversationally, and hand them straight to the local sf CLI.
What you can do:
- Discover your projects, including their Git repo, project type, and pool status
- List sandboxes, open features, and active scratch orgs across all projects or within one
- Read the full context of a feature β notes, issue reference, pull request, source-tracking revision
- Create a new sandbox feature (Git branch + sandbox pairing) from a chat message
- Claim a pre-warmed scratch org from a project pool, ready to use in seconds
- Authenticate a scratch org, feature, or sandbox with the local
sfCLI in one step - Open any org in the browser via a one-time login URL
- Terminate a scratch org when the work is done
Because authenticate_org hands the org to your local sf CLI, the Hutte MCP composes naturally with the Salesforce DX MCP server and with any tooling that runs sf commands β SOQL queries, metadata deploys, Apex test runs.
Prerequisites
- A Hutte account with access to at least one project
- Salesforce CLI (
sf) installed locally if you plan to authenticate orgs
Connection Details
The Hutte MCP server is hosted β there is nothing to install locally. Point your client at the endpoint below.
| Setting | Value |
|---|---|
| URL |
https://app.hutte.io/mcp |
| Transport | HTTP (JSON-RPC over HTTPS POST) |
| Authentication | OAuth 2.1, or a personal access token sent as Authorization: Bearer <token>
|
Authentication
Hutte MCP accepts two kinds of credentials. Pick whichever your client supports.
OAuth (interactive clients)
Clients that can open a browser β Claude.ai, Claude Code, Cursor β should use OAuth. Hutte supports dynamic client registration, so there is nothing to pre-configure: add the server URL, and the client walks you through a Hutte sign-in and consent screen. Tokens are refreshed automatically.
Personal access tokens (headless and cloud agents)
Agent servers that run without a browser β Hermes, CI jobs, background agents β authenticate with a personal access token instead.
- In Hutte, click your avatar in the top right β Profile Settings
- Scroll to the API Keys card and create a token: give it a name and, optionally, an expiry date
- Copy the token immediately β it starts with
hut_and is shown only once - Send it to the MCP endpoint as an
Authorization: Bearerheader
The same API Keys card shows each token's prefix and when it was last used, and lets you revoke a token at any time. Revocation takes effect immediately. A token carries the full access of the user who created it, so store it as a secret (environment variable or your agent host's secret store) rather than committing it to a config file.
Connecting a Client
Claude.ai
- Open claude.ai β click your profile icon β Settings
- Navigate to Connectors β Add custom connector
- Enter the server URL:
https://app.hutte.io/mcp - Click Connect and complete the Hutte sign-in when prompted
Claude Code
Run in your terminal:
claude mcp add --transport http hutte https://app.hutte.io/mcp
Then run /mcp inside Claude Code and choose Authenticate to complete the OAuth flow.
To share the server with your team, commit a .mcp.json in the repository root instead:
{
"mcpServers": {
"hutte": {
"type": "http",
"url": "https://app.hutte.io/mcp"
}
}
}
Cursor
- Open Cursor Settings (
Cmd/Ctrl + ,) β MCP - Click Add new MCP server
- Set the URL to
https://app.hutte.io/mcp - Save β Cursor prompts you to sign in to Hutte
Or edit .cursor/mcp.json in your project root:
{
"mcpServers": {
"hutte": {
"url": "https://app.hutte.io/mcp"
}
}
}
Hermes
Hermes reads its MCP configuration from ~/.hermes/config.yaml under mcp_servers. Add Hutte as an HTTP server with a bearer token β see the Hermes MCP documentation for the surrounding file structure.
mcp_servers:
hutte:
url: "https://app.hutte.io/mcp"
headers:
Authorization: "Bearer hut_your_token_here"
Replace hut_your_token_here with a token from Profile Settings β API Keys (click your avatar in the top right of Hutte to get there).
Other Agent Servers
Any client that can call a remote HTTP MCP server with a custom header will work. The pattern is the same everywhere: the endpoint URL plus an Authorization header.
{
"mcpServers": {
"hutte": {
"type": "http",
"url": "https://app.hutte.io/mcp",
"headers": {
"Authorization": "Bearer ${HUTTE_MCP_TOKEN}"
}
}
}
}
Most clients support some form of environment-variable interpolation in the config file (${HUTTE_MCP_TOKEN}, ${env:HUTTE_MCP_TOKEN}, or similar β check your client's documentation). Use it so the token never has to be committed alongside your configuration.
To verify a token outside of any client, call the endpoint directly:
curl -s https://app.hutte.io/mcp \
-H "Authorization: Bearer $HUTTE_MCP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Available Tools
Discovery
| Tool | Description | Parameters |
|---|---|---|
list_projects |
List all projects you have access to, with repo name, Git provider, default branch, status, and project type (scratch_org or sandbox). Projects with a pool also report pool size and the orgs or sandboxes currently available to claim. |
β |
list_features |
List open features across all sandbox projects, or within one project. Each entry includes the underlying sandbox, branch name, owner, whether it belongs to you, and pull request details when a PR exists. |
project_id (optional) |
list_sandboxes |
List the sandboxes in a sandbox project, including whether each is available for a new feature, why it isn't if it isn't, when it was last refreshed, and its status in Salesforce. |
project_id (required) |
list_scratch_orgs |
List scratch orgs across all projects or within one. Returns state, branch, expiry duration, Salesforce username, and whether the org is an unclaimed pool org. Terminated and expired orgs are excluded. |
project_id (optional) |
get_feature |
Get full details for one feature β notes and issue reference (the context and requirements for the work), pull request, sandbox, state, and source-tracking revision number. |
feature_id (required) |
Provisioning
| Tool | Description | Parameters |
|---|---|---|
create_sandbox_feature |
Create a new feature on a sandbox β a Git branch paired with a Salesforce sandbox. Returns the feature with its ID and branch name. |
sandbox_id, name (required); branch_name, issue_reference, notes (optional) |
take_pool_org |
Instantly claim a pre-created scratch org from a project's org pool. Returns the org together with auth credentials, so no waiting for org creation. |
project_id, name (required); branch_name (optional) |
terminate_scratch_org |
Permanently delete a scratch org and its Salesforce resources. This cannot be undone. |
scratch_org_id (required) |
Org Access
| Tool | Description | Parameters |
|---|---|---|
authenticate_org |
Get credentials for the local sf CLI. Works with scratch orgs, sandbox features, and sandboxes. Returns a ready-to-run auth_command, a suggested alias, the Salesforce username, and the instance URL. |
Exactly one of scratch_org_id, feature_id, or sandbox_id
|
get_org_login_url |
Get a one-time Salesforce frontdoor URL with a live session token for instant browser access. The URL expires quickly, so generate it right before use. | Exactly one of scratch_org_id or feature_id
|
Access Rules
The MCP server acts as you. Every tool is scoped to the projects your Hutte account can already see, and a few operations carry extra rules:
- Only active scratch orgs and open features can be authenticated or opened in the browser
- Authenticating a sandbox directly (via
sandbox_id) requires the project admin role on that project. Team members work through features instead -
list_featuresandlist_sandboxesonly accept sandbox-type projects;list_scratch_orgscovers scratch org projects -
take_pool_orgonly works on projects that have an org pool configured -
create_sandbox_featurefails if the sandbox is not ready, or if it already has an open feature and the project does not allow parallel features -
terminate_scratch_orgis irreversible β most clients ask for confirmation before running it, and you should leave that confirmation enabled
Usage
Exploring What You Have
"List my Hutte projects" "Show all open features for the ACME4 project" "What scratch orgs do I have active?" "Which sandboxes in ACME4 are free for a new feature?"
Picking Up a Piece of Work
"Read the notes and linked issue for the HUT-55 feature, then summarise what needs to be built"
The assistant calls get_feature, which returns the feature's notes and issue reference along with its branch, sandbox, and pull request β enough context to start working without you restating the ticket.
Creating a Sandbox Feature
"Create a feature called 'Account health score' in ACME4 on the most recently refreshed available sandbox, and link it to HUT-55"
The assistant calls list_sandboxes to pick an available sandbox, then create_sandbox_feature with the name, the issue reference, and β if you want one β an explicit branch name. Leave branch_name off and Hutte generates it from the feature name.
Authenticating an Org with the sf CLI
"Authenticate the Cleanup account page layout feature from ACME4" "Authenticate my scratch org for HUT-55"
The assistant calls authenticate_org and returns a shell command to run in your terminal:
echo "force://..." | sf org login sfdx-url \
--alias "hutte-<feature-name>" \
--set-default \
--sfdx-url-stdin
The org is then available to all sf CLI commands under the alias shown.
Opening an Org in the Browser
"Open the ACME4 Cleanup account layout feature in the browser" "Give me a login URL for my HUT-55 scratch org"
The assistant returns a one-time Salesforce frontdoor URL. Open it immediately β it expires within minutes.
Claiming and Releasing a Pool Scratch Org
"Take a pool org from the ACME4 project and call it HUT-55 spike" "I'm done with the HUT-55 spike org β terminate it"
take_pool_org returns the org already authenticated-ready, so you can deploy to it within seconds instead of waiting for a fresh scratch org to be created. terminate_scratch_org deletes it permanently when you're finished.
Combined Workflows
The Hutte MCP tools compose naturally with Salesforce DX MCP tools and with your coding agent:
"Create a helper class that calculates an Account health score and a corresponding test class. Authenticate the 'Account Health Score' feature and deploy both classes. Execute the tests" "Take a pool org from ACME4, deploy the current branch to it, run all local tests, then terminate the org" "List my features, pick the one for HUT-55, open it in the browser"
Troubleshooting
| Symptom | Cause and fix |
|---|---|
unauthorized β Invalid or expired access token |
The token is wrong, expired, or revoked. Check the header is Authorization: Bearer hut_β¦, and confirm the token is still listed and active under Profile Settings β API Keys. For OAuth clients, re-run the sign-in flow. |
| No projects returned | The account has no active project access β or it is a billing user or integration manager, which cannot access projects. Connect with a member or admin account. |
| "Project is not a sandbox project" |
list_features and list_sandboxes only apply to sandbox projects. Use list_scratch_orgs for scratch org projects. |
| "Only project admins can authenticate sandboxes directly" | Authenticate through a feature (feature_id) instead, or ask a project admin. |
| "Scratch org is not active" | The org is still being created, has failed, or has been terminated. Check its state with list_scratch_orgs. |
| "No pool org available" | The pool is empty or every org is claimed. Wait for the pool to refill, or create a scratch org in Hutte as usual. |
| Login URL doesn't work | Frontdoor URLs expire within minutes. Ask for a fresh one right before you open it. |
| Client can't connect at all | Confirm the transport is set to HTTP rather than SSE, and that the URL is exactly https://app.hutte.io/mcp. |