_ registry / mcp streamable-http · checked 2h ago

deskhand

https://deskhand.grain64.com

Registry code: cebb21ab72194782

api record

Deskhand is the system of record for this operator's prospects, with every action audited and undoable. Upsert contacts before you draft to them. Drafts are auto-approved unless the operator turned approval on; read get_policy for what applies to you. If draft_email returns contact_suppressed, stop: that person replied, unsubscribed or bounced. Read get_policy for your caps and mode, list_due_tasks for what to do next, and list_email_status for rejected drafts and the reason. To run outreach: create_campaign (steps, optional enroll), simulate_campaign, launch_campaign, later campaign_report.…

endpoint
https://deskhand.grain64.com/api/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is deskhand live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is deskhand free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does deskhand have?
28 tools: add_note, create_task, list_due_tasks, get_thread, list_campaigns, add_suppression, get_policy, update_contact, ….
Is deskhand safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
197ms

last good check

priced tools
0

of 28 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 28 tools
28 auth-required 28 of 28 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • add_note auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "body"
      ],
      "properties": {
        "body": {
          "type": "string",
          "description": "Note text."
        },
        "deal_id": {
          "type": "string",
          "description": "Deal id."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        },
        "contact_email": {
          "type": "string",
          "description": "Contact email."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 29 lines
  • create_task auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "title"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "What to do."
        },
        "due_at": {
          "type": "string",
          "description": "ISO date or date-time, for example 2026-10-14 or 2026-10-14T09:00:00Z."
        },
        "deal_id": {
          "type": "string",
          "description": "Deal id."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 29 lines
  • list_due_tasks auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • get_thread auth-required 2h ago

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

    mcp-tool

    {
      "type": "object",
      "properties": {
        "email": {
          "type": "string",
          "description": "Or the contact email."
        },
        "thread_id": {
          "type": "string",
          "description": "Thread id from an email or reply (thr_...)."
        },
        "contact_id": {
          "type": "string",
          "description": "Or the contact id."
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • list_campaigns auth-required 2h ago

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

    mcp-tool

    {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "description": "draft, active, paused, completed or archived."
        }
      },
      "additionalProperties": false
    }
    arguments 10 lines
  • add_suppression auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "value"
      ],
      "properties": {
        "value": {
          "type": "string",
          "description": "An email address or a domain."
        },
        "reason": {
          "type": "string",
          "description": "manual (default), complaint, unsubscribed, bounced or imported."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 21 lines
  • get_policy auth-required 2h ago

    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, blocked domains, and the contact statuses that are never mailed. Read it before planning a batch of drafts.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • update_contact auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Contact id."
        },
        "name": {
          "type": "string",
          "description": "New name."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "email": {
          "type": "string",
          "description": "Find the contact by this email instead of the id."
        },
        "title": {
          "type": "string",
          "description": "New title."
        },
        "fields": {
          "type": "object",
          "description": "Free-form custom columns, for example {\"stack\":\"Next.js\",\"funding\":\"seed\"}. Values are strings or numbers.",
          "additionalProperties": true
        },
        "source": {
          "type": "string",
          "description": "New source."
        },
        "status": {
          "type": "string",
          "description": "New status."
        },
        "timezone": {
          "type": "string",
          "description": "IANA zone such as Europe/Paris."
        },
        "company_id": {
          "type": "string",
          "description": "Company id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 53 lines
  • list_replies auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 100,
          "minimum": 1
        },
        "since": {
          "type": "string",
          "description": "ISO timestamp: only replies after it."
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from a previous response."
        },
        "contact_id": {
          "type": "string",
          "description": "Only this contact."
        }
      },
      "additionalProperties": false
    }
    arguments 23 lines
  • pause_campaign auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • list_suppressions auth-required never probed

    Addresses and domains that are never emailed.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Text to look for."
        },
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (default 50)."
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from a previous response."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • get_campaign auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • search_contacts auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "q": {
          "type": "string",
          "description": "Text to look for in name, email or title."
        },
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (default 50)."
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from a previous response."
        },
        "fields": {
          "type": "object",
          "description": "Exact-match filter on custom fields, for example {\"stack\":\"Next.js\"}.",
          "additionalProperties": true
        },
        "source": {
          "type": "string",
          "description": "The list or prospecting run the contact came from."
        },
        "status": {
          "type": "string",
          "description": "One of new, contacted, replied, qualified, unsubscribed, bounced, closed."
        },
        "company_id": {
          "type": "string",
          "description": "Company id."
        }
      },
      "additionalProperties": false
    }
    arguments 37 lines
  • upsert_contact auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "email"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Full name."
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Short labels."
        },
        "email": {
          "type": "string",
          "description": "Contact email, the dedupe key."
        },
        "title": {
          "type": "string",
          "description": "Job title."
        },
        "fields": {
          "type": "object",
          "description": "Free-form custom columns, for example {\"stack\":\"Next.js\",\"funding\":\"seed\"}. Values are strings or numbers.",
          "additionalProperties": true
        },
        "source": {
          "type": "string",
          "description": "The list or run this contact came from."
        },
        "status": {
          "type": "string",
          "description": "new, contacted, qualified or closed. replied, unsubscribed and bounced are set by the system or the operator."
        },
        "timezone": {
          "type": "string",
          "description": "IANA zone such as Europe/Paris. Campaigns send inside the window in this zone."
        },
        "company_name": {
          "type": "string",
          "description": "Company name."
        },
        "company_domain": {
          "type": "string",
          "description": "Company domain, for example acme.com."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 57 lines
  • create_deal auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "title"
      ],
      "properties": {
        "stage": {
          "type": "string",
          "description": "lead (default), contacted, qualified, proposal, won or lost."
        },
        "title": {
          "type": "string",
          "description": "Deal title."
        },
        "fields": {
          "type": "object",
          "description": "Free-form custom columns, for example {\"stack\":\"Next.js\",\"funding\":\"seed\"}. Values are strings or numbers.",
          "additionalProperties": true
        },
        "source": {
          "type": "string",
          "description": "Where it came from."
        },
        "currency": {
          "type": "string",
          "description": "3-letter code, default EUR."
        },
        "company_id": {
          "type": "string",
          "description": "Company id."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        },
        "value_cents": {
          "type": "integer",
          "minimum": 0,
          "description": "Deal value in cents."
        },
        "contact_email": {
          "type": "string",
          "description": "Link the contact with this email."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 51 lines
  • move_deal auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "deal_id",
        "stage"
      ],
      "properties": {
        "stage": {
          "type": "string",
          "description": "Target stage."
        },
        "deal_id": {
          "type": "string",
          "description": "Deal id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • draft_email auth-required never probed

    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 the response says so. Refuses with contact_suppressed when the contact replied, unsubscribed or bounced. One recipient per message, plain text, no attachments. Accepts only contact_id (or to), subject, body: any other argument is rejected with unknown_field. The response carries warnings (codes: open_draft_exists when another unsent draft to the same contact exists, emailed_N_days_ago when mail went out in the last 3 days, contact_status_<status>) and prior_emails; check them before drafting a second message to the same person. Requires the draft_email scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "subject",
        "body"
      ],
      "properties": {
        "to": {
          "type": "string",
          "description": "Or the contact's email address."
        },
        "body": {
          "type": "string",
          "description": "Plain-text body. The platform adds the sender identity and unsubscribe footer."
        },
        "subject": {
          "type": "string",
          "description": "Single-line subject."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • list_email_status auth-required never probed

    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_ago) and prior_emails. Filter by status (comma separated), run_id or contact_id.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "Page size (default 50)."
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from a previous response."
        },
        "run_id": {
          "type": "string",
          "description": "Run id."
        },
        "status": {
          "type": "string",
          "description": "For example rejected,failed."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • mark_replied auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "description": "The reply text, if you have it."
        },
        "email": {
          "type": "string",
          "description": "Or the contact email."
        },
        "subject": {
          "type": "string",
          "description": "Reply subject."
        },
        "contact_id": {
          "type": "string",
          "description": "Contact id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 26 lines
  • create_campaign auth-required never probed

    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 select contacts in the same call. It starts as a draft; call simulate_campaign, then launch_campaign. Delivery is a dry run (nothing leaves the system) until the operator switches sending on. Requires the manage_campaigns scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Campaign name."
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          },
          "maxItems": 12,
          "description": "Ordered steps. email: {type:\"email\", variants:[{subject, body, weight?}] or subject+body, condition?, reply_in_thread?}. wait: {type:\"wait\", days, business_days?}. task: {type:\"task\", title, due_in_days?, kind? (task|call|meeting), assignee? (human|agent), wait_for_done?}. Templates: {{first_name}} {{last_name}} {{name}} {{email}} {{title}} {{company.name}} {{company.domain}} {{fields.<key>}} {{sender.name}}, with {{var | default: \"text\"}}."
        },
        "enroll": {
          "type": "object",
          "description": "Same selectors as enroll_contacts, applied right after creation.",
          "additionalProperties": true
        },
        "window": {
          "type": "object",
          "description": "Local send window, default {\"start\":\"09:00\",\"end\":\"17:00\"}.",
          "additionalProperties": true
        },
        "stop_on": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "reply, bounce, unsubscribe, deal_stage_change, contact_status_change."
        },
        "strategy": {
          "type": "string",
          "description": "Your stated plan: who you are targeting and why. The operator reads it before approving."
        },
        "timezone": {
          "type": "string",
          "description": "IANA zone for fixed mode."
        },
        "daily_cap": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1
        },
        "send_days": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "mon..sun, default weekdays."
        },
        "skip_dates": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Dates like 2026-12-25 with no sending."
        },
        "description": {
          "type": "string",
          "description": "Short description."
        },
        "identity_id": {
          "type": "string",
          "description": "Sending identity id, default dry_run."
        },
        "track_opens": {
          "type": "boolean",
          "description": "Default false. Opens are unreliable."
        },
        "timezone_mode": {
          "type": "string",
          "description": "contact (default: each contact's own zone) or fixed."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 86 lines
  • update_campaign auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New name."
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          },
          "maxItems": 12,
          "description": "Ordered steps. email: {type:\"email\", variants:[{subject, body, weight?}] or subject+body, condition?, reply_in_thread?}. wait: {type:\"wait\", days, business_days?}. task: {type:\"task\", title, due_in_days?, kind? (task|call|meeting), assignee? (human|agent), wait_for_done?}. Templates: {{first_name}} {{last_name}} {{name}} {{email}} {{title}} {{company.name}} {{company.domain}} {{fields.<key>}} {{sender.name}}, with {{var | default: \"text\"}}."
        },
        "window": {
          "type": "object",
          "additionalProperties": true
        },
        "stop_on": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "strategy": {
          "type": "string",
          "description": "New strategy text."
        },
        "timezone": {
          "type": "string",
          "description": "IANA zone."
        },
        "daily_cap": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1
        },
        "send_days": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "skip_dates": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "description": {
          "type": "string",
          "description": "New description."
        },
        "identity_id": {
          "type": "string",
          "description": "Sending identity id."
        },
        "track_opens": {
          "type": "boolean"
        },
        "timezone_mode": {
          "type": "string",
          "description": "contact or fixed."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 80 lines
  • enroll_contacts auth-required never probed

    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=true returns who would be enrolled and who skipped. Requires the manage_campaigns scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "q": {
          "type": "string",
          "description": "Text in name, email or title."
        },
        "tag": {
          "type": "string",
          "description": "Every contact with this tag."
        },
        "list": {
          "type": "string",
          "description": "Alias of source."
        },
        "fields": {
          "type": "object",
          "description": "Exact-match filter on custom fields.",
          "additionalProperties": true
        },
        "source": {
          "type": "string",
          "description": "Every contact from this source or list."
        },
        "status": {
          "type": "string",
          "description": "Every contact with this status."
        },
        "dry_run": {
          "type": "boolean"
        },
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "contact_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Contact ids (up to 1000)."
        },
        "on_conflict": {
          "type": "string",
          "description": "skip (default) or move."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 56 lines
  • simulate_campaign auth-required never probed

    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 written or sent. It uses the same planner as the real scheduler, so this is what the scheduler will do.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "as_of": {
          "type": "string",
          "description": "ISO date-time to simulate from, default now."
        },
        "contacts": {
          "type": "integer",
          "maximum": 1000,
          "minimum": 1,
          "description": "How many contacts to render (default 1000)."
        },
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "horizon_days": {
          "type": "integer",
          "maximum": 60,
          "minimum": 1
        }
      },
      "additionalProperties": false
    }
    arguments 28 lines
  • launch_campaign auth-required never probed

    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 scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • resume_campaign auth-required never probed

    Resume a paused campaign. Requires the manage_campaigns scope.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • stop_enrollment auth-required never probed

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

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id",
        "enrollment_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        },
        "enrollment_id": {
          "type": "string",
          "description": "Enrollment id."
        },
        "idempotency_key": {
          "type": "string",
          "description": "Optional. Repeating a call with the same key and the same arguments returns the first result instead of writing again, so retries are safe."
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • campaign_report auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "required": [
        "campaign_id"
      ],
      "properties": {
        "campaign_id": {
          "type": "string",
          "description": "Campaign id."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • list_sending_identities auth-required never probed

    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.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id cebb21ab72194782.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/cebb21ab72194782/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/cebb21ab72194782/badge.svg)](https://brick.blue/agent/cebb21ab72194782?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on grain64.com 1 entry

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.