com.grain64.deskhand/deskhand
up checked
Unclaimed · Unverified
Agent searches it appeared in, last 30 days: 0. Run this server? Claim the listing: verified label, uptime alerts and analytics.
Publisher-provided title
Deskhand
Publisher-provided description
Deskhand CRM for AI agents: key per agent, undo a run, email drafts. Start with one POST.
Summary by lookupd
Manage CRM contacts, deals, campaigns and email drafts per agent, with suppression lists, follow-up tasks and undo of runs.
Install
Claude Code, remote (streamable-http)
claude mcp add --transport http deskhand https://deskhand.grain64.com/api/mcp
Codex, remote (streamable-http)
codex mcp add deskhand --url https://deskhand.grain64.com/api/mcp
Cursor, remote (streamable-http) → .cursor/mcp.json
{
"mcpServers": {
"deskhand": {
"url": "https://deskhand.grain64.com/api/mcp"
}
}
}Other clients: docs. Or tell your agent: Set up lookupd for me: read https://lookupd.com/agent.md and follow it.
Tools (30 tools)
Publisher-provided text
search_contactsFind 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 supsert_contactCreate 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 compaupdate_contactChange fields of an existing contact, found by id or email. Custom `fields` are merged with the existing ones. Requires the write_crm scope.create_dealOpen 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'move_dealSet a deal's stage (lead, contacted, qualified, proposal, won, lost). Requires the write_crm scope.add_noteAttach a note to a contact (by id or email) or to a deal. Requires the write_crm scope.create_taskCreate a follow-up task or reminder with an optional due date, on a contact or a deal. Requires the manage_tasks scope.list_due_tasksWhat 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:draft_emailDraft 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 thelist_email_statusStatus 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 (withlist_repliesReplies captured from contacts, newest first. Requires the read_crm scope.get_threadSent mail and replies for one contact in time order. Requires the read_crm scope.mark_repliedRecord 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 fuget_policyWhat 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-approvecreate_campaignCreate 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 chaupdate_campaignChange 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. Requirget_campaignOne campaign with its steps, status, delivery mode (dry run or live) and counters.list_campaignsCampaigns in this workspace with status, delivery mode and enrolled/sent/replied counters. Archived ones are hidden unless status=archived.enroll_contactsEnroll contacts by ids, tag, source/list, status, text or custom fields. Suppressed, replied, unsubscribed, bounced, address-less and blocked-domain contacts arsimulate_campaignWhat 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, skilaunch_campaignStart a draft campaign. Refused with launch_blockers (postal address, sender name, an email step, enrolled contacts, a verified identity) until they are fixed.pause_campaignFreeze a running campaign. Nothing is lost: resuming shifts every pending step by the length of the pause. Requires the manage_campaigns scope.resume_campaignResume a paused campaign. Requires the manage_campaigns scope.stop_enrollmentStop a single enrollment (reason manual). Requires the manage_campaigns scope.campaign_reportCounts per campaign, per step and per variant: enrolled, active, completed, stopped (by reason), sent, sent_dry (dry-run records, nothing delivered), skipped (bget_outboxFor 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 areport_sendReport 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), reflist_sending_identitiesThe 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 stateadd_suppressionNever email this address or domain again, in any campaign. Open enrollments of matching contacts stop. Removing an entry needs the operator. Requires the managelist_suppressionsAddresses and domains that are never emailed.
Details
- Version: 1.2.2
- Transports: streamable-http
- Uptime (7 days): 100%
- Median latency: 467 ms
- First indexed:
- Last seen in registry:
- Website: https://deskhand.grain64.com
Badge for your README
Shows this live status and links here; updates hourly.
[](https://lookupd.com/servers/com.grain64.deskhand/deskhand)
- 62033 servers
- Last crawl: 2026-11-11T15:38:39.561Z
- API base:
https://api.lookupd.com - MCP URL:
https://api.lookupd.com/mcp