Skip to content

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.

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, default false) — when true, 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 empty elicitation: {} 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" } }

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".)

Ask the user a yes/no question — a convenience wrapper over ELICIT_FORM. Override yesLabel / noLabel to localize (e.g. /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?" }