Tool reference

Hyperdex exposes 20 MCP tools, 2 resources and 3 prompts. This page is generated from the live server, so it always matches what your agent sees.

Your agent chooses tools by itself; you rarely need to name them. Every tool returns JSON. Errors are returned as { "error": { "code", "message", "hint" } }; see errors.

Read

Find and understand records. All need crm:read.

whoami

Who am I

crm:readread-only

Returns your workspace, agent identity, scopes, the workspace's pipeline stages and record counts. Call once at the start of a session.

No parameters.

Search the CRM

crm:readread-only

Find people, organizations, deals and logged activities by name, email, domain, keywords or meaning. Tolerates typos and partial names. Returns ids with one-line summaries; follow up with get_briefing for detail. Search before creating records to avoid duplicates.

ParameterTypeDescription
queryrequiredstringNatural-language or keyword query, e.g. 'jane acme', 'jane@acme.com', 'who raised pricing concerns'up to 500 characters
types"person" | "organization" | "deal" | "activity"[]Restrict result types. Default: all
include_archivedbooleandefault false
limitinteger1 to 25, default 10

get_briefing

Get briefing

crm:readread-only

Everything you need to act on one person, organization or deal, condensed to fit a token budget: core fields, summary, relationships, open deals, open tasks and the most recent activity. Includes `version`, which update_entity requires. Use get_history for older activity.

ParameterTypeDescription
idrequiredidRecord id exactly as returned by another tool
max_tokensintegerApproximate size budget for the response300 to 8000, default 1500
include_provenancebooleanInclude who/what set each field, with confidencedefault false

get_history

Get activity history

crm:readread-only

Paginated timeline of activity for one entity, newest first. Use after get_briefing when you need older or full-length activity.

ParameterTypeDescription
entity_idrequiredidRecord id exactly as returned by another tool
kinds"email" | "call" | "meeting" | "note" | "message" | "status_change" | "field_change" | "task" | "system"[]
sincedate-timeOnly activity at or after this time
include_contentbooleanFull content; false returns titles and excerpts onlydefault true
limitinteger1 to 50, default 20
cursorstringnext_cursor from a previous call

query_pipeline

Query the deal pipeline

crm:readread-only

Filter and summarize deals: totals per stage plus matching deals. Use stalled_days to find deals with no logged interaction recently. Open deals only unless include_closed is true.

ParameterTypeDescription
stagesstring[]Only these stages (see whoami for valid stages)
include_closedbooleandefault false
organization_ididRecord id exactly as returned by another tool
min_amountnumberat least 0
max_amountnumberat least 0
currencystring
close_afterdate
close_beforedate
stalled_daysintegerNo email/call/meeting/note/message logged in this many days1 to 3650
sort"amount" | "close_date" | "last_activity" | "updated"default "close_date"
limitinteger1 to 100, default 25
offsetinteger0 to 9007199254740991, default 0

Write

Add and change records and log what happened. All need crm:write.

upsert_entity

Create or match a person, organization or deal

crm:writesafe to retry

Creates a record, or matches an existing one instead of duplicating it. People are matched by email, organizations by domain, deals by exact name.

Without an email/domain, similar names are returned as status "possible_duplicates" and nothing is written: then call again with match_id (to update that record) or create_anyway: true.

On a match, on_match decides what happens: "fill_empty" (default) only fills blank fields and reports conflicting values in skipped_fields; "overwrite" replaces them.

Pass organization_id to link a person (works_at) or deal (deal_for) to an organization.

ParameterTypeDescription
namerequiredstringup to 500 characters
emailstringperson onlyup to 320 characters
phonestringperson onlyup to 50 characters
titlestringperson only: job titleup to 200 characters
domainstringorganization only: bare domain, e.g. acme.comup to 253 characters
stagestringdeal only: one of the workspace pipeline stagesup to 50 characters
amountnumberdeal onlyat least 0
currencystringdeal only: ISO 4217, e.g. USD
close_datedatedeal only: expected close date YYYY-MM-DD
summarystringA short paragraph describing this record; keep it currentup to 4000 characters
kindrequired"person" | "organization" | "deal"
tagsstring[]up to 50 items
attributesobjectFree-form fields that have no typed column, e.g. {linkedin_url, industry, employee_count}
organization_ididperson/deal: the organization they belong to
match_ididUpdate this specific existing record instead of matching automatically
create_anywaybooleanCreate even if similar names existdefault false
on_match"fill_empty" | "overwrite"default "fill_empty"
sourceobjectProvenance of the information. Always provide it when the data came from somewhere specific.
source.typerequiredstringWhere the information came from, e.g. email, call_transcript, website, linkedin, user, inferenceup to 50 characters
source.refstringIdentifier in the source system, e.g. a message idup to 500 characters
source.urlstringup to 2000 characters
confidencenumberHow sure you are, 0..1. Use < 0.5 for guesses and inferences.0 to 1, default 0.8
idempotency_keystringOptional. Retrying with the same key returns the original result instead of writing twice.up to 200 characters

