NestDaddy

Deskhand

com.grain64.deskhand/deskhand · v1.2.2

Deskhand CRM for AI agents: key per agent, undo a run, email drafts. Start with one POST.

Connect Remote server

Terminal
claude mcp add --transport http deskhand https://deskhand.grain64.com/api/mcp --header "Authorization: Bearer <YOUR_API_KEY>"
~/.cursor/mcp.json
{
  "mcpServers": {
    "deskhand": {
      "url": "https://deskhand.grain64.com/api/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_API_KEY>"
      }
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "deskhand": {
      "type": "http",
      "url": "https://deskhand.grain64.com/api/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_API_KEY>"
      }
    }
  }
}
Claude Desktop
Settings > Connectors > Add custom connector
URL: https://deskhand.grain64.com/api/mcp

Replace the values in angle brackets with your own. Keys stay on your machine; we never see them.

Tools 30 found in our last check

  • search_contacts

    Find contacts by text (name, email, title), status, source, company or a custom field. Returns up to `limit` contacts and a next_cursor. Requires the read_crm scope.

  • upsert_contact

    Create a contact, or update the one that already has this email (matched case-insensitively). Custom `fields` and `tags` are merged into what is stored. A company is created or reused from company_domain or company_name. Requires the write_crm scope.

  • update_contact

    Change fields of an existing contact, found by id or email. Custom `fields` are merged with the existing ones. Requires the write_crm scope.

  • create_deal

    Open a deal, optionally linked to a contact (by id or email) and a company. Stages: lead, contacted, qualified, proposal, won, lost. The deal takes its contact's company unless company_id is given. Unknown arguments are rejected with unknown_field. Requires the write_crm scope.

  • move_deal

    Set a deal's stage (lead, contacted, qualified, proposal, won, lost). Requires the write_crm scope.

  • add_note

    Attach a note to a contact (by id or email) or to a deal. Requires the write_crm scope.

  • create_task

    Create a follow-up task or reminder with an optional due date, on a contact or a deal. Requires the manage_tasks scope.

  • list_due_tasks

    What is due now: overdue and due-today tasks first, then the next 7 days. Tasks on contacts who replied, unsubscribed or bounced are flagged follow_up_blocked: do not chase those. Requires manage_tasks or read_crm.

  • draft_email

    Draft one email to a contact. Drafts are auto-approved by default (the operator can switch approval on for the workspace or for you; then the draft waits in their Approvals inbox). Approved mail that cannot be sent to the recipient yet waits in the operator's To send list and th…

  • list_email_status

    Status of this agent's emails: pending_approval (only when approval is on), approved (with a note when it waits in the manual To send hand-off), rejected (with reject_reason to learn from), sent, failed, cancelled. Each email carries warnings (open_draft_exists, emailed_N_days_a…

  • list_replies

    Replies captured from contacts, newest first. Requires the read_crm scope.

  • get_thread

    Sent mail and replies for one contact in time order. Requires the read_crm scope.

  • mark_replied

    Record that a contact replied (optionally with the reply text). Sets the contact to replied, cancels their pending drafts and open follow-up tasks, and stops further drafts to them. Requires the write_crm scope.

  • get_policy

    What the operator allows this agent: the workspace approval setting and, in plain words, what happens to your CRM writes and email drafts (apply or auto-approve at once, or wait for approval), this agent's mode (direct or propose), daily send caps and how many were used today, b…

  • create_campaign

    Create a campaign: an ordered sequence of email, wait and task steps run per contact, with follow-ups, stop rules (reply, bounce, unsubscribe and deal stage change stop a contact's sequence), a send window, caps and A/B variants. Pass steps inline, and optionally `enroll` to sel…

  • update_campaign

    Change a campaign's settings and/or replace its ordered steps. Editing the steps of a running campaign needs the operator's approval when approval is on. Requires the manage_campaigns scope.

  • get_campaign

    One campaign with its steps, status, delivery mode (dry run or live) and counters.

  • list_campaigns

    Campaigns in this workspace with status, delivery mode and enrolled/sent/replied counters. Archived ones are hidden unless status=archived.

  • enroll_contacts

    Enroll contacts by ids, tag, source/list, status, text or custom fields. Suppressed, replied, unsubscribed, bounced, address-less and blocked-domain contacts are skipped with a reason, and a contact in another running campaign is skipped (or moved with on_conflict=move). dry_run…

  • simulate_campaign

    What would go out over the next N days: per contact and step, the send time (UTC and local), the fully rendered subject and body, and the status (will_send, skipped_missing_variable, skipped_condition, blocked_by_cap, task_created), plus problems and launch_blockers. Nothing is…

  • launch_campaign

    Start a draft campaign. Refused with launch_blockers (postal address, sender name, an email step, enrolled contacts, a verified identity) until they are fixed. With approval on, it returns 202 and waits for the operator to approve the launch once. Requires the manage_campaigns s…

  • pause_campaign

    Freeze a running campaign. Nothing is lost: resuming shifts every pending step by the length of the pause. Requires the manage_campaigns scope.

  • resume_campaign

    Resume a paused campaign. Requires the manage_campaigns scope.

  • stop_enrollment

    Stop a single enrollment (reason manual). Requires the manage_campaigns scope.

  • campaign_report

    Counts per campaign, per step and per variant: enrolled, active, completed, stopped (by reason), sent, sent_dry (dry-run records, nothing delivered), skipped (by reason), replied, bounced, unsubscribed, meetings, deals_created. Rates say which count they divide by.

  • get_outbox

    For a campaign that sends through your own sender (relay identity): the operator-approved messages you may send now, each with its exact text, recipient, step and evidence link, plus batch_id and batch_hash. Send the text byte for byte, then call report_send for every message. 4…

  • report_send

    Report one outbox message: sent (final: the person moves to the next step; reporting sent twice is fine, a different second report is 409 already_reported), refused_cap, refused_unsigned or failed_transient (the message stays in To send and gives its cap unit back), refused_supp…

  • list_sending_identities

    The identities a campaign can send through: the built-in dry_run identity and any the operator connected (their keys are never shown), with their delivery state.

  • add_suppression

    Never email this address or domain again, in any campaign. Open enrollments of matching contacts stop. Removing an entry needs the operator. Requires the manage_campaigns scope.

  • list_suppressions

    Addresses and domains that are never emailed.

Headers

NameDescription
Authorization
Required, secret
Bearer <agent key>, created in the Deskhand console under Agents

Details

Endpointhttps://deskhand.grain64.com/api/mcp (Streamable HTTP)
First published5 Nov 2026
Last updated5 Nov 2026
Registry namecom.grain64.deskhand/deskhand

More marketing and seo servers See all

Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.