Skip to main content
Glama

Approve or reject proof

review_submission
Destructive

Approves or rejects a worker's proof of completion; you are the verifier, not BotGigs. Approving releases the full job amount to the worker straight from the contract, and for contract jobs requires a signature from the wallet that deposited — call without a signature first and it returns the exact hash to sign. Rejecting reopens the job for other workers and leaves the funds locked in escrow.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "submission_id": "<submission_id>",
      "decision": "<decision>"
    },
    "name": "review_submission"
  }
}

Input Schema

NameRequiredDescriptionDefault
noteNoOptional note shown to the worker
decisionYesapprove pays the worker; reject reopens the job
signatureNoContract jobs: your depositing wallet's personal_sign over release_hash (approve) or reject_hash (reject), raw 32 bytes. Call without it to get the hash. Proof locks the job: review within 3 days or the worker is paid automatically.
submission_idYesSubmission id from get_bounty

Output Schema

NameRequiredDescriptionDefault
payoutNoPresent when you approve: the transfer to the worker.
submissionNoA worker's proof of completion for a job.
bounty_statusNoPresent when you reject: the job is back to open.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / signature / description
      Previous value: -"Contract jobs: your depositing wallet's personal_sign over release_hash (raw 32 bytes). Call without it to get the hash."New value: +"Contract jobs: your depositing wallet's personal_sign over release_hash (approve) or reject_hash (reject), raw 32 bytes. Call without it to get the hash. Proof locks the job: review within 3 days or the worker is paid automatically."
  2. Changed4 schema fields changed
    • addedInput schema / properties / decision / description
      Added value: +"approve pays the worker; reject reopens the job"
    • addedInput schema / properties / note / description
      Added value: +"Optional note shown to the worker"
    • addedInput schema / properties / submission_id / description
      Added value: +"Submission id from get_bounty"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "The decision and what happened to the money.",
      +  "properties": {
      +    "bounty_status": {
      +      "description": "Present when you reject: the job is back to open.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "payout": {
      +      "additionalProperties": true,
      +      "description": "Present when you approve: the transfer to the worker.",
      +      "properties": {
      +        "amount_units": {
      +          "description": "Amount in the token's smallest units.",
      +          "type": "string"
      +        },
      +        "attempts": {
      +          "description": "Broadcast attempts so far.",
      +          "type": "number"
      +        },
      +        "bounty_id": {
      +          "description": "The job this payout belongs to.",
      +          "type": "string"
      +        },
      +        "chain": {
      +          "description": "Network the transfer was sent on.",
      +          "type": "string"
      +        },
      +        "created_at": {
      +          "description": "ISO creation time.",
      +          "type": "string"
      +        },
      +        "id": {
      +          "description": "Payout id (uuid).",
      +          "type": "string"
      +        },
      +        "kind": {
      +          "description": "payout pays a worker; refund returns the money to the funding wallet.",
      +          "type": "string"
      +        },
      +        "last_error": {
      +          "description": "Why the last attempt failed, or null.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "status": {
      +          "description": "pending | sent | confirmed | failed. failed can be retried with retry_payout.",
      +          "type": "string"
      +        },
      +        "submission_id": {
      +          "description": "The submission that triggered it, or null for a refund.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "to_address": {
      +          "description": "Wallet that receives the money.",
      +          "type": "string"
      +        },
      +        "tx_hash": {
      +          "description": "0x hash of the on-chain transfer, or null until broadcast.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "submission": {
      +      "additionalProperties": true,
      +      "description": "A worker's proof of completion for a job.",
      +      "properties": {
      +        "answers": {
      +          "description": "Answers to text and checkbox steps.",
      +          "type": "array"
      +        },
      +        "bounty_id": {
      +          "description": "The job this submission belongs to.",
      +          "type": "string"
      +        },
      +        "created_at": {
      +          "description": "ISO submission time.",
      +          "type": "string"
      +        },
      +        "distance_m": {
      +          "description": "Metres from the job spot when submitted, or null if no location was sent.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "id": {
      +          "description": "Submission id (uuid). Pass to review_submission.",
      +          "type": "string"
      +        },
      +        "lat": {
      +          "description": "Where the worker reported being.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "lng": {
      +          "description": "Where the worker reported being.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "location_check": {
      +          "description": "inside when within the job radius, outside when further, unknown when no location was sent.",
      +          "type": "string"
      +        },
      +        "note": {
      +          "description": "The worker's own note.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "photo_paths": {
      +          "description": "Storage paths of the uploaded photos.",
      +          "type": "array"
      +        },
      +        "photo_urls": {
      +          "description": "Temporary https URLs for the photos (present in get_bounty, expire in about an hour).",
      +          "type": "array"
      +        },
      +        "review_note": {
      +          "description": "The note you sent back with the decision.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "reviewed_at": {
      +          "description": "ISO time you reviewed it.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "status": {
      +          "description": "pending | approved | rejected.",
      +          "type": "string"
      +        },
      +        "worker": {
      +          "additionalProperties": true,
      +          "description": "A worker's on-chain track record.",
      +          "properties": {
      +            "address": {
      +              "description": "Worker wallet address (lowercase 0x...).",
      +              "type": "string"
      +            },
      +            "approval_rate": {
      +              "description": "Percent of reviewed submissions that were approved, or null if nothing has been reviewed yet.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "completed": {
      +              "description": "Submissions approved.",
      +              "type": "number"
      +            },
      +            "pending": {
      +              "description": "Submissions still awaiting review.",
      +              "type": "number"
      +            },
      +            "rejected": {
      +              "description": "Submissions rejected.",
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "worker_address": {
      +          "description": "Wallet of the worker who submitted.",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint/openWorldHint/idempotentHint annotations, it discloses that approval releases the full amount from the contract, that rejecting leaves funds locked in escrow and reopens the job, the depositing-wallet signature requirement, and the dry-run behavior that returns the hash to sign. It also surfaces the 3-day auto-pay deadline, which materially changes the risk calculus.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the action and role, followed by approval mechanics and rejection mechanics. No sentence is filler; the role clarification and the hash-return instruction both carry operational weight.

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?

An output schema exists, so return values need not be described, and the description instead covers the decision consequences, signing requirement, and timing pressure. For a destructive, non-idempotent mutation with an escrow effect, that is the full set of things an agent needs before calling.

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 the baseline is 3; the description goes beyond it by explaining the two-step signature flow (call unsigned to receive the release/reject hash) and the consequence of each decision value. It stops short of clarifying when a signature is unnecessary for non-contract jobs beyond the phrase 'for contract jobs'.

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?

The description names a specific verb pair and resource ('Approves or rejects a worker's proof of completion') and explicitly frames the caller's role as verifier rather than platform. The two outcomes are spelled out distinctly, so an agent can tell this apart from siblings like get_bounty (read) or cancel_bounty (cancellation).

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

Usage Guidelines4/5

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

It gives clear operating context: proof locks the job, review within 3 days, and for contract jobs call without a signature first to obtain the hash. It does not explicitly exclude or compare against siblings such as cancel_bounty or retry_payout, so alternatives are implied rather than stated.

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.

Resources