name: tool-recommend
kind: tool
description: Turn a question kind (an intent ID) into ranked draft requests — placeholder skeletons, or predict-checked drafts bound to a cohort's fields.
type: reference
applies_to: mcp
When to use
CALL WHEN YOU KNOW THE KIND OF QUESTION BUT NOT THE REQUEST.
Get ranked drafts instead of JSON built from memory. CLI twin: pulse recommend --intent ID [--cohort C] [--field F …] [--level L] [--limit N] [--json].
Input
intent(string, required): an ID from theintentsskill. Unknown or empty →PULSE_RECOMMEND_INTENT_UNKNOWN;details.validlists every ID.cohort(string): a.pulsepath. Set → drafts BOUND to its fields, each predict-checked. Omit → UNBOUND skeletons.fields(array, cohort only): hints; each pins the first role of the intent it fits. Not a field, or fits no role →SERVICE_VALIDATION.level(basic/intermediate/advanced): rank that level first. Default: simplest first.limit(int): cap, default 10.
Output
intent, bound, shapes (the roles a request’s fields fill), recommendations[], routes_to, truncated, candidates_considered. Each recommendation: operator, category, level, why, bound, request (the draft), placeholders, needs ({param, why}), advisories (predict’s), alternatives, follow_ups.
Gotchas
- Unbound drafts never run as-is. Every
"<placeholder>"string (named after its wire key, listed inplaceholders) must be replaced; thenpulse_predictit. bound: falseon a cohort draft means itneedsa value only you can choose — a success value, a reference mean, a model family. Fill eachneeds[].parambefore running.bound: truedrafts passed predict; still read theiradvisories.- Empty
recommendations+routes_tois not an error: tooling answers it, or nothing serves it yet. - Reads header, schema and sidecar only. Unreadable cohort →
DATA_FILE. - Ranking: hints, fully bound, level, fewest advisories.
See
intents— every intent ID and its field shapes.tool-predict— re-check a draft after filling placeholders.session-bootstrap— where recommend sits in a session.