Tools Reference
The Free Edition (@elicitly/local) exposes three tools. Each returns its result as
a JSON string. The shapes below match the server’s handlers exactly.
DOCTOR
Section titled “DOCTOR”Reports the connected host’s elicitation / sampling / roots capabilities (form vs
url), and — with probe_elicitation: true — runs one live elicitation round-trip
and classifies the result.
Input
{ "probe_elicitation": false }probe_elicitation(boolean, optional, defaultfalse) — whentrue, fire one real elicitation and record what happened.
Output (passive, no probe)
{ "client": { "name": "claude-code", "title": null, "version": "2.1.76" }, "protocolVersion": "2025-11-25", "capabilities": { "elicitation": true, "elicitationForm": true, "elicitationUrl": false, "sampling": true, "roots": true, "experimental": null }, "server": { "name": "elicitly", "version": "0.1.0" }}elicitationForm— the host advertises form-mode elicitation (an emptyelicitation: {}counts, per spec).elicitationUrl— the host advertises url-mode elicitation.
Output (with probe_elicitation: true) adds an elicitationProbe:
{ "elicitationProbe": { "attempted": true, "action": "accept", "latencyMs": 1840, "data": "ok", "verdict": "working" }}verdict is one of:
| verdict | meaning |
|---|---|
working |
the user accepted; elicitation round-trips correctly |
user_declined |
the user declined/cancelled after a real prompt |
advertised_but_broken |
advertised, but cancelled faster than a human could (< 250 ms) — the host auto-cancelled |
unsupported |
the call threw / errored |
If the host never advertised elicitation, the probe is skipped:
{ "elicitationProbe": { "attempted": false, "reason": "client did not advertise elicitation" } }ELICIT_FORM
Section titled “ELICIT_FORM”Fire a form elicitation with your own JSON schema; returns the raw {action, content}.
Input
{ "message": "Enter release details", "requestedSchema": { "type": "object", "properties": { "version": { "type": "string" }, "prerelease": { "type": "boolean" } }, "required": ["version"] }}Output
On accept, content holds the collected fields:
{ "action": "accept", "content": { "version": "1.2.0", "prerelease": false } }On decline, cancel, or error, content is null:
{ "action": "decline", "content": null }(action is "accept", "decline", "cancel", or "error".)
CONFIRM
Section titled “CONFIRM”Ask the user a yes/no question — a convenience wrapper over ELICIT_FORM. Override
yesLabel / noLabel to localize (e.g. Sí/No, Oui/Non).
Input
{ "question": "Ship it?", "yesLabel": "Yes", "noLabel": "No" }question(string, required)yesLabel(string, optional, default"Yes")noLabel(string, optional, default"No")
Output
{ "confirmed": true, "action": "accept" }- Accept “Yes” →
{ "confirmed": true, "action": "accept" } - Accept “No” →
{ "confirmed": false, "action": "accept" } - Decline →
{ "confirmed": false, "action": "decline" } - Cancel →
{ "confirmed": null, "action": "cancel", "question": "Ship it?" } - Error →
{ "confirmed": null, "question": "Ship it?" }