Naming: noun_verb
Tool names are <noun>_<verb>, underscore-separated, lowercase. The noun is the domain
primitive; the verb is the workflow outcome.
Names use an underscore, never a dot. Underscore grouping resolves the same across every MCP
client (Claude Code, Cursor, Claude Desktop) with no sanitization step.
Verbs name a workflow outcome, not a CRUD operation on a row.
study_run resolves the
audience, materializes the people, and dispatches the modality batch in one call, then polls
to a terminal state when you pass wait=True. chatbot_setup absorbs detection, creation, and
a smoke test. One tool stands in for what a resource-per-CRUD surface needs four to seven calls
to do.
The noun keeps the domain distinction legible.
study_* is the journey primitive (how do
people experience this end to end), ask_* is the comparison primitive (which of these
lands). You pick the right tool from its name, before reading any description.Polymorphic _get
Each readable noun has one _get tool. It is the list reader, the single-entity reader, and
the projection reader, discriminated by which optional id you set, never by an action=
enum.
alias | uuid
List mode. Returns a paginated envelope of entities under that scope.
alias | uuid
Single-entity read. An optional
view= selects a projection: summary, full,
per_participant, transcripts, or insights.(alias | uuid)[]
Cross-entity read. Used for benchmark comparisons across several entities at once.
[validation_error] before
any backend call. Because every mode is a read, the read-only annotation (below) holds
across all of them.
The _get tools: workspace_get,
brand_get, study_get,
ask_get, person_get,
chatbot_get. The status reads
(connect_status,
site_access_get,
upload_status) follow the same read-only contract.
Mutations are never polymorphic across verbs. Create, run, revise, and delete are separate
named tools so the safety annotation cannot collapse.
Annotation tiers
Every tool carries one MCP annotation tier. Hosts read the tier to decide what to auto-approve and what to gate. The per-tool tier is on each tool’s reference page and in the catalog index.
A lifecycle flip is not destructive.
simulation_cancel walks a person to cancelled without
removing any artifact, so it is write, not destructive. simulation_extend resumes a
terminal person with more steps, so it is long-running. Reserve destructive for actual data
removal.
Ids: alias or UUID
Every id parameter accepts the full UUID or the entity’s short alias. The two forms are interchangeable anywhere an id is expected; pass back whichever the previous tool returned.
An id parameter validates the prefix: pass a
w- workspace alias where a study id is expected
and it raises [validation_error] before any backend call. A brand resolves through the
workspace prefix, since a brand is a workspace underneath.
Aliases are minted per server instance and held in memory, so an alias from one session may
be unknown to another. When an alias is not recognized, the error names the read tool that
re-mints it (for example
study_get(workspace_id=...)), or pass the full UUID from the
entity’s id field. The overview defines the alias model in full.See also
Tool catalog
Every tool with its annotation tier and domain page.
Resources
The
ish:// resources that mirror reads without a tool call.Concepts overview
The entity tree and the alias model both conventions build on.
Study tools
The
study_* namespace, where most conventions are visible at once.