MCP server for Confirm.dev: gives any MCP agent a human-approval tool for risky actions.
Two well-defined tools with clear, actionable descriptions and complete input schemas. request_approval has comprehensive parameter documentation with proper constraints (min/max for ttl_minutes and wait_minutes). Both tools follow verb_noun naming convention. Schemas use Zod with type safety and descriptions. However, output schemas are not formally documented, responses are text-only without structured field definitions. Error handling is implicit (relies on Confirm SDK exceptions) rather than explicit in tool descriptions. No tool annotations (readOnlyHint/destructiveHint) despite request_approval being irreversible.
Poll a previously created approval request by id to see if a human has decided yet.
Pause and ask a human to approve a sensitive or irreversible action before you perform it (refunds, deletes, deploys, outbound messages, spending money). Blocks until the human approves, rejects, or the wait elapses. If APPROVED, use the returned effectivePayload exactly (the human may have edited it). If REJECTED or EXPIRED, do not perform the action.
Output schemas not documented. Both tools return text-only responses without formal structured field definitions. LLMs cannot plan downstream operations or extract status/id/effectivePayload reliably.
Missing tool annotations. request_approval is marked IRREVERSIBLE but has no destructiveHint annotation. check_approval is READ_ONLY but has no readOnlyHint. Agents cannot infer safety properties from tool metadata.
Error handling not explicit in tool descriptions. Descriptions do not explain what happens on network failure, invalid approval ID, or Confirm SDK errors. Recovery guidance is missing.
check_approval description is terse (11 words). Does not explain when to call it vs waiting for request_approval to return, or what statuses are possible (PENDING, APPROVED, REJECTED, EXPIRED).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
No guidance on idempotency or retry semantics. request_approval blocks up to wait_minutes, if the agent retries during the wait, will it create a duplicate request or return the same one?