Skip to main content
Glama

create_confirmation

Create a HITL confirmation request. Sends an approval request to the channels configured on the referenced HITL config. First response wins.

Agent usage: The HITL config referenced by hitl_id must be authorized before you can create confirmations. If this returns a 403 or "not authorized" error, call request_hitl_authorization on the HITL config first, then wait for the user to approve via the messaging channel. After creating a confirmation, poll get_confirmation to check for approval/denial, or use get_confirmation_approval_link to generate a fresh link for the user.

Encryption is NOT optional: a HITL config cannot send confirmations without a keypair, the human approves by decrypting in their browser, and message must be a JSON ciphertext envelope. Plaintext is refused with 400 message_not_encrypted; an envelope sealed to another key with 400 message_key_mismatch. Choose the version by who must be able to decrypt:

  • v1 (single-recipient): wraps the content key for the config owner only. Use ONLY when there are no enrolled non-owner approvers — with approvers enrolled it is refused with 400 envelope_missing_approvers.

  • v2 (multi-recipient): additionally wraps the content key for each enrolled approver via an approver_ek map, so every approver can decrypt. Build it with the SDK encryptMessageV2(plaintext, ownerPublicKey, hitlId, approverKeys) after fetching the approvers via the SDK getApproverKeys(hitlId) (GET /api/v1/hitl/:id/approver-keys). AAD is the hitlId.

ACCESS: needs a Proof account. Authenticate this client (Claude Code: /mcp → Authenticate), then call this tool again. start_login does NOT open this tool.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
hitl_idYesHITL config ID whose channels will receive the approval request
messageYesThe client-encrypted ciphertext envelope as a JSON string (v1 or v2) — NOT the human-readable text. Encrypt the sentence the approver should read; passing it directly is refused with 400 `message_not_encrypted`, because the approval page can only decrypt an envelope.
proof_expiry_daysNoPer-request proof expiry override in days (7, 30, 90, or 365)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / message / description
      Previous value: -"Human-readable description of what needs approval"New value: +"The client-encrypted ciphertext envelope as a JSON string (v1 or v2) — NOT the human-readable text. Encrypt the sentence the approver should read; passing it directly is refused with 400 `message_not_encrypted`, because the approval page can only decrypt an envelope."
    • changedInput schema / properties / message / maxLength
      Previous value: -2000New value: +10000
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only tell the agent this is not read-only and not destructive. The description goes far beyond: mandatory keypair encryption, specific 400 error codes (message_not_encrypted, message_key_mismatch, envelope_missing_approvers), the v1 vs v2 recipient rules, AAD binding, and the required account authentication step. This is unusually rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and routing, then encryption rules in a scannable bullet list. It is long, and the plaintext-refusal rule is stated both in the description and the `message` schema field, so there is mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description supplies everything needed: auth prerequisite, failure modes with codes, envelope construction path, and how to observe the result (poll or generate a link). Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning for `message` by explaining the v1/v2 envelope decision rule (owner-only vs enrolled approvers) and the SDK helpers to build it. hitl_id and proof_expiry_days gain little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a HITL confirmation request') and immediately describes the mechanism: an approval request sent to the channels on the referenced HITL config, with 'first response wins' semantics. It is clearly distinguishable from siblings like get_confirmation, list_confirmations, and create_hitl.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when-to-use and the routing logic: hitl_id must be authorized first, and on a 403/'not authorized' the agent should call request_hitl_authorization and wait. It also names the follow-up alternatives — get_confirmation for polling and get_confirmation_approval_link for a fresh link.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.