Elicitly Pro
Server Details
Human-in-the-loop for AI agents over MCP: durable approvals with a hosted review page & audit trail
- Status
- Healthy
- Uptime
- 80.2% over 60 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 12 tools
The three monitoring tools (elicit_await, elicit_status, elicit_result) and the elicitation variants (approval, form, confirm, proposal, selection) have real overlap risk, but the descriptions explicitly cross-reference each other ('use elicit_form instead', 'prefer this over polling elicit_status') to steer selection. An agent can distinguish them, though the breadth of elicitation flavors makes misselection possible.
Every tool follows a strict elicit_<verb/noun> snake_case pattern with no deviations. The prefix cleanly groups the whole surface and the suffixes are descriptive and predictable.
12 tools is well-scoped for an elicitation platform, covering creation, monitoring, cancellation, history, and diagnostics. A couple of conveniences (elicit_confirm as a wrapper over elicit_form, elicit_ping) are slightly redundant but still earn their place.
The lifecycle is well covered: multiple request-creation modes, blocking and non-blocking decision retrieval, outcome fetch, cancellation, history, and host-capability diagnostics. Minor gaps exist (e.g. no tool to update or list saved displayTemplates), but core workflows have no dead ends.
Available Tools
13 toolselicit_approvalRequest human approvalInspect
Request human approval before proceeding. Async: returns immediately with a pending request that a human decides later on the hosted review page (block with elicit_await, fetch the outcome with elicit_result); for a synchronous in-session form answered by the connected host, use elicit_form instead. Two modes, at least one of context / requestedSchema is required: (1) json mode — pass context, a read-only payload the reviewer approves or declines as-is; optionally also pass displayTemplate, a LiquidJS template that customizes how context is rendered on the review page (instead of the default raw JSON view); (2) form mode — pass requestedSchema, a JSON Schema restricted to the MCP elicitation requestedSchema subset (MCP 2025-11-25): a flat object whose properties are strings, numbers/integers, booleans, or single/multi-select enums (no nested objects, arrays of objects, $ref, or allOf) — the reviewer fills in these fields on the review page and submits them back as the submitted data. Both may be passed together: context (optionally rendered via displayTemplate) is then displayed as read-only context above the form (it is NOT merged into or used to pre-fill the form fields, which are seeded only from requestedSchema defaults). Per the MCP elicitation spec, form mode MUST NOT be used to request secrets, credentials, or other sensitive information from the reviewer.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed. | |
| context | No | json mode: a read-only JSON payload the reviewer approves or declines as-is. Echoed back verbatim in elicit_result. Rendered as raw JSON unless `displayTemplate` is given. | |
| message | Yes | The prompt shown to the reviewer at the top of the review page — say what needs approving and why. | |
| displayTemplate | No | Optional LiquidJS template that customizes how `context` is rendered on the review page. `context` is exposed to the template under the `context` key (e.g. {{ context.recordId }}). | |
| requestedSchema | No | form mode: JSON Schema in the MCP elicitation requestedSchema subset (flat object of string / number / integer / boolean / enum properties — no nested objects, arrays of objects, $ref, or allOf). The reviewer fills these fields on the review page; property `default`s seed the form. | |
| expiresInSeconds | No | How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Always `pending` at creation. |
| expiresAt | Yes | When the request stops being decidable (timestamp). |
| reviewUrl | Yes | URL of the hosted review page where a human decides this request. |
| elicitationId | Yes | Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel. |
| elicitationDelivered | Yes | True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself. |
elicit_awaitWait for a decisionRead-onlyInspect
Long-poll for a decision on a pending elicitation: blocks until the request is submitted, declined, canceled, or expired — or until the server's polling window closes. Returns { status } (pending | submitted | declined | canceled | expired | consumed); a pending return means the window elapsed, so call again to keep waiting. Prefer this over polling elicit_status in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| elicitationId | Yes | The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | The request's state when the wait ended; `pending` means the polling window elapsed undecided — call again to keep waiting. |
elicit_cancelCancel a pending elicitationDestructiveInspect
Withdraw a pending elicitation you created — the plan changed or the request is superseded. The request resolves canceled: a terminal status distinct from declined (the reviewer's explicit no) and expired (nobody decided in time). The review page stops accepting decisions, pending elicit_await calls wake, and elicit_result has no outcome to fetch. Errors if the request was already decided or has expired; a cancel racing a concurrent decision loses cleanly to whichever landed first.
| Name | Required | Description | Default |
|---|---|---|---|
| elicitationId | Yes | The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | The request is now terminally canceled. |
elicit_confirmAsk the user to confirm (OK/Cancel)Inspect
Ask the user an OK/Cancel confirmation via elicitation (convenience wrapper over elicit_form), modeled on JavaScript's confirm(). Use this for a single yes/no question; use elicit_form to collect arbitrary fields. Returns three-state {confirmed}: true = proceed, false = a human explicitly said no, null = no answer was obtained (reason: "dismissed" | "error") — ask again later.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Relabel or localize the OK/Cancel buttons. Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed. | |
| message | Yes | The yes/no question shown to the user in the host's elicitation dialog. | |
| timeoutSeconds | No | How long to wait for the answer, in seconds (default 300, clamped 60-3600). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | Present only when confirmed is null: "dismissed" = the elicitation was closed unanswered (including timeout), "error" = it failed. |
| confirmed | Yes | true = the user chose OK; false = an explicit no (Cancel choice or declined elicitation); null = no answer was obtained. |
elicit_displayShow the user rendered contentARead-onlyInspect
Show information to the user as rendered HTML instead of Markdown: pass a LiquidJS template and a JSON context, and hosts that support MCP Apps render it inline in the conversation. Use it for tables, reports, and summaries the user should scan; it does not collect a decision (use elicit_approval, elicit_selection, or elicit_confirm for that). Values interpolated with {{ context.* }} are HTML-escaped; truthiness is JavaScript-style. Templates may load Tailwind (https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4) and DaisyUI (https://cdn.jsdelivr.net/npm/daisyui@5) with their own / tags; the view follows the host's light/dark theme via data-theme. External images, scripts, styles, and fonts load only from https://cdn.jsdelivr.net and from origins your organization's admins allow (the server routes those through its resource proxy; write their normal URLs) — anything else is blocked, and the result's notes list your organization's allowed origins. Use data: URIs for images you already have that are not publicly reachable (generated, read from a local file, or from a private source the user gave you), passed in context rather than the template (64 KB vs 32 KB). Don't download a public image just to work around the allowlist; leave it out. The rendered HTML is not returned to you — the result reports what was shown and any blocked origins.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Heading shown above the render. | |
| context | No | JSON data exposed to the template as `context`. Max 64 KB serialized. | |
| summary | No | One or two sentences describing what is shown; returned as the tool's text result. | |
| template | Yes | LiquidJS template producing an HTML fragment, rendered against {{ context.* }}. Max 32768 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | Guidance for you about this render (e.g. present the information in your reply, or which origins were blocked) — the same notes as the text result. |
| summary | Yes | What was shown (the caller's summary, or a default). |
| appsAdvertised | Yes | Whether the host advertised MCP Apps support (true/false), or null when the server couldn't tell. When false, the user may not see the render. |
| blockedOrigins | Yes | External origins the template references that the view's CSP blocks — those resources won't load. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds substantial context beyond them: the CDN allowlist (cdn.jsdelivr.net plus org-allowed origins), that disallowed origins are blocked and listed in the result notes, HTML-escaping of {{ context.* }}, JavaScript-style truthiness, Tailwind/DaisyUI support, data-theme theme following, and the fact that rendered HTML is never returned to the model. This is unusually rich operational disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the sibling routing are front-loaded in the first sentence, which is the right call. The remainder is a dense single paragraph of em-dash and parenthetical asides; nearly every clause carries usable operational detail, but the block is harder to scan than a short bulleted constraint list would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a rendering tool with an output schema, the description still closes the important gaps: it states the rendered HTML is not returned to the model, what the result does report, how interpolation is escaped, and what resource-loading will silently fail. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents all four parameters, but the description adds real meaning on top: data: URIs must be passed in context rather than the template and the 64 KB vs 32 KB budget explains why. That's a non-obvious interaction between two parameters that the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (render LiquidJS template + JSON context as HTML in the conversation) and immediately distinguishes itself from the decision-collecting siblings elicit_approval, elicit_selection, and elicit_confirm. An agent can tell this is a display-only tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when ('tables, reports, and summaries the user should scan') and an explicit when-not with named alternatives ('it does not collect a decision — use elicit_approval, elicit_selection, or elicit_confirm'). Routing between this tool and its closest siblings is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elicit_doctorDiagnose the host's elicitation supportInspect
Check whether the connected MCP host actually supports elicitation (and sampling/roots) before relying on it — advertising a capability is not the same as it working. Use it to decide whether to call elicit_form/elicit_confirm, to explain why a prompt did or didn't appear, or to contribute a host capability fingerprint. Returns a passive report derived from the initialize handshake; set probeElicitation: true to also run one live form round-trip (the user may see a dialog) and classify what really happened. Read-only. Pass share: true to contribute the report to Elicitly's public Support Matrix evidence queue — stored: this report plus the optional productName / productVersion / notes (the host product's name and version, which the report cannot see from inside, and any unusual setup); the report itself contains no elicitation payloads or conversation content. The result then carries shared: true|false.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | With share: anything unusual about the setup worth recording with the evidence. | |
| share | No | Contribute this report to Elicitly's public Support Matrix evidence queue. Stored: the report plus productName / productVersion / notes; no elicitation payloads or conversation content. | |
| productName | No | With share: the host product's name as the user sees it (e.g. "Claude Desktop") — the report cannot detect this from inside. | |
| productVersion | No | With share: the host product's version, if known. | |
| probeElicitation | No | Also fire one live form-elicitation round-trip (the user may see a dialog) and report the outcome under probes.elicitationForm. Default false: passive capability report only, no prompt. |
Output Schema
| Name | Required | Description |
|---|---|---|
| probes | No | Present only when probeElicitation was true: the live round-trip's attempted/action/latencyMs/verdict. |
| shared | No | Present when share: true was passed — whether the report landed in the evidence queue. |
| support | Yes | Elicitly's derived support booleans, inferred from the advertised capabilities. |
| initialize | Yes | The MCP initialize handshake echoed verbatim: { request: { clientInfo, capabilities }, response: { protocolVersion, capabilities, serverInfo } }. |
| shareError | No | Present when sharing was requested but failed: a one-line error summary. |
| deprecations | Yes | Spec-level deprecation advisories (MCP 2026-07-28, SEP-2577) for the client features the report surfaces. |
elicit_formAsk the user to fill a formInspect
Trigger a form elicitation with a caller-supplied JSON schema; returns the raw {action, content}. For a plain OK/Cancel question, prefer elicit_confirm. MUST NOT be used to request secrets, credentials, or other sensitive information.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The instruction shown to the user above the form fields. | |
| timeoutSeconds | No | How long to wait for the answer, in seconds (default 300, clamped 60-3600) — raise it for forms with several fields. | |
| requestedSchema | Yes | JSON Schema for the form, restricted to the MCP elicitation requestedSchema subset: a flat object whose properties are strings, numbers/integers, booleans, or enums — no nested objects, arrays of objects, $ref, or allOf. See https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation#requested-schema |
Output Schema
| Name | Required | Description |
|---|---|---|
| action | Yes | accept = the user submitted the form; decline = an explicit no; cancel = dismissed unanswered (including timeout); error = the elicitation failed. |
| content | Yes | On accept, the submitted values keyed by requestedSchema property name; null for every other action. |
elicit_historyList past elicitationsRead-onlyInspect
List your past elicitations, newest first, paginated with jump-to-page. scope 'me' = your own requests; 'org' = the whole organization (admins only). Returns { items, page, pageSize, asOf, total, scope } — total lets you compute the last page (ceil(total/pageSize)); pass the returned asOf back on later pages to keep the window stable while new requests arrive.
| Name | Required | Description | Default |
|---|---|---|---|
| asOf | No | Snapshot anchor from a previous page's result — pass it back to keep pagination stable while new requests arrive. Omit on the first page. | |
| page | No | 1-based page number to fetch. | |
| scope | No | 'me' = your own requests; 'org' = the whole organization (admins only). | me |
| pageSize | No | Items per page (1-100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | Yes | The snapshot anchor this page was computed at — pass it back on later pages to keep the window stable while new requests arrive. |
| page | Yes | The 1-based page that was served. |
| items | Yes | The requested page of elicitations, newest first. |
| scope | Yes | The scope that was served. |
| total | Yes | Total matching requests — the last page is ceil(total / pageSize). |
| pageSize | Yes | Items per page that was applied. |
elicit_pingCheck connectivityARead-onlyInspect
Connectivity check for the hosted Elicitly server: echoes message back as pong: <message> over the authenticated session.
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Text to echo back (default "ping"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so no mutation concern. The description adds meaningful context beyond the annotation by specifying that it echoes the message as 'pong: <message>' and that it requires an authenticated session, which helps the agent understand expected behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the purpose ('Connectivity check'), states the resource, and explains the returned output. Every word earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and no output schema, the description is complete: it conveys purpose, behavior, the authenticated-session requirement, and the exact return format. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the 'message' parameter fully described as 'Text to echo back (default "ping")'. The description reinforces this by showing the output format, but does not add substantial new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Connectivity check') and resource ('hosted Elicitly server'), and explains the exact echo behavior. This clearly distinguishes it from sibling elicit_* tools, which are all task-oriented operations rather than a ping.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the tool is for verifying connectivity and that it operates over an authenticated session. It does not explicitly list when-not-to-use it, but the dedicated ping nature makes the usage context unambiguous among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elicit_proposalPropose a record change for reviewInspect
Ask a human to review, edit, and selectively approve a proposed record create-or-update, shown as a diff grid: one or more read-only Source columns, a read-only Current column, and an editable Proposed column. Async like elicit_approval: returns a pending request decided on the hosted review page. Pass requestedSchema (a JSON Schema in the MCP elicitation requestedSchema subset — flat object of strings/numbers/booleans/enums) to define the editable Proposed fields; each property's default is its initial proposed value (you compute it — e.g. take Current if present else Source). Pass columns to name the Source column(s) and the Current column, and fields to supply each property's Source value(s) and Current value. The reviewer edits proposed values, chooses which fields to include, and submits; the result (via elicit_result) carries decision (submitted|declined) and, on submit, formSubmission (included fields only). MUST NOT be used to request secrets or credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Per-property read-only cell values, keyed by requestedSchema property name: { <property>: { sources: { <sourceKey>: value }, current: value, include?: boolean } }. `include: false` starts the field unchecked. | |
| labels | No | Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed. | |
| columns | Yes | Names the read-only columns of the diff grid. | |
| context | No | Optional identity/context passthrough echoed back verbatim in elicit_result — NOT shown to the reviewer unless `displayTemplate` renders it. | |
| message | Yes | The prompt shown to the reviewer above the diff grid — say what change is proposed and why. | |
| displayTemplate | No | Optional LiquidJS template rendered above the grid. `context` is exposed under the `context` key (e.g. {{ context.recordId }}). Without it, `context` is not displayed. | |
| requestedSchema | Yes | JSON Schema (MCP elicitation requestedSchema subset — flat object of string / number / boolean / enum properties) defining the editable Proposed fields; each property's `default` is its initial proposed value. | |
| expiresInSeconds | No | How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Always `pending` at creation. |
| expiresAt | Yes | When the request stops being decidable (timestamp). |
| reviewUrl | Yes | URL of the hosted review page where a human decides this request. |
| elicitationId | Yes | Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel. |
| elicitationDelivered | Yes | True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself. |
elicit_resultFetch a decided elicitation's outcomeIdempotentInspect
Fetch the outcome of a decided request (poll elicit_status or block on elicit_await first — this errors while the request is still pending, after it expires undecided, or if it was canceled via elicit_cancel; repeatable reads are fine afterward). Returns { status: 'consumed', decision, context, formSubmission } for every tool. formSubmission is what the review form submitted, keyed by field name: the form fields for elicit_approval (null in json mode); { selectedIds } for elicit_selection; only the fields the reviewer included for elicit_proposal. Null on decline.
| Name | Required | Description | Default |
|---|---|---|---|
| elicitationId | Yes | The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | The outcome has been read at least once. |
| context | Yes | The caller's original `context`, echoed verbatim (null if none was supplied). |
| decision | Yes | The reviewer's choice: submitted = approved/filled in, declined = explicit no. |
| formSubmission | Yes | What the review form submitted, keyed by field name: elicit_approval's form fields (null in json mode), { selectedIds } for elicit_selection, the included fields for elicit_proposal. Null on decline. |
elicit_selectionAsk a human to choose optionsInspect
Ask a human to choose one or more options from a caller-supplied list (disambiguation, record matching, picking work items). Async like elicit_approval: returns a pending request decided on the hosted review page; the chosen option ids come back via elicit_result as selectedIds. Options render as rows of a table the Liquid templates and css can customize. Defaults to single-select — raise maxSelections for multi-select.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | Custom CSS injected on the review page to style the option table. | |
| labels | No | Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed. | |
| message | Yes | The instruction shown above the option list — say what the reviewer is choosing and why. | |
| options | Yes | The choices (1-500). Each option is an object with a required unique `id` (returned in `selectedIds`) plus any extra keys, which `rowTemplate` / `hoverTemplate` can reference (e.g. {{ option.name }}). | |
| rowTemplate | No | LiquidJS template producing the <td> cells of one option row; the option is exposed as `option` (e.g. <td>{{ option.name }}</td><td>{{ option.score }}</td>). Any link must carry target="_blank" — without it the click replaces the option table with the linked page and the reviewer loses the form. Default: a single cell of `option.label`, falling back to `option.id`. | |
| hoverTemplate | No | LiquidJS template for a per-option hover/details card; the option is exposed as `option`. Omit for no hover card. | |
| maxSelections | No | Most options the reviewer may pick (default 1 = single-select; clamped to the option count). | |
| minSelections | No | Fewest options the reviewer must pick to submit (default 1; 0 allows none). | |
| footerTemplate | No | LiquidJS template producing the table footer rows (no variables). Omit for no footer. | |
| headingTemplate | No | LiquidJS template producing the <th> cells of the table header (no variables). Omit for no header row. | |
| expiresInSeconds | No | How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Always `pending` at creation. |
| expiresAt | Yes | When the request stops being decidable (timestamp). |
| reviewUrl | Yes | URL of the hosted review page where a human decides this request. |
| elicitationId | Yes | Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel. |
| elicitationDelivered | Yes | True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself. |
elicit_statusCheck an elicitation's statusRead-onlyInspect
Non-blocking status check for an elicitation you created: returns { status } — pending | submitted | declined | canceled | expired | consumed. Read-only and repeatable (never consumes the result); use elicit_await to block on a decision and elicit_result to fetch the outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| elicitationId | Yes | The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | The request's current lifecycle state. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
- Changed
elicit_approval1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_await1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_cancel1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_confirm1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_display5 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / appsAdvertisedAdded value: +{ + "description": "Whether the host advertised MCP Apps support (true/false), or null when the server couldn't tell. When false, the user may not see the render.", + "type": [ + "boolean", + "null" + ] +} - changed
Output schema / properties / blockedOrigins / items / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / notesAdded value: +{ + "description": "Guidance for you about this render (e.g. present the information in your reply, or which origins were blocked) — the same notes as the text result.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "summary", - "blockedOrigins" -]New value: +[ + "summary", + "blockedOrigins", + "appsAdvertised", + "notes" +]
- Changed
elicit_doctor3 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / probes / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / support / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_form1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_history1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_proposal1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_result1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_selection1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
elicit_status1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
1 tool update
- Added
elicit_display
4 tool updates
- Changed
elicit_approval1 field changed- changed
Input schema / properties / displayTemplate / maxLengthPrevious value: -20000New value: +32768
- Changed
elicit_proposal1 field changed- changed
Input schema / properties / displayTemplate / maxLengthPrevious value: -20000New value: +32768
- Changed
elicit_result3 fields changed- changed
Output schema / properties / formSubmission / descriptionPrevious value: -"The reviewer-filled field values keyed by requestedSchema property name; null in json mode or on decline."New value: +"What the review form submitted, keyed by field name: elicit_approval's form fields (null in json mode), { selectedIds } for elicit_selection, the included fields for elicit_proposal. Null on decline." - removed
Output schema / properties / selectedIdsRemoved value: -{ - "description": "elicit_selection only, on submit: the chosen option ids.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / valuesRemoved value: -{ - "additionalProperties": {}, - "description": "elicit_proposal only, on submit: the proposed values for just the fields the reviewer included.", - "propertyNames": { - "type": "string" - }, - "type": "object" -}
- Changed
elicit_selection5 fields changed- changed
Input schema / properties / css / maxLengthPrevious value: -20000New value: +32768 - changed
Input schema / properties / footerTemplate / maxLengthPrevious value: -20000New value: +32768 - changed
Input schema / properties / headingTemplate / maxLengthPrevious value: -20000New value: +32768 - changed
Input schema / properties / hoverTemplate / maxLengthPrevious value: -20000New value: +32768 - changed
Input schema / properties / rowTemplate / maxLengthPrevious value: -20000New value: +32768
1 tool update
- Changed
elicit_selection1 field changed- changed
Input schema / properties / rowTemplate / descriptionPrevious value: -"LiquidJS template producing the <td> cells of one option row; the option is exposed as `option` (e.g. <td>{{ option.name }}</td><td>{{ option.score }}</td>). Default: a single cell of `option.label`, falling back to `option.id`."New value: +"LiquidJS template producing the <td> cells of one option row; the option is exposed as `option` (e.g. <td>{{ option.name }}</td><td>{{ option.score }}</td>). Any link must carry target=\"_blank\" — without it the click replaces the option table with the linked page and the reviewer loses the form. Default: a single cell of `option.label`, falling back to `option.id`."
12 tool updates
- Changed
elicit_approval8 fields changed- added
Input schema / properties / context / descriptionAdded value: +"json mode: a read-only JSON payload the reviewer approves or declines as-is. Echoed back verbatim in elicit_result. Rendered as raw JSON unless `displayTemplate` is given." - added
Input schema / properties / expiresInSeconds / descriptionAdded value: +"How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days)." - added
Input schema / properties / labels / descriptionAdded value: +"Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed." - added
Input schema / properties / labels / properties / decline / descriptionAdded value: +"Replacement label for the decline button." - added
Input schema / properties / labels / properties / submit / descriptionAdded value: +"Replacement label for the submit button." - added
Input schema / properties / message / descriptionAdded value: +"The prompt shown to the reviewer at the top of the review page — say what needs approving and why." - added
Input schema / properties / requestedSchema / descriptionAdded value: +"form mode: JSON Schema in the MCP elicitation requestedSchema subset (flat object of string / number / integer / boolean / enum properties — no nested objects, arrays of objects, $ref, or allOf). The reviewer fills these fields on the review page; property `default`s seed the form." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "elicitationDelivered": { + "description": "True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself.", + "type": "boolean" + }, + "elicitationId": { + "description": "Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel.", + "type": "string" + }, + "expiresAt": { + "description": "When the request stops being decidable (timestamp).", + "type": "string" + }, + "reviewUrl": { + "description": "URL of the hosted review page where a human decides this request.", + "type": "string" + }, + "status": { + "const": "pending", + "description": "Always `pending` at creation.", + "type": "string" + } + }, + "required": [ + "elicitationId", + "status", + "reviewUrl", + "expiresAt", + "elicitationDelivered" + ], + "type": "object" +}
- Changed
elicit_await2 fields changed- added
Input schema / properties / elicitationId / descriptionAdded value: +"The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "status": { + "description": "The request's state when the wait ended; `pending` means the polling window elapsed undecided — call again to keep waiting.", + "enum": [ + "pending", + "submitted", + "declined", + "canceled", + "expired", + "consumed" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
- Changed
elicit_cancel2 fields changed- added
Input schema / properties / elicitationId / descriptionAdded value: +"The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "status": { + "const": "canceled", + "description": "The request is now terminally canceled.", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
- Changed
elicit_confirm6 fields changed- added
Input schema / properties / labels / descriptionAdded value: +"Relabel or localize the OK/Cancel buttons. Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed." - added
Input schema / properties / labels / properties / cancel / descriptionAdded value: +"Replacement label for the Cancel button (e.g. \"Cancelar\")." - added
Input schema / properties / labels / properties / ok / descriptionAdded value: +"Replacement label for the OK button (e.g. \"Aceptar\")." - added
Input schema / properties / message / descriptionAdded value: +"The yes/no question shown to the user in the host's elicitation dialog." - added
Input schema / properties / timeoutSeconds / descriptionAdded value: +"How long to wait for the answer, in seconds (default 300, clamped 60-3600)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "confirmed": { + "description": "true = the user chose OK; false = an explicit no (Cancel choice or declined elicitation); null = no answer was obtained.", + "type": [ + "boolean", + "null" + ] + }, + "reason": { + "description": "Present only when confirmed is null: \"dismissed\" = the elicitation was closed unanswered (including timeout), \"error\" = it failed.", + "enum": [ + "dismissed", + "error" + ], + "type": "string" + } + }, + "required": [ + "confirmed" + ], + "type": "object" +}
- Changed
elicit_doctor6 fields changed- added
Input schema / properties / notes / descriptionAdded value: +"With share: anything unusual about the setup worth recording with the evidence." - added
Input schema / properties / probeElicitation / descriptionAdded value: +"Also fire one live form-elicitation round-trip (the user may see a dialog) and report the outcome under probes.elicitationForm. Default false: passive capability report only, no prompt." - added
Input schema / properties / productName / descriptionAdded value: +"With share: the host product's name as the user sees it (e.g. \"Claude Desktop\") — the report cannot detect this from inside." - added
Input schema / properties / productVersion / descriptionAdded value: +"With share: the host product's version, if known." - added
Input schema / properties / share / descriptionAdded value: +"Contribute this report to Elicitly's public Support Matrix evidence queue. Stored: the report plus productName / productVersion / notes; no elicitation payloads or conversation content." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "deprecations": { + "description": "Spec-level deprecation advisories (MCP 2026-07-28, SEP-2577) for the client features the report surfaces.", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "initialize": { + "additionalProperties": {}, + "description": "The MCP initialize handshake echoed verbatim: { request: { clientInfo, capabilities }, response: { protocolVersion, capabilities, serverInfo } }.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "probes": { + "additionalProperties": false, + "description": "Present only when probeElicitation was true: the live round-trip's attempted/action/latencyMs/verdict.", + "properties": { + "elicitationForm": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "elicitationForm" + ], + "type": "object" + }, + "shareError": { + "description": "Present when sharing was requested but failed: a one-line error summary.", + "type": "string" + }, + "shared": { + "description": "Present when share: true was passed — whether the report landed in the evidence queue.", + "type": "boolean" + }, + "support": { + "additionalProperties": false, + "description": "Elicitly's derived support booleans, inferred from the advertised capabilities.", + "properties": { + "elicitation": { + "type": "boolean" + }, + "elicitationForm": { + "type": "boolean" + }, + "elicitationUrl": { + "type": "boolean" + }, + "roots": { + "type": "boolean" + }, + "sampling": { + "type": "boolean" + } + }, + "required": [ + "elicitation", + "elicitationForm", + "elicitationUrl", + "sampling", + "roots" + ], + "type": "object" + } + }, + "required": [ + "initialize", + "support", + "deprecations" + ], + "type": "object" +}
- Changed
elicit_form4 fields changed- added
Input schema / properties / message / descriptionAdded value: +"The instruction shown to the user above the form fields." - added
Input schema / properties / requestedSchema / descriptionAdded value: +"JSON Schema for the form, restricted to the MCP elicitation requestedSchema subset: a flat object whose properties are strings, numbers/integers, booleans, or enums — no nested objects, arrays of objects, $ref, or allOf. See https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation#requested-schema" - added
Input schema / properties / timeoutSeconds / descriptionAdded value: +"How long to wait for the answer, in seconds (default 300, clamped 60-3600) — raise it for forms with several fields." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "action": { + "description": "accept = the user submitted the form; decline = an explicit no; cancel = dismissed unanswered (including timeout); error = the elicitation failed.", + "enum": [ + "accept", + "decline", + "cancel", + "error" + ], + "type": "string" + }, + "content": { + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "On accept, the submitted values keyed by requestedSchema property name; null for every other action." + } + }, + "required": [ + "action", + "content" + ], + "type": "object" +}
- Changed
elicit_history5 fields changed- added
Input schema / properties / asOf / descriptionAdded value: +"Snapshot anchor from a previous page's result — pass it back to keep pagination stable while new requests arrive. Omit on the first page." - added
Input schema / properties / page / descriptionAdded value: +"1-based page number to fetch." - added
Input schema / properties / pageSize / descriptionAdded value: +"Items per page (1-100)." - added
Input schema / properties / scope / descriptionAdded value: +"'me' = your own requests; 'org' = the whole organization (admins only)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "asOf": { + "description": "The snapshot anchor this page was computed at — pass it back on later pages to keep the window stable while new requests arrive.", + "type": "string" + }, + "items": { + "description": "The requested page of elicitations, newest first.", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "page": { + "description": "The 1-based page that was served.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "pageSize": { + "description": "Items per page that was applied.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "scope": { + "description": "The scope that was served.", + "enum": [ + "me", + "org" + ], + "type": "string" + }, + "total": { + "description": "Total matching requests — the last page is ceil(total / pageSize).", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "items", + "page", + "pageSize", + "asOf", + "total", + "scope" + ], + "type": "object" +}
- Changed
elicit_ping1 field changed- added
Input schema / properties / message / descriptionAdded value: +"Text to echo back (default \"ping\")."
- Changed
elicit_proposal14 fields changed- added
Input schema / properties / columns / descriptionAdded value: +"Names the read-only columns of the diff grid." - added
Input schema / properties / columns / properties / current / properties / label / descriptionAdded value: +"Header of the read-only Current column." - added
Input schema / properties / columns / properties / sources / descriptionAdded value: +"The read-only Source column(s), in display order." - added
Input schema / properties / columns / properties / sources / items / properties / key / descriptionAdded value: +"Unique key referenced by `fields.<property>.sources`." - added
Input schema / properties / columns / properties / sources / items / properties / label / descriptionAdded value: +"Column header shown to the reviewer." - added
Input schema / properties / context / descriptionAdded value: +"Optional identity/context passthrough echoed back verbatim in elicit_result — NOT shown to the reviewer unless `displayTemplate` renders it." - added
Input schema / properties / expiresInSeconds / descriptionAdded value: +"How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days)." - added
Input schema / properties / fields / descriptionAdded value: +"Per-property read-only cell values, keyed by requestedSchema property name: { <property>: { sources: { <sourceKey>: value }, current: value, include?: boolean } }. `include: false` starts the field unchecked." - added
Input schema / properties / labels / descriptionAdded value: +"Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed." - added
Input schema / properties / labels / properties / decline / descriptionAdded value: +"Replacement label for the decline button." - added
Input schema / properties / labels / properties / submit / descriptionAdded value: +"Replacement label for the submit button." - added
Input schema / properties / message / descriptionAdded value: +"The prompt shown to the reviewer above the diff grid — say what change is proposed and why." - added
Input schema / properties / requestedSchema / descriptionAdded value: +"JSON Schema (MCP elicitation requestedSchema subset — flat object of string / number / boolean / enum properties) defining the editable Proposed fields; each property's `default` is its initial proposed value." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "elicitationDelivered": { + "description": "True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself.", + "type": "boolean" + }, + "elicitationId": { + "description": "Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel.", + "type": "string" + }, + "expiresAt": { + "description": "When the request stops being decidable (timestamp).", + "type": "string" + }, + "reviewUrl": { + "description": "URL of the hosted review page where a human decides this request.", + "type": "string" + }, + "status": { + "const": "pending", + "description": "Always `pending` at creation.", + "type": "string" + } + }, + "required": [ + "elicitationId", + "status", + "reviewUrl", + "expiresAt", + "elicitationDelivered" + ], + "type": "object" +}
- Changed
elicit_result2 fields changed- added
Input schema / properties / elicitationId / descriptionAdded value: +"The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "context": { + "description": "The caller's original `context`, echoed verbatim (null if none was supplied)." + }, + "decision": { + "description": "The reviewer's choice: submitted = approved/filled in, declined = explicit no.", + "enum": [ + "submitted", + "declined" + ], + "type": "string" + }, + "formSubmission": { + "description": "The reviewer-filled field values keyed by requestedSchema property name; null in json mode or on decline." + }, + "selectedIds": { + "description": "elicit_selection only, on submit: the chosen option ids.", + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "const": "consumed", + "description": "The outcome has been read at least once.", + "type": "string" + }, + "values": { + "additionalProperties": {}, + "description": "elicit_proposal only, on submit: the proposed values for just the fields the reviewer included.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "status", + "decision", + "context", + "formSubmission" + ], + "type": "object" +}
- Changed
elicit_selection14 fields changed- added
Input schema / properties / css / descriptionAdded value: +"Custom CSS injected on the review page to style the option table." - added
Input schema / properties / expiresInSeconds / descriptionAdded value: +"How long the request stays decidable, in seconds (default 3600, clamped 60-604800 — 1 minute to 7 days)." - added
Input schema / properties / footerTemplate / descriptionAdded value: +"LiquidJS template producing the table footer rows (no variables). Omit for no footer." - added
Input schema / properties / headingTemplate / descriptionAdded value: +"LiquidJS template producing the <th> cells of the table header (no variables). Omit for no header row." - added
Input schema / properties / hoverTemplate / descriptionAdded value: +"LiquidJS template for a per-option hover/details card; the option is exposed as `option`. Omit for no hover card." - added
Input schema / properties / labels / descriptionAdded value: +"Relabel or localize the action buttons (submit, decline). Each label is trimmed, 1-40 characters; unknown keys are rejected. Button placement and styling stay fixed." - added
Input schema / properties / labels / properties / decline / descriptionAdded value: +"Replacement label for the decline button." - added
Input schema / properties / labels / properties / submit / descriptionAdded value: +"Replacement label for the submit button." - added
Input schema / properties / maxSelections / descriptionAdded value: +"Most options the reviewer may pick (default 1 = single-select; clamped to the option count)." - added
Input schema / properties / message / descriptionAdded value: +"The instruction shown above the option list — say what the reviewer is choosing and why." - added
Input schema / properties / minSelections / descriptionAdded value: +"Fewest options the reviewer must pick to submit (default 1; 0 allows none)." - added
Input schema / properties / options / descriptionAdded value: +"The choices (1-500). Each option is an object with a required unique `id` (returned in `selectedIds`) plus any extra keys, which `rowTemplate` / `hoverTemplate` can reference (e.g. {{ option.name }})." - added
Input schema / properties / rowTemplate / descriptionAdded value: +"LiquidJS template producing the <td> cells of one option row; the option is exposed as `option` (e.g. <td>{{ option.name }}</td><td>{{ option.score }}</td>). Default: a single cell of `option.label`, falling back to `option.id`." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "elicitationDelivered": { + "description": "True when the request was also pushed to the connected client as a url-mode elicitation; when false, surface `reviewUrl` to the human yourself.", + "type": "boolean" + }, + "elicitationId": { + "description": "Unique id of the created request — pass it to elicit_await / elicit_status / elicit_result / elicit_cancel.", + "type": "string" + }, + "expiresAt": { + "description": "When the request stops being decidable (timestamp).", + "type": "string" + }, + "reviewUrl": { + "description": "URL of the hosted review page where a human decides this request.", + "type": "string" + }, + "status": { + "const": "pending", + "description": "Always `pending` at creation.", + "type": "string" + } + }, + "required": [ + "elicitationId", + "status", + "reviewUrl", + "expiresAt", + "elicitationDelivered" + ], + "type": "object" +}
- Changed
elicit_status2 fields changed- added
Input schema / properties / elicitationId / descriptionAdded value: +"The `elicitationId` returned by the creating tool (elicit_approval, elicit_selection, or elicit_proposal)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "status": { + "description": "The request's current lifecycle state.", + "enum": [ + "pending", + "submitted", + "declined", + "canceled", + "expired", + "consumed" + ], + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
Related MCP Connectors
Human-in-the-loop review and approval for AI agents. Audit trail, approval policies, native MCP.
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Impri MCP server — human-in-the-loop approval inbox for AI agents
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceHuman-in-the-Loop authorization gateway for AI Agents. Securely pause MCP workflows and route high-risk actions to human approvers via Slack or Email.36 npm1MIT
- AlicenseNot gradedqualityCmaintenanceMCP server that provides human-in-the-loop approval for risky AI agent actions, with durable state and audit logs.MIT

Oakallow MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceRuntime permission, approval, and audit governance for AI agent tool execution, enabling human oversight of risky actions via an MCP server.1MIT- AlicenseNot gradedqualityBmaintenanceProvides a human-in-the-loop approval gateway for AI agents, enforcing policies and audit logging for MCP-compatible tool calls.Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.