update_entity

Update a record

crm:write

Changes fields on an existing record. Requires expected_version (from get_briefing or a previous write); if another agent changed the record first you get VERSION_CONFLICT and should re-read before retrying. Set a field to null to clear it. Stage changes are logged as status_change events.

ParameterTypeDescription
idrequiredidRecord id exactly as returned by another tool
expected_versionrequiredinteger1 to 9007199254740991
setobjectFields to change; null clears a fielddefault {}
set.namestringup to 500 characters
set.emailstring | null
set.phonestring | null
set.titlestring | null
set.domainstring | null
set.stagestringup to 50 characters
set.amountnumber | null
set.currencystring | null
set.close_datedate | null
set.summarystring | null
attributesobjectKeys to set; a null value deletes the key
add_tagsstring[]up to 50 items
remove_tagsstring[]up to 50 items
verifiedbooleantrue if you confirmed these values from an authoritative source
sourceobjectProvenance of the information. Always provide it when the data came from somewhere specific.
source.typerequiredstringWhere the information came from, e.g. email, call_transcript, website, linkedin, user, inferenceup to 50 characters
source.refstringIdentifier in the source system, e.g. a message idup to 500 characters
source.urlstringup to 2000 characters
confidencenumberHow sure you are, 0..1. Use < 0.5 for guesses and inferences.0 to 1, default 0.8

Link or unlink two records

crm:writesafe to retry

Creates (or with remove: true deletes) a directed relationship. Use snake_case relations, e.g. works_at (person→org), reports_to (person→person), introduced_by, deal_for (deal→org), contact_on (person→deal), partner_of, competitor_of, subsidiary_of.

ParameterTypeDescription
from_idrequiredidRecord id exactly as returned by another tool
to_idrequiredidRecord id exactly as returned by another tool
relationrequiredstring
attributesobjecte.g. {role: 'economic buyer'}
removebooleandefault false
sourceobjectProvenance of the information. Always provide it when the data came from somewhere specific.
source.typerequiredstringWhere the information came from, e.g. email, call_transcript, website, linkedin, user, inferenceup to 50 characters
source.refstringIdentifier in the source system, e.g. a message idup to 500 characters
source.urlstringup to 2000 characters

log_activity

Log an interaction

crm:writesafe to retry

Records an email, call, meeting, note or message against one or more records (e.g. the person, their organization and the deal). This is the CRM's memory: log every meaningful interaction, with the source. Optionally creates follow-up tasks in the same call. Use an idempotency_key such as the email message id so retries never double-log.

ParameterTypeDescription
kindrequired"email" | "call" | "meeting" | "note" | "message"
entity_idsrequiredid[]up to 20 items
contentrequiredstringWhat happened: the email body, call notes, transcript excerpt or summaryup to 100000 characters
titlestringOne line, e.g. the email subject or 'Discovery call'up to 500 characters
direction"inbound" | "outbound" | "internal"
occurred_atdate-timeWhen it happened. Default: now
dataobjectStructured extras, e.g. {participants: [...], duration_minutes: 30, sentiment: 'positive'}
sourceobjectProvenance of the information. Always provide it when the data came from somewhere specific.
source.typerequiredstringWhere the information came from, e.g. email, call_transcript, website, linkedin, user, inferenceup to 50 characters
source.refstringIdentifier in the source system, e.g. a message idup to 500 characters
source.urlstringup to 2000 characters
follow_upsobject[]up to 10 items
follow_ups[].titlerequiredstringup to 500 characters
follow_ups[].descriptionstringup to 10000 characters
follow_ups[].due_atdate-time
follow_ups[].priorityinteger1 = most urgent1 to 5, default 3
follow_ups[].entity_ididDefaults to the first entity of the activity
idempotency_keystringOptional. Retrying with the same key returns the original result instead of writing twice.up to 200 characters

Tasks

A shared work queue with leases.

create_task

Create a task

crm:writesafe to retry

Adds work to the shared queue, optionally about a record and optionally assigned to a named agent (only that agent can then claim it).

ParameterTypeDescription
titlerequiredstringup to 500 characters
descriptionstringup to 10000 characters
due_atdate-time
priorityinteger1 = most urgent1 to 5, default 3
entity_ididDefaults to the first entity of the activity
assign_tostringAgent nameup to 100 characters
idempotency_keystringOptional. Retrying with the same key returns the original result instead of writing twice.up to 200 characters

list_tasks

List tasks

crm:readread-only

Lists tasks, most urgent first. A claimed task whose lease expired is reported as open.

