Skip to content

decide_approval

Decide an approval card

Act · mcp:actCard onlyCalls a provider

Approves or rejects an approval card. Called by the VibeSell card in Claude when the user clicks Approve or Reject — hidden from the model, and given to no other host.

Description the model readsSent as is in tools/list.
Approve or reject an approval card. Called by the VibeSell card when the user clicks; never by the model.

The user says

(The user clicks Approve on the card.)

tools/call · Arguments the assistant sends
{
"name": "decide_approval",
"arguments": {
"approvalId": "0ea4e28d-df68-4ab6-bf2f-ad51e6f7e51d",
"decision": "approve"
}
}
approvalIdstringrequired
decision"approve" | "reject"required
Input schema
{
"type": "object",
"properties": {
"approvalId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"decision": {
"type": "string",
"enum": ["approve", "reject"]
}
},
"required": ["approvalId", "decision"]
}

Result kindapproval

kind"approval"
status"pending" | "done" | "not_done" | "rejected"

pending: waits for the user's click. done: approved and carried out. not_done: approved but refused when run. rejected: the user said no.

approvalobject
  • id string
  • action string
  • summary string
  • impact string
  • irreversible boolean
  • expiresAt string
outcomestring | null

What happened once decided, in a sentence.

decideHereboolean

True when the card shows Approve and Reject; otherwise the user decides in VibeSell.

appUrlstring

Where the user approves or rejects it in VibeSell.

Output schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "approval"
},
"status": {
"type": "string",
"enum": ["pending", "done", "not_done", "rejected"],
"description": "pending: waits for the user's click. done: approved and carried out. not_done: approved but refused when run. rejected: the user said no."
},
"approval": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"action": {
"type": "string"
},
"summary": {
"type": "string"
},
"impact": {
"type": "string"
},
"irreversible": {
"type": "boolean"
},
"expiresAt": {
"type": "string"
}
},
"required": ["id", "action", "summary", "impact", "irreversible", "expiresAt"],
"additionalProperties": false
},
"outcome": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What happened once decided, in a sentence."
},
"decideHere": {
"type": "boolean",
"description": "True when the card shows Approve and Reject; otherwise the user decides in VibeSell."
},
"appUrl": {
"type": "string",
"description": "Where the user approves or rejects it in VibeSell."
}
},
"required": ["kind", "status", "approval", "outcome", "decideHere", "appUrl"],
"additionalProperties": false
}
  • Declared with _meta.ui.visibility: ["app"]: the Claude app keeps it from the model.
  • Codex, Claude Code and other hosts never receive it: there, the user decides in the VibeSell app.
  • The decision goes through the same check as the app: one winner, with the account's spending rights at the time of the click.