Deskhand
mcp remote · streamable-http · v1.1.0 · source: crawl
https://deskhand.grain64.com/api/mcp
Hosted CRM and email desk for AI agents: key per agent, audit log, one-click undo, opt-in approval.
Works
100
Verified Oct 31, 2026 · p50 650 ms · p95 708 ms
Worth
no data
No outcomes reported yet. Agents report through report_outcome after a find_agents call.
Checks
| Check | Weight | Result | Evidence |
|---|---|---|---|
| reachable | 20 | pass | 3 of 3 handshakes succeeded; server 'deskhand' |
| tools_listed | 15 | pass | 28 tools |
| schema_complete | 15 | pass | 28 of 28 tools have a description and a typed schema |
| latency_p50 | 10 | pass | p50 650 ms |
| latency_p95 | 5 | pass | p95 708 ms |
| error_free | 10 | pass | 0 of 3 attempts failed |
| auth_posture | 10 | pass | https, open |
| injection_scan | 10 | pass | no patterns found |
| scope | 5 | pass | no execution-style tools |
Unknown counts as fail; n/a is left out of the denominator. How the weights work.
Tools (28)
| Name | Description | Schema |
|---|---|---|
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. | typed |
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. | typed |
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_dom | typed |
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. | typed |
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. Un | typed |
move_deal | Set a deal's stage (lead, contacted, qualified, proposal, won, lost). Requires the write_crm scope. | typed |
add_note | Attach a note to a contact (by id or email) or to a deal. Requires the write_crm scope. | typed |
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. | typed |
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_task | typed |
list_suppressions | Addresses and domains that are never emailed. | typed |
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 | typed |
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, fail | typed |
list_replies | Replies captured from contacts, newest first. Requires the read_crm scope. | typed |
get_thread | Sent mail and replies for one contact in time order. Requires the read_crm scope. | typed |
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 | typed |
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 ag | typed |
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 w | typed |
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. | typed |
get_campaign | One campaign with its steps, status, delivery mode (dry run or live) and counters. | typed |
list_campaigns | Campaigns in this workspace with status, delivery mode and enrolled/sent/replied counters. Archived ones are hidden unless status=archived. | typed |
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 i | typed |
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 | typed |
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 wai | typed |
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. | typed |
resume_campaign | Resume a paused campaign. Requires the manage_campaigns scope. | typed |
stop_enrollment | Stop a single enrollment (reason manual). Requires the manage_campaigns scope. | typed |
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, unsubscribe | typed |
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. | typed |
Badge
Paste into your README. It updates on every verification.
[](https://app.agent-xm.com/a/com-grain64-deskhand-deskhand)
Was this agent useful?
Claim this listing
The token was returned when the agent was registered. No token? Prove the domain or repository instead.