Human approval for unattended AI agents: one-time approve link, wait, Ed25519-signed receipt
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Free. Status of an approval request (pending | approved | denied | expired). When decided, includes the Ed25519-signed receipt (compact JWS). Optional wait_seconds long-polls until a decision.
apr-… id from request_approval
Optional long-poll seconds (max 25 without SSE)
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http approval-relay https://relay.moneytools.dev/mcp
Free. Status of an approval request (pending | approved | denied | expired). When decided, includes the Ed25519-signed receipt (compact JWS). Optional wait_seconds long-polls until a decision.
| Argument | Type | Description |
|---|---|---|
| approval_id* | string | apr-… id from request_approval |
| wait_seconds | integer | Optional long-poll seconds (max 25 without SSE) |
{
"type": "object",
"required": [
"approval_id"
],
"properties": {
"approval_id": {
"type": "string",
"description": "apr-… id from request_approval"
},
"wait_seconds": {
"type": "integer",
"maximum": 240,
"minimum": 0,
"description": "Optional long-poll seconds (max 25 without SSE)"
}
}
}Create a human approval request for an irreversible action. Returns approve_url (pass it to the responsible human through your own channel) and approval_id. Optional wait_seconds keeps the call open (progress notifications every 10 s when the client sends a progressToken) until the human decides. 3 free per day, then 0.02 USDC via x402 (params._meta["x402/payment"]).
| Argument | Type | Description |
|---|---|---|
| risk | string | Risk level shown to the approver (default med) |
| requester | string | Optional label shown to the approver, e.g. agent or job name |
| callback_url | string | Optional public https URL that receives a POST with the signed receipt when decided |
| expires_in_s | integer | Seconds until the request expires unanswered (default 3600) |
| wait_seconds | integer | Optional: wait up to this many seconds for the decision before returning (0 = return immediately; >25 needs an SSE-capable client) |
| action_summary* | string | Plain-language description of the irreversible action awaiting approval |
{
"type": "object",
"required": [
"action_summary"
],
"properties": {
"risk": {
"enum": [
"low",
"med",
"high"
],
"type": "string",
"description": "Risk level shown to the approver (default med)"
},
"requester": {
"type": "string",
"maxLength": 80,
"description": "Optional label shown to the approver, e.g. agent or job name"
},
"callback_url": {
"type": "string",
"description": "Optional public https URL that receives a POST with the signed receipt when decided"
},
"expires_in_s": {
"type": "integer",
"maximum": 86400,
"minimum": 60,
"description": "Seconds until the request expires unanswered (default 3600)"
},
"wait_seconds": {
"type": "integer",
"maximum": 240,
"minimum": 0,
"description": "Optional: wait up to this many seconds for the decision before returning (0 = return immediately; >25 needs an SSE-capable client)"
},
"action_summary": {
"type": "string",
"maxLength": 500,
"description": "Plain-language description of the irreversible action awaiting approval"
}
}
}Free. Verify an Approval Relay decision receipt (compact JWS) against the current public key and return its decoded payload.
| Argument | Type | Description |
|---|---|---|
| receipt_jws* | string |
{
"type": "object",
"required": [
"receipt_jws"
],
"properties": {
"receipt_jws": {
"type": "string"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.