deskhand

Guide

A CRM for Claude Desktop: connect the Deskhand MCP server with one config block

Claude Desktop reaches a remote MCP server through a small local bridge, mcp-remote, that forwards to the server's streamable HTTP endpoint and carries your key in a header. Deskhand is a hosted CRM and email desk built to be driven that way: the agent writes contacts, deals, notes, tasks and email drafts directly, and you watch and correct it in a console.

  • One key per agent. Pause or revoke the Claude Desktop agent without touching any other agent or your own login.
  • Every write recorded. The audit log names the agent and the run and keeps before and after values, so a run can be undone from the console.
  • Safe retries. Send an idempotency key and a repeated call returns the first result instead of writing twice.

Connect Claude Desktop

  1. Sign in, open Agents, name the agent (for example claude-desktop) and pick scopes. Copy the key; it is shown once.
  2. In Claude Desktop open Settings, Developer, Edit Config. That opens claude_desktop_config.json (on macOS ~/Library/Application Support/Claude/, on Windows %APPDATA%\Claude\). Add the server, with your key written as Bearer, a space, then the key:
{
  "mcpServers": {
    "deskhand": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://deskhand.grain64.com/api/mcp",
        "--header",
        "Authorization:${AUTH_HEADER}"
      ],
      "env": {
        "AUTH_HEADER": "Bearer dh_xxxxxxxx"
      }
    }
  }
}
  1. Quit Claude Desktop completely and start it again. Node.js must be installed, because npx fetches the bridge on first use.

The key sits in the env block rather than in the argument, so the header value has no space inside an argument, which some Windows setups mangle.

What was exercised

The same command and the same Authorization:${AUTH_HEADER} header were run with mcp-remote 0.16.0 on Node 22: it connected over streamable HTTP, initialize returned the server as Deskhand, and tools/list returned 30 tools, starting with search_contacts, upsert_contact, update_contact and create_deal.

What to tell the agent

Put one line in the project or conversation instructions: "Save leads with upsert_contact, look them up with search_contacts, and stop and tell me if a call returns agent_paused." A paused agent gets a 403 with the reason, so it can tell you instead of retrying. By default the agent acts on its own within its scopes and daily caps; if you want to review before anything goes out, turn approval on.

Try it

Free during early access: 3 agents, each with its own key, a pause switch and the full audit log. Start free

Related: A CRM for Claude Code agents, A CRM for Codex agents, Undo what an agent changed in your CRM, Docs