ParameterTypeDescription
status"open" | "claimed" | "done" | "cancelled"[]default ["open","claimed"]
entity_ididRecord id exactly as returned by another tool
minebooleanOnly tasks assigned to or claimed by youdefault false
due_beforedate-time
limitinteger1 to 50, default 20
cursorstring

claim_task

Claim a task

crm:write

Takes a lease on a task so no other agent works on it. Pass task_id, or omit it to claim the most urgent available task (optionally for one entity). Re-claiming your own task extends the lease. Finish with complete_task before the lease expires, or it returns to the queue.

ParameterTypeDescription
task_ididRecord id exactly as returned by another tool
entity_ididRecord id exactly as returned by another tool
lease_minutesinteger1 to 240, default 30

complete_task

Finish or release a task

crm:write

outcome done/cancelled closes the task (logged on the related record); released puts it back in the queue for another agent.

ParameterTypeDescription
task_idrequiredidRecord id exactly as returned by another tool
outcomerequired"done" | "cancelled" | "released"
resultstringWhat was done, or why it was cancelled/releasedup to 10000 characters

Approvals

Outward-facing actions wait for a second agent.

propose_action

Propose a gated action

crm:writesafe to retry

Before doing anything outward-facing or risky (sending an email, offering a discount, changing contract terms, bulk changes), record it here and wait for approval from an agent with crm:approve. Poll list_proposals for the decision; after you act, mark it executed with resolve_proposal.

ParameterTypeDescription
actionrequiredstringsnake_case verb, e.g. send_email, offer_discount
entity_ididRecord id exactly as returned by another tool
payloadrequiredobjectExactly what would be done, e.g. {to, subject, body}
rationalerequiredstringup to 4000 characters
idempotency_keystringOptional. Retrying with the same key returns the original result instead of writing twice.up to 200 characters

list_proposals

List proposals

crm:readread-only

Proposals awaiting a decision (default), or with other statuses. Approvers use this as their review queue; proposers use it to check decisions.

ParameterTypeDescription
status"pending" | "approved" | "rejected" | "executed"[]default ["pending"]
minebooleanOnly proposals you madedefault false
entity_ididRecord id exactly as returned by another tool
limitinteger1 to 50, default 20

resolve_proposal

Approve, reject or mark a proposal executed

crm:write

approved/rejected: requires crm:approve, and you cannot decide your own proposal. executed: the proposer (or approver) records that the approved action was carried out.

ParameterTypeDescription
proposal_idrequiredidRecord id exactly as returned by another tool
statusrequired"approved" | "rejected" | "executed"
notestringup to 4000 characters

Clean-up

Archive and merge. Nothing is ever hard-deleted.

archive_entity

Archive or restore a record

crm:deletecan archive or mergesafe to retry

Hides a record from search and pipelines without deleting it (nothing is ever hard-deleted). restore: true brings it back.

ParameterTypeDescription
idrequiredidRecord id exactly as returned by another tool
reasonrequiredstringup to 1000 characters
restorebooleandefault false

merge_entities

Merge duplicate records

crm:deletecan archive or merge

Merges merge_id into keep_id (same kind). keep_id's values win; its blank fields are filled from merge_id. Links, activity, tasks and proposals move to keep_id. merge_id stays as a pointer, so old ids still resolve.

ParameterTypeDescription
keep_idrequiredidRecord id exactly as returned by another tool
merge_idrequiredidRecord id exactly as returned by another tool
reasonrequiredstringup to 1000 characters

Admin

Keys, stages and the playbook.

manage_agents

Manage agent API keys

crm:admincan archive or merge

Workspace admin: list agents, create a key for a new agent (returned once; store it securely), or revoke one. Give each agent the fewest scopes it needs: crm:read, crm:write, crm:delete (archive/merge), crm:approve (decide proposals), crm:admin.

ParameterTypeDescription
actionrequired"list" | "create" | "revoke"
namestringcreate: the new agent's name, e.g. 'research-agent'up to 100 characters
scopes"crm:read" | "crm:write" | "crm:delete" | "crm:approve" | "crm:admin"[]create: default [crm:read, crm:write]
agent_ididrevoke: the agent to revoke

configure_workspace

Configure the workspace

crm:adminsafe to retry

Workspace admin: set the deal pipeline stages (ordered; closed_stages must be a subset) and the playbook, a markdown document of rules every agent should follow (served as the crm://playbook resource).

ParameterTypeDescription
pipeline_stagesstring[]up to 30 items
closed_stagesstring[]
playbookstringup to 50000 characters

Resources and prompts

Resources are documents agents can read. Prompts are ready-made workflows a client can offer you.

ResourceWhat it holds
crm://guideHow to use this CRM
crm://playbookThis workspace's playbook
PromptWhat it doesArguments
meeting_prepBrief yourself on a person, organization or deal before a meetingwho
log_conversationTurn a transcript, email thread or notes into CRM updatestext, source
pipeline_reviewFind stalled and at-risk deals and propose next stepsnone