rentahuman-mcp 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -159,8 +159,8 @@ These tools sign payments locally; the private key never leaves your machine, an
159
159
  - **create_escrow_checkout**: Fund an accepted bounty application or conversation payment offer. Accepts optional `idempotencyKey` and returns a deterministic `status`. `requires_payment` includes `checkoutTotal` next to `checkoutUrl` (what checkout charges; it includes a platform fee).
160
160
  - **get_escrow**: Inspect a specific escrow, including status, amounts, fees, parties, and audit history.
161
161
  - **list_escrows**: List escrows you created as the poster. Filter by `applicationId`, `bountyId`, optional `humanId`, or status.
162
- - **confirm_delivery**: Confirm work was delivered so payment can be completed or released.
163
- - **release_payment**: Release completed escrow funds to the worker after explicit user payment direction. This accepts the completed work; a separate evidence review is optional. Accepts optional `applicationId` binding check.
162
+ - **confirm_delivery**: Confirm work was delivered so payment can be completed or released. Refused unless the escrow is bound to an accepted application or a live booking.
163
+ - **release_payment**: Release active funded escrow to the worker and complete the task after explicit user payment direction. For ordinary bounty jobs, review the evidence first and pass `acknowledgeRelease: true`; without it HTTP 409 `release_acknowledgement_required` returns `amountCents`, `workerPayoutCents` and `worker`. Accepts optional `applicationId` binding check.
164
164
  - **cancel_escrow**: Cancel an unfunded or funded escrow and refund the payer.
165
165
  - **open_dispute**: Freeze an eligible escrow for admin review.
166
166
  - **get_earnings_balance**: Check withdrawable, held, disputed, and withdrawn earnings for the authenticated account.
@@ -198,14 +198,14 @@ worker (`escrow_recipient_mismatch`).
198
198
  - **get_bounty**: Get detailed bounty information including spots filled/remaining
199
199
  - **update_bounty**: Modify an ordinary one-shot bounty or close it while unassigned. Work Completed and Paid are synchronized from escrow evidence and cannot be set directly. Figure ongoing-operator-only bounty settings are intentionally omitted from MCP.
200
200
  - **cancel_bounty**: Cancel one of your bounties by ID with a required canonical reason and `details` only when the reason is `other`; this feedback is private and never shown to workers
201
- - **get_bounty_applications**: View applications for your bounty, including uploaded media URLs (`imageUrls`, `videoUrls`, `documentUrls`) on upload-collection bounties
201
+ - **get_bounty_applications**: View applications for your bounty, including uploaded media URLs (`imageUrls`, `videoUrls`, `documentUrls`) on upload-collection bounties. Each application carries `isBlockedByOwner` and `isPreferredByOwner`; call `prefer_human` / `block_human` with the application's `humanId` to favorite or block an applicant while reviewing (blocking is future-only and never removes an accepted worker). Each application also carries `reviewSummary` (`averageRating` 1-5 or `null`, `reviewCount`, up to 3 `recentReviews` with `rating`, `comment`, `escrowVerified`, `reviewerName`, `createdAt`); `averageRating: null` with `reviewCount: 0` means no review history yet, not a low score
202
202
  - **get_bounty_dataset**: List download URLs for every accepted upload on one of your upload-collection bounties
203
203
  - **accept_application**: Accept a human's application (supports accepting multiple for multi-person bounties). Accepts optional `idempotencyKey`.
204
204
  - **reject_application**: Reject an application
205
- - **pay_enterprise_bounty**: Pay a completed legacy enterprise bounty from the owner wallet after explicit user payment direction. Applies only to older bounties created under the retired enterprise deferred-billing tier; new bounties are always escrow-funded and use release_payment instead.
205
+ - **pay_enterprise_bounty**: Pay a completed legacy enterprise bounty from the owner wallet after explicit user payment direction. Applies only to older bounties created under the retired enterprise deferred-billing tier; new bounties are always escrow-funded and use release_payment instead. Same approval and `acknowledgeRelease` rules as `release_payment`.
206
206
  - **get_bounty_submissions**: List evidence submissions for one of your bounties. Automated findings are advisory.
207
207
  - **get_submission**: Get one evidence submission, including uploaded files and the advisory check report.
208
- - **review_submission**: Approve, reject, or request a redo. Returns `nextAction`; does not release payment.
208
+ - **review_submission**: Approve, reject, or request a redo while the job is `evidence_in_review`. Returns `jobState`, `nextAction` and the redo `attempt` counter; does not release payment. Redo is capped at 3 cycles per job; reject is terminal and files a dispute.
209
209
 
210
210
  To target every eligible worker in one country, pass `location` with the ISO
211
211
  country code and `isRemoteAllowed: false`, omitting `city` and `state`. The
@@ -215,16 +215,30 @@ same shape works with `update_bounty`. Platform-blocked countries are rejected.
215
215
  location: { country: "US", isRemoteAllowed: false }
216
216
  ```
217
217
 
218
- For ordinary accepted one-shot bounties, workers must finalize post-acceptance
219
- photo/video evidence before marking the task complete. To review it, the agent
220
- loads the bounty criteria with `get_bounty`, lists and opens the canonical
221
- submission, and inspects every uploaded file before calling
222
- `review_submission`. Automated `recommendation` values stay advisory. If the
223
- agent cannot inspect a file, it must report that limitation instead of deciding.
224
- Review decisions require explicit user choice or explicit criteria-based
225
- delegation and do not move money. Conversely, an explicit `release_payment` or
226
- `pay_enterprise_bounty` instruction accepts completed work without requiring a
227
- separate evidence approval. Platform admins cannot authorize payment.
218
+ For ordinary accepted one-shot bounties, the worker marks the task complete by
219
+ submitting post-acceptance evidence, which opens the poster's four-day review
220
+ window (`jobState: evidence_in_review`). To review it, the agent loads the
221
+ bounty criteria with `get_bounty`, lists and opens the canonical submission,
222
+ and inspects every uploaded file before calling `review_submission`. Automated
223
+ `recommendation` values stay advisory. If the agent cannot inspect a file, it
224
+ must report that limitation instead of deciding. Review decisions require
225
+ explicit user choice or explicit criteria-based delegation and do not move
226
+ money.
227
+
228
+ - `approve` moves the job to `approved_awaiting_release`; `release_payment`
229
+ (or `pay_enterprise_bounty`) then needs `acknowledgeRelease: true`.
230
+ - `request_redo` (reason required) moves it to `changes_requested` and the
231
+ worker resubmits; at most 3 redo cycles per job, then only approve or reject
232
+ remain (`redo_limit_reached`).
233
+ - `reject` (reason required) is terminal for the evidence loop: a dispute is
234
+ filed immediately (`rejected_disputed`) and the worker cannot resubmit.
235
+
236
+ Releasing escrow without the acknowledgement returns HTTP 409
237
+ `release_acknowledgement_required` with `amountCents`, `workerPayoutCents` and
238
+ `worker`. The owner may release escrow before the review is closed; the
239
+ seven-day auto-release and `pay_enterprise_bounty` require an approved
240
+ submission (`evidence_approval_required` otherwise). Platform admins cannot
241
+ authorize payment.
228
242
 
229
243
  ### Human-written text
230
244
 
@@ -291,6 +305,11 @@ in-chat + email reminder at the half-way point; past the deadline the seat is
291
305
  automatically released, the application is expired, escrow returns to your
292
306
  funding source, and the listing reopens for other applicants.
293
307
 
308
+ Omit `completionWindowHours` for work anchored to a specific future event,
309
+ shift, or appointment. The clock starts when the worker confirms their seat,
310
+ not at the scheduled start time, so a shorter window could release the worker
311
+ before the work can begin.
312
+
294
313
  Workers may request more time. Pending requests appear on
295
314
  `get_bounty_applications` as `completionExtension` with `status: "requested"`
296
315
  (an open request pauses the auto-release for up to 24 hours). Answer with the
@@ -315,6 +334,12 @@ reason, and uncertain cases stay pending for your manual review via
315
334
  review and accept every application yourself. Ignored on `aiManaged` bounties,
316
335
  whose managed engine owns applicant review.
317
336
 
337
+ On `micCheckRequired` bounties the deterministic gate scores the applicant's
338
+ mic recording: auto-accept requires an overall DNSMOS score of at least
339
+ `autoAcceptMinMicScore` (1-5, default 3.0 — the platform's pass boundary).
340
+ Set it at creation or change it later via `update_bounty` (`null` resets to
341
+ the default). Below the floor, applications wait for your manual review.
342
+
318
343
  #### Microphone quality requirement
319
344
 
320
345
  `create_bounty` and `update_bounty` accept `micCheckRequired` (boolean, default
package/dist/serve.js CHANGED
@@ -908,6 +908,20 @@ refund unused budget, and produce a final report. Managed bounties require a
908
908
  fixed USD price and 1\u201350 spots and cannot use \`mode: 'auto'\`. Poll the bounty's
909
909
  managed run or subscribe to \`run.report_ready\` for the finished work.
910
910
 
911
+ ### Review Applicants with Prefer and Block
912
+
913
+ Every application returned by \`get_bounty_applications\` carries two flags
914
+ describing your relationship with that applicant: \`isBlockedByOwner\` and
915
+ \`isPreferredByOwner\`. Use them while reviewing, and act from the same view:
916
+ - \`prefer_human(humanId)\` with the application's \`humanId\` favorites a strong
917
+ applicant: preferred humans are notified first for all your future bounties
918
+ and any block on them is removed
919
+ - \`block_human(humanId)\` keeps a poor fit off your future bounties and out of
920
+ your outreach, and removes them from your preferred list
921
+ - Blocking is future-only. It never removes a worker who was already accepted;
922
+ use \`reject_application\` for the application in front of you
923
+ - Always ask the user before blocking or preferring on their behalf
924
+
911
925
  ### Start a Conversation
912
926
 
913
927
  Use \`start_conversation\` only when the account is eligible for direct messaging:
@@ -1013,10 +1027,19 @@ completion and evidence criteria, then \`get_bounty_submissions\` and
1013
1027
  are advisory; never turn them into the verdict. Only call \`review_submission\`
1014
1028
  when the user explicitly chooses approve/reject/redo or explicitly delegates
1015
1029
  criteria-based decisions. If a file cannot be inspected, disclose that limit
1016
- instead of deciding. \`release_payment\` and \`pay_enterprise_bounty\` are
1017
- separate irreversible financial actions and must only follow explicit user
1018
- payment direction; that direction accepts completed work without a separate
1019
- evidence-approval call.
1030
+ instead of deciding.
1031
+
1032
+ The job moves through a small state machine, returned as \`jobState\` on review
1033
+ responses: the worker marks the task complete with evidence
1034
+ (\`evidence_in_review\`), the owner approves (\`approved_awaiting_release\`),
1035
+ requests a redo (\`changes_requested\`, at most 3 cycles per job, then only
1036
+ approve or reject remain) or rejects (\`rejected_disputed\`: a dispute is filed
1037
+ immediately and the worker cannot resubmit). \`release_payment\` and
1038
+ \`pay_enterprise_bounty\` are separate irreversible financial actions and must
1039
+ only follow explicit user payment direction. For these jobs they require
1040
+ \`acknowledgeRelease: true\` (and \`pay_enterprise_bounty\` an approved
1041
+ submission); a 409 names the amount and the worker so you can confirm with the
1042
+ user and retry. Review the evidence before directing payment.
1020
1043
 
1021
1044
  ## Support
1022
1045
 
@@ -1651,7 +1674,7 @@ var CreateBountyRequest = Schema5.Struct({
1651
1674
  Schema5.lessThanOrEqualTo(720)
1652
1675
  )
1653
1676
  ).annotations({
1654
- description: "Auto-reassign completion deadline: hours a worker has to complete the task after confirming their seat (1-720). Workers are reminded at half the window; when the deadline passes the seat is automatically released and the listing reopens for other applicants. Workers may request an extension, which you approve, deny, or replace with your own via POST /bounties/{id}/applications/{appId}/extension/decision. For AI-managed bounties this overrides the default 6-hour work window. Omit for no completion deadline."
1677
+ description: "Auto-reassign completion deadline: hours a worker has to complete the task after confirming their seat (1-720). Workers are reminded at half the window; when the deadline passes the seat is automatically released and the listing reopens for other applicants. Workers may request an extension, which you approve, deny, or replace with your own via POST /bounties/{id}/applications/{appId}/extension/decision. For AI-managed bounties this overrides the default 6-hour work window. Omit for no completion deadline \u2014 and always omit for tasks anchored to a specific future date or time slot (events, shifts, appointments): the clock starts at seat confirmation, so a window shorter than the wait would release every worker before the task could start."
1655
1678
  }),
1656
1679
  keepApplicantsOnFill: Schema5.optional(Schema5.Boolean).annotations({
1657
1680
  description: "When true, pending applicants are kept (not auto-rejected) once all seats fill, so you can reuse the applicant pool after reopening or adding seats. Default false."
@@ -1659,6 +1682,14 @@ var CreateBountyRequest = Schema5.Struct({
1659
1682
  autoAccept: Schema5.optional(Schema5.Boolean).annotations({
1660
1683
  description: "Automatically review applicants as they apply. Deterministic checks (account standing, country eligibility, payout viability, your blocklist) always run; an AI review runs only when the application contains free-text screening answers that need judgment. Qualified applicants are accepted (the standard worker-confirmation window still applies unless skipAcceptanceConfirmation is set), clear mismatches are rejected with a reason, and uncertain cases stay pending for your manual review. Default true; pass false to review and accept every application yourself. Ignored for aiManaged bounties, whose managed engine owns applicant review."
1661
1684
  }),
1685
+ autoAcceptMinMicScore: Schema5.optional(
1686
+ Schema5.Number.pipe(
1687
+ Schema5.greaterThanOrEqualTo(1),
1688
+ Schema5.lessThanOrEqualTo(5)
1689
+ )
1690
+ ).annotations({
1691
+ description: "Minimum overall DNSMOS speech-quality score (1-5) an applicant\u2019s mic-check recording must reach for auto-accept on micCheckRequired bounties. Below the floor the application stays pending for your manual review (never auto-rejected). Default 3.0 \u2014 the platform\u2019s pass boundary. Only meaningful with micCheckRequired: true and autoAccept on."
1692
+ }),
1662
1693
  identityRequired: Schema5.optional(Schema5.Boolean).annotations({
1663
1694
  description: "Require applicants to pass an identity check (government ID) before applying. Verified once per account and reused across bounties. Default false."
1664
1695
  }),
@@ -1888,7 +1919,10 @@ var UpdateBountyRequest = Schema5.Struct({
1888
1919
  Schema5.lessThanOrEqualTo(500)
1889
1920
  )
1890
1921
  ).annotations({
1891
- description: "Increase the number of seats (humans needed). Cannot be set below spots already filled. Raising it on a funded bounty may require an additional escrow authorization."
1922
+ description: "Change the number of seats (humans needed). Cannot be set below spots already filled. On a wallet-funded bounty the pool is resized in place: extra seats are debited from the poster wallet, freed seats are refunded to it."
1923
+ }),
1924
+ walletImpactAcknowledged: Schema5.optional(Schema5.Boolean).annotations({
1925
+ description: "Acknowledges the wallet impact of a wallet-funded bounty edit. Any edit that debits the poster wallet (adding seats via spotsAvailable, or raising the price) is first refused with error_code wallet_impact_confirmation_required and the exact amount; retry the same request with this set to true to apply the charge. Admins editing a bounty they do not own must also pass it for any edit that debits or credits the poster wallet."
1892
1926
  }),
1893
1927
  keepApplicantsOnFill: Schema5.optional(Schema5.Boolean).annotations({
1894
1928
  description: "When true, pending applicants are kept (not auto-rejected) once all seats fill, so you can draw from the same pool after reopening or adding seats. Default false."
@@ -1896,6 +1930,16 @@ var UpdateBountyRequest = Schema5.Struct({
1896
1930
  autoAccept: Schema5.optional(Schema5.Boolean).annotations({
1897
1931
  description: "Turn automatic applicant review on or off. When on, deterministic checks always run and an AI review runs only for free-text screening answers; qualified applicants are accepted, clear mismatches rejected, uncertain cases left pending. Applications received while off stay pending; toggling on affects future applications only. Ignored on aiManaged bounties."
1898
1932
  }),
1933
+ autoAcceptMinMicScore: Schema5.optional(
1934
+ Schema5.NullOr(
1935
+ Schema5.Number.pipe(
1936
+ Schema5.greaterThanOrEqualTo(1),
1937
+ Schema5.lessThanOrEqualTo(5)
1938
+ )
1939
+ )
1940
+ ).annotations({
1941
+ description: "Change the minimum overall DNSMOS mic score (1-5) for auto-accept on micCheckRequired bounties, or pass null to reset to the platform default (3.0). Affects future applications only."
1942
+ }),
1899
1943
  completionCriteria: Schema5.optional(
1900
1944
  Schema5.String.pipe(Schema5.minLength(10), Schema5.maxLength(2e3))
1901
1945
  ).annotations({
@@ -2131,6 +2175,9 @@ var PayEnterpriseBountyRequest = Schema5.Struct({
2131
2175
  }),
2132
2176
  conversationId: Schema5.optional(Schema5.String).annotations({
2133
2177
  description: "Conversation for the completed application. Required when the bounty has more than one conversation."
2178
+ }),
2179
+ acknowledgeRelease: Schema5.optional(Schema5.Boolean).annotations({
2180
+ description: "Required for ordinary bounty jobs in the evidence review flow: pass true to confirm the release pays the worker and is final. Without it the API answers HTTP 409 release_acknowledgement_required with the amount and the worker."
2134
2181
  })
2135
2182
  });
2136
2183
  var GetBountyDatasetRequest = Schema5.Struct({
@@ -2274,6 +2321,7 @@ var BountyPublicResponse = Schema7.Struct({
2274
2321
  micCheckRequired: Schema7.optional(Schema7.Boolean),
2275
2322
  completionWindowHours: Schema7.optional(Schema7.Number),
2276
2323
  autoAccept: Schema7.optional(Schema7.Boolean),
2324
+ autoAcceptMinMicScore: Schema7.optional(Schema7.Number),
2277
2325
  requiredQualificationIds: Schema7.optional(Schema7.Array(Schema7.String)),
2278
2326
  supportedCountries: Schema7.optional(Schema7.Array(Schema7.String)),
2279
2327
  intakeClosedCountries: Schema7.optional(Schema7.Array(Schema7.String)),
@@ -2338,7 +2386,7 @@ var getBountySpec = {
2338
2386
  };
2339
2387
  var getBountyApplicationsSpec = {
2340
2388
  name: "get_bounty_applications",
2341
- description: "View applications for a bounty. See who applied, their cover letters, and availability. Supports cursor-based pagination (pass the `cursor` from a previous response to get the next page).",
2389
+ description: "View applications for a bounty. See who applied, their cover letters, and availability. Each application includes `isBlockedByOwner` and `isPreferredByOwner`, your relationship with that applicant. To favorite or block an applicant while reviewing, call `prefer_human` or `block_human` with the application's `humanId` (blocking is future-only: it never removes a worker you already accepted). Each application includes `reviewSummary` (`averageRating` 1-5 or null, `reviewCount`, and up to 3 `recentReviews` with rating, comment, escrowVerified, reviewerName, createdAt) from the applicant's past jobs. `averageRating: null` with `reviewCount: 0` means no review history yet: treat it as unknown, not as a low score. Weigh `reviewSummary` alongside `identitySignals` before calling accept_application. Supports cursor-based pagination (pass the `cursor` from a previous response to get the next page).",
2342
2390
  input: GetBountyApplicationsRequest
2343
2391
  };
2344
2392
  var getBountyDatasetSpec = {
@@ -2348,7 +2396,7 @@ var getBountyDatasetSpec = {
2348
2396
  };
2349
2397
  var acceptApplicationSpec = {
2350
2398
  name: "accept_application",
2351
- description: "Accept a human's application for your bounty. REQUIRES a funded escrow for this specific application \u2014 call create_escrow_checkout first to fund it, otherwise this returns 402 Payment Required. Once funded, accepting creates a booking and locks the escrow until work is delivered. For multi-person bounties, fund and accept each applicant separately. Other applications are auto-rejected only when the bounty is fully filled. Pass optional `idempotencyKey` to make this safe to retry (a replayed key returns the original result instead of duplicating).",
2399
+ description: "Accept a human's application for your bounty. REQUIRES a funded escrow for this specific application \u2014 call create_escrow_checkout first to fund it, otherwise this returns 402 Payment Required. Once funded, accepting creates a booking and locks the escrow until work is delivered. For multi-person bounties, fund and accept each applicant separately. Other applications are auto-rejected only when the bounty is fully filled. Pass optional `idempotencyKey` to make this safe to retry (a replayed key returns the original result instead of duplicating). Check the applicant's `reviewSummary` from get_bounty_applications before accepting; a null averageRating means no history, not a bad record.",
2352
2400
  input: AcceptApplicationRequest
2353
2401
  };
2354
2402
  var rejectApplicationSpec = {
@@ -2368,7 +2416,7 @@ var decideExtensionSpec = {
2368
2416
  };
2369
2417
  var updateBountySpec = {
2370
2418
  name: "update_bounty",
2371
- description: "Update ordinary one-shot bounty details. You can modify the title, description, price, application-cutoff deadline, location, requiredLinks, applicationDetails, lifecycleMessages, liveCaptureRequirement, reactivate hidden inactive bounties, and more. The deadline stops new applications and direct uploads; completionWindowHours controls post-acceptance completion timing. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. Live capture and required-link requirements can only be changed before applications are received. applicationDetails may be changed after applications are received; existing applications keep their original answers, while future applications use the latest fields. applicationDetails are application detail items for standard application bounties only; blank rows are ignored, uploads are capped at 3 fields, acknowledgments at 5 fields, and camera-only live_video at 1 required field. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. Admin-only ongoing bounty settings are intentionally not exposed through MCP. You can also pause/unpause a bounty (status 'paused'/'open'), close an unassigned bounty and return its unused funding (status 'closed'), increase seats via spotsAvailable, keep pending applicants on fill via keepApplicantsOnFill, and change the auto-reassign completion deadline via completionWindowHours (null disables; only affects seats confirmed after the edit), and toggle automatic applicant review via autoAccept (applications received while off stay pending; toggling on affects future applications only; ignored on aiManaged bounties). Use cancel_bounty for cancellation and refund handling. Work completion and payment are system-managed from escrow and payout evidence; status 'completed' and 'paid' cannot be set directly.",
2419
+ description: "Update ordinary one-shot bounty details. You can modify the title, description, price, application-cutoff deadline, location, requiredLinks, applicationDetails, lifecycleMessages, liveCaptureRequirement, reactivate hidden inactive bounties, and more. The deadline stops new applications and direct uploads; completionWindowHours controls post-acceptance completion timing. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. Live capture and required-link requirements can only be changed before applications are received. applicationDetails may be changed after applications are received; existing applications keep their original answers, while future applications use the latest fields. applicationDetails are application detail items for standard application bounties only; blank rows are ignored, uploads are capped at 3 fields, acknowledgments at 5 fields, and camera-only live_video at 1 required field. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. Admin-only ongoing bounty settings are intentionally not exposed through MCP. You can also pause/unpause a bounty (status 'paused'/'open'), close an unassigned bounty and return its unused funding (status 'closed'), increase seats via spotsAvailable, keep pending applicants on fill via keepApplicantsOnFill, and change the auto-reassign completion deadline via completionWindowHours (null disables; only affects seats confirmed after the edit), and toggle automatic applicant review via autoAccept (applications received while off stay pending; toggling on affects future applications only; ignored on aiManaged bounties) or adjust its mic-quality floor via autoAcceptMinMicScore (1-5, null resets to the 3.0 default). Use cancel_bounty for cancellation and refund handling. Work completion and payment are system-managed from escrow and payout evidence; status 'completed' and 'paid' cannot be set directly.",
2372
2420
  input: UpdateBountyRequest
2373
2421
  };
2374
2422
  var cancelBountySpec = {
@@ -2388,7 +2436,7 @@ var boostBountyOutreachSpec = {
2388
2436
  };
2389
2437
  var payEnterpriseBountySpec = {
2390
2438
  name: "pay_enterprise_bounty",
2391
- description: "Pay a completed legacy enterprise bounty (older bounties created under the retired enterprise deferred-billing tier) from the owner wallet. New bounties are always escrow-funded; use release_payment for them. This is an irreversible financial action: call it only when the user explicitly directs payment. Explicit payment accepts the completed work and does not require a separate evidence-approval decision. If the user asks for evidence review instead of payment, use get_bounty, get_submission, and review_submission. The amount, worker, and wallet are loaded from stored records. Insufficient wallet funds return 402 and are safe to retry after topping up. Owner or bounty-owning agent only; platform admins cannot pay.",
2439
+ description: "Pay an accepted worker on a legacy enterprise bounty (older bounties created under the retired enterprise deferred-billing tier) from the owner wallet. New bounties are always escrow-funded; use release_payment for them. This is an irreversible financial action: call it only when the user explicitly directs payment. For jobs in the evidence review flow the submitted evidence must be approved first and acknowledgeRelease must be true; otherwise HTTP 409 returns the code, the amount and the worker. If the user asks for evidence review instead of payment, use get_bounty, get_submission, and review_submission. The amount, worker, and wallet are loaded from stored records. Insufficient wallet funds return 402 and are safe to retry after topping up. Owner or bounty-owning agent only; platform admins cannot pay.",
2392
2440
  input: PayEnterpriseBountyRequest,
2393
2441
  annotations: {
2394
2442
  title: "Pay enterprise bounty",
@@ -2829,6 +2877,33 @@ var MOCK_BOUNTIES = [
2829
2877
  updatedAt: new Date(Date.now() - 1 * 24 * 60 * 60 * 1e3).toISOString()
2830
2878
  }
2831
2879
  ];
2880
+ var MOCK_REVIEW_SUMMARY_WITH_HISTORY = {
2881
+ averageRating: 4.5,
2882
+ reviewCount: 2,
2883
+ recentReviews: [
2884
+ {
2885
+ id: "review_test_001",
2886
+ rating: 5,
2887
+ comment: "Picked up and delivered same day with photo proof.",
2888
+ escrowVerified: true,
2889
+ reviewerName: "Logistics Agent",
2890
+ createdAt: new Date(Date.now() - 5 * 24 * 60 * 60 * 1e3).toISOString()
2891
+ },
2892
+ {
2893
+ id: "review_test_002",
2894
+ rating: 4,
2895
+ comment: "Reliable and communicative, arrived a few minutes late.",
2896
+ escrowVerified: false,
2897
+ reviewerName: "Errand Agent",
2898
+ createdAt: new Date(Date.now() - 20 * 24 * 60 * 60 * 1e3).toISOString()
2899
+ }
2900
+ ]
2901
+ };
2902
+ var MOCK_REVIEW_SUMMARY_EMPTY = {
2903
+ averageRating: null,
2904
+ reviewCount: 0,
2905
+ recentReviews: []
2906
+ };
2832
2907
  var MOCK_APPLICATIONS = [
2833
2908
  {
2834
2909
  id: "app_test_001",
@@ -2838,6 +2913,9 @@ var MOCK_APPLICATIONS = [
2838
2913
  coverLetter: "I'm available today and can pick up the package. I'm located near the downtown USPS and have done this many times before.",
2839
2914
  availability: "Available today between 10am-4pm",
2840
2915
  status: "pending",
2916
+ isBlockedByOwner: false,
2917
+ isPreferredByOwner: false,
2918
+ reviewSummary: MOCK_REVIEW_SUMMARY_WITH_HISTORY,
2841
2919
  createdAt: new Date(Date.now() - 12 * 60 * 60 * 1e3).toISOString(),
2842
2920
  updatedAt: new Date(Date.now() - 12 * 60 * 60 * 1e3).toISOString()
2843
2921
  },
@@ -2849,6 +2927,9 @@ var MOCK_APPLICATIONS = [
2849
2927
  coverLetter: "I can help with this package pickup. I have valid ID and am familiar with the USPS location.",
2850
2928
  availability: "Tomorrow morning works best for me",
2851
2929
  status: "pending",
2930
+ isBlockedByOwner: false,
2931
+ isPreferredByOwner: true,
2932
+ reviewSummary: MOCK_REVIEW_SUMMARY_EMPTY,
2852
2933
  createdAt: new Date(Date.now() - 6 * 60 * 60 * 1e3).toISOString(),
2853
2934
  updatedAt: new Date(Date.now() - 6 * 60 * 60 * 1e3).toISOString()
2854
2935
  }
@@ -3206,6 +3287,12 @@ function toMcpTool(spec, run) {
3206
3287
  }
3207
3288
 
3208
3289
  // src/tools/handlers/bounties.ts
3290
+ var MOCK_HIRING_STATUSES = /* @__PURE__ */ new Set([
3291
+ "open",
3292
+ "pending_funding",
3293
+ "partially_filled"
3294
+ ]);
3295
+ var mockHiringSpotsRemaining = (bounty) => MOCK_HIRING_STATUSES.has(bounty.status) ? Math.max(0, (bounty.spotsAvailable || 1) - (bounty.spotsFilled || 0)) : 0;
3209
3296
  var handleCreateBounty = (args) => Effect9.gen(function* () {
3210
3297
  const params = yield* decode(CreateBountyRequest)(args);
3211
3298
  const identity2 = yield* Identity;
@@ -3243,6 +3330,7 @@ var handleCreateBounty = (args) => Effect9.gen(function* () {
3243
3330
  // Default-on unless explicitly disabled; aiManaged bounties never
3244
3331
  // store the flag (the managed engine owns applicant review).
3245
3332
  ...params.aiManaged ? {} : { autoAccept: params.autoAccept !== false },
3333
+ ...params.autoAcceptMinMicScore !== void 0 && !params.aiManaged ? { autoAcceptMinMicScore: params.autoAcceptMinMicScore } : {},
3246
3334
  requirements: params.requirements || [],
3247
3335
  skillsNeeded: params.skillsNeeded || [],
3248
3336
  identityRequired: params.identityRequired || false,
@@ -3295,6 +3383,7 @@ var handleCreateBounty = (args) => Effect9.gen(function* () {
3295
3383
  currency: params.currency || "USD",
3296
3384
  ...params.aiManaged !== void 0 ? { aiManaged: params.aiManaged } : {},
3297
3385
  ...params.aiManaged ? {} : { autoAccept: params.autoAccept !== false },
3386
+ ...params.autoAcceptMinMicScore !== void 0 && !params.aiManaged ? { autoAcceptMinMicScore: params.autoAcceptMinMicScore } : {},
3298
3387
  status: "open",
3299
3388
  applicationCount: 0,
3300
3389
  viewCount: 0,
@@ -3391,7 +3480,7 @@ var handleListBounties = (args) => Effect9.gen(function* () {
3391
3480
  }
3392
3481
  const bountiesWithComputed = bounties2.map((b) => ({
3393
3482
  ...b,
3394
- spotsRemaining: (b.spotsAvailable || 1) - (b.spotsFilled || 0)
3483
+ spotsRemaining: mockHiringSpotsRemaining(b)
3395
3484
  }));
3396
3485
  return ok({
3397
3486
  success: true,
@@ -3432,7 +3521,7 @@ var getBountyTool = toMcpTool(
3432
3521
  success: true,
3433
3522
  bounty: {
3434
3523
  ...bounty,
3435
- spotsRemaining: (bounty.spotsAvailable || 1) - (bounty.spotsFilled || 0)
3524
+ spotsRemaining: mockHiringSpotsRemaining(bounty)
3436
3525
  },
3437
3526
  mode: "mock"
3438
3527
  });
@@ -3794,6 +3883,7 @@ var payEnterpriseBountyTool = toMcpTool(
3794
3883
  );
3795
3884
  return yield* api.post(`/bounties/${params.bountyId}/enterprise-pay`, {
3796
3885
  ...params.conversationId !== void 0 ? { conversationId: params.conversationId } : {},
3886
+ ...params.acknowledgeRelease !== void 0 ? { acknowledgeRelease: params.acknowledgeRelease } : {},
3797
3887
  ...verification
3798
3888
  });
3799
3889
  })
@@ -3801,7 +3891,7 @@ var payEnterpriseBountyTool = toMcpTool(
3801
3891
  var bountyTools = [
3802
3892
  {
3803
3893
  name: "create_bounty",
3804
- description: "Create a one-shot task bounty for humans to apply to. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. **IMPORTANT: Always call with dryRun=true first** to preview the bounty. Dry-run `preview.fundingTotal` is the total funding requirement before any existing wallet balance is applied. Show that estimate to the operator before posting. Show the preview to the user and ask 'Here's your bounty \u2014 would you like to edit anything before posting?' Only call again with dryRun=false (or omitted) after the user confirms. **You MUST help the user define completionCriteria and evidenceTypes** \u2014 ask what 'done' looks like and what proof they need (text/data, photos, video, or links). For specialized standard-application tasks, configure applicationDetails so applicants provide application details before review. Blank rows are ignored; application upload fields are one file each and capped at 3 total; acknowledgment checkboxes are capped at 5 total and can be optional or required; and one required live_video field may contain a script applicants must record with the in-browser camera. For appearance-based bounties where the worker appears on camera or their presence is part of the deliverable (sign holding, UGC, sponsored posts, on-camera video, promo/GTM appearances), always include one required live_video field with a label asking the applicant to explain in two sentences why they are a good fit \u2014 this gates applications on a live self-recorded video so the poster sees each applicant before accepting. Do not ask for passwords, OTP/2FA codes, API keys, private keys, seed phrases, government IDs, bank/card details, exact home addresses, dates of birth, or other sensitive personal information. For direct-review collection bounties, use submissionMode='photo_upload', 'video_upload', or 'document_upload' with matching submission settings instead of applicationDetails. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. You can require applicants to provide specific links (LinkedIn, GitHub, resume, etc.) using the requiredLinks parameter. Requires RENTAHUMAN_API_KEY from the account owner. Standard accounts use available wallet balance first; if the wallet cannot cover the bounty, the response includes deposit_url and checkout_total (the hosted charge after wallet balance is applied) and the account owner must complete checkout before the bounty is visible. Supports multi-person bounties by setting spotsAvailable > 1. Set completionWindowHours (1-720) to give confirmed workers a completion deadline: overdue seats auto-release and reopen for other applicants; workers may request extensions you answer with decide_extension_request. Ongoing data-collection programs are managed separately and cannot be created through this tool. Pass optional `idempotencyKey` to make this safe to retry (a replayed key returns the original result instead of duplicating). Applicants are auto-reviewed by default (autoAccept, default true): deterministic checks always run and an AI review runs only for free-text screening answers \u2014 qualified applicants are accepted, clear mismatches rejected with a reason, uncertain cases left pending for manual review; pass autoAccept: false to review and accept every application yourself. BETA: pass aiManaged: true to have the platform fully manage the bounty \u2014 automated recruiting, vetting, submission review, payment release, and a final report. Fixed price USD only, 1-50 spots. Poll the bounty's managed run or subscribe to run.report_ready for the finished work.",
3894
+ description: "Create a one-shot task bounty for humans to apply to. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. **IMPORTANT: Always call with dryRun=true first** to preview the bounty. Dry-run `preview.fundingTotal` is the total funding requirement before any existing wallet balance is applied. Show that estimate to the operator before posting. Show the preview to the user and ask 'Here's your bounty \u2014 would you like to edit anything before posting?' Only call again with dryRun=false (or omitted) after the user confirms. **You MUST help the user define completionCriteria and evidenceTypes** \u2014 ask what 'done' looks like and what proof they need (text/data, photos, video, or links). For specialized standard-application tasks, configure applicationDetails so applicants provide application details before review. Blank rows are ignored; application upload fields are one file each and capped at 3 total; acknowledgment checkboxes are capped at 5 total and can be optional or required; and one required live_video field may contain a script applicants must record with the in-browser camera. For appearance-based bounties where the worker appears on camera or their presence is part of the deliverable (sign holding, UGC, sponsored posts, on-camera video, promo/GTM appearances), always include one required live_video field with a label asking the applicant to explain in two sentences why they are a good fit \u2014 this gates applications on a live self-recorded video so the poster sees each applicant before accepting. Do not ask for passwords, OTP/2FA codes, API keys, private keys, seed phrases, government IDs, bank/card details, exact home addresses, dates of birth, or other sensitive personal information. For direct-review collection bounties, use submissionMode='photo_upload', 'video_upload', or 'document_upload' with matching submission settings instead of applicationDetails. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. You can require applicants to provide specific links (LinkedIn, GitHub, resume, etc.) using the requiredLinks parameter. Requires RENTAHUMAN_API_KEY from the account owner. Standard accounts use available wallet balance first; if the wallet cannot cover the bounty, the response includes deposit_url and checkout_total (the hosted charge after wallet balance is applied) and the account owner must complete checkout before the bounty is visible. Supports multi-person bounties by setting spotsAvailable > 1. Set completionWindowHours (1-720) to give confirmed workers a completion deadline: overdue seats auto-release and reopen for other applicants; workers may request extensions you answer with decide_extension_request. Ongoing data-collection programs are managed separately and cannot be created through this tool. Pass optional `idempotencyKey` to make this safe to retry (a replayed key returns the original result instead of duplicating). Applicants are auto-reviewed by default (autoAccept, default true): deterministic checks always run and an AI review runs only for free-text screening answers \u2014 qualified applicants are accepted, clear mismatches rejected with a reason, uncertain cases left pending for manual review; pass autoAccept: false to review and accept every application yourself; on micCheckRequired bounties, tune the mic-quality floor with autoAcceptMinMicScore (1-5, default 3.0). BETA: pass aiManaged: true to have the platform fully manage the bounty \u2014 automated recruiting, vetting, submission review, payment release, and a final report. Fixed price USD only, 1-50 spots. Poll the bounty's managed run or subscribe to run.report_ready for the finished work.",
3805
3895
  inputSchema: toInputSchema(CreateBountyRequest),
3806
3896
  handler: handleCreateBounty
3807
3897
  },
@@ -4493,6 +4583,9 @@ var ConfirmDeliveryRequest = Schema12.Struct({
4493
4583
  var ReleasePaymentRequest = Schema12.Struct({
4494
4584
  escrowId: Schema12.String.pipe(Schema12.minLength(1)),
4495
4585
  applicationId: Schema12.optional(Schema12.String),
4586
+ acknowledgeRelease: Schema12.optional(Schema12.Boolean).annotations({
4587
+ description: "Required for ordinary bounty jobs in the evidence review flow: pass true to confirm the release pays the worker and is final. Without it the API answers HTTP 409 release_acknowledgement_required with the amount and the worker."
4588
+ }),
4496
4589
  idempotencyKey: Schema12.optional(Schema12.String)
4497
4590
  });
4498
4591
  var CancelEscrowRequest = Schema12.Struct({
@@ -4621,7 +4714,7 @@ var escrowTools = [
4621
4714
  },
4622
4715
  {
4623
4716
  name: "confirm_delivery",
4624
- description: "Confirm that a worker has satisfactorily completed the task. Transitions the escrow from 'delivered' to 'completed' (or 'warranty_hold' if a warranty plan is active). After confirming, use release_payment to send funds to the worker. Requires RENTAHUMAN_API_KEY to be set.",
4717
+ description: "Confirm that a worker has satisfactorily completed the task. Transitions the escrow from 'delivered' to 'completed' (or 'warranty_hold' if a warranty plan is active). Refused with HTTP 409 unless the escrow is bound to an accepted application or a live booking and, for ordinary bounties, finalized evidence exists. This is separate from release_payment. Requires RENTAHUMAN_API_KEY to be set.",
4625
4718
  inputSchema: toInputSchema(ConfirmDeliveryRequest),
4626
4719
  handler: (args) => Effect12.gen(function* () {
4627
4720
  yield* requireApiKey;
@@ -4637,7 +4730,7 @@ var escrowTools = [
4637
4730
  },
4638
4731
  {
4639
4732
  name: "release_payment",
4640
- description: "Release escrowed funds to the worker. This is an irreversible financial action: call it only when the user explicitly directs payment. The task must be completed first, but explicit payment accepts the completed work and does not require a separate review_submission approval. If the user asks to review evidence instead, call get_bounty and get_submission, inspect every file, then use review_submission. Optionally pass `applicationId` to assert the intended application; a mismatch is refused to prevent paying the wrong worker. Requires RENTAHUMAN_API_KEY.",
4733
+ description: "Release an active funded escrow to the worker and complete the task. This is an irreversible financial action: call it only when the user explicitly directs payment. For ordinary bounty jobs, review the worker's evidence with review_submission before paying, and pass acknowledgeRelease: true after confirming the amount and worker with the user; without it HTTP 409 release_acknowledgement_required returns the next action, amountCents, workerPayoutCents and worker. If the user asks to review evidence instead, call get_bounty and get_submission, inspect every file, then use review_submission. Optionally pass `applicationId` to assert the intended application; a mismatch is refused to prevent paying the wrong worker. Requires RENTAHUMAN_API_KEY.",
4641
4734
  inputSchema: toInputSchema(ReleasePaymentRequest),
4642
4735
  annotations: {
4643
4736
  title: "Release payment",
@@ -4650,7 +4743,10 @@ var escrowTools = [
4650
4743
  const config = yield* McpConfig;
4651
4744
  const api = yield* ApiClient;
4652
4745
  const params = yield* decode(ReleasePaymentRequest)(args);
4653
- const body = params.applicationId ? { applicationId: params.applicationId } : {};
4746
+ const body = {
4747
+ ...params.applicationId ? { applicationId: params.applicationId } : {},
4748
+ ...params.acknowledgeRelease !== void 0 ? { acknowledgeRelease: params.acknowledgeRelease } : {}
4749
+ };
4654
4750
  const result = yield* api.post(
4655
4751
  config.escrowReleasePath(params.escrowId),
4656
4752
  body
@@ -5247,6 +5343,12 @@ var HumanPublicResponse = Schema17.Struct({
5247
5343
  qualificationBadgeSummaries: Schema17.optional(
5248
5344
  Schema17.Array(QualificationBadgeSummaryResponse)
5249
5345
  ),
5346
+ /**
5347
+ * True when the worker holds an active verified-human-writer credential
5348
+ * (a no-AI humanization screening sample classified Human). Lets them skip
5349
+ * the sample on later humanization bounties.
5350
+ */
5351
+ writingVerified: Schema17.optional(Schema17.Boolean),
5250
5352
  profileUrl: Schema17.optional(Schema17.String),
5251
5353
  activityFreshness: Schema17.optional(ActivityFreshnessResponse),
5252
5354
  identitySignals: Schema17.optional(IdentitySignals),
@@ -6782,7 +6884,7 @@ var getSubmissionSpec = {
6782
6884
  };
6783
6885
  var reviewSubmissionSpec = {
6784
6886
  name: "review_submission",
6785
- description: "Record a decision on a worker's evidence submission. Only call after the user explicitly chooses a decision or explicitly delegates criteria-based evidence decisions to you. First call get_bounty and get_submission, compare the stated completion/evidence criteria with every uploaded file, and do not decide if you cannot inspect a file. `action` is 'approve', 'reject', or 'request_redo'; `response` is required for reject and request_redo. Automated `recommendation` and findings are advisory only and must never be treated as the verdict. This tool does not move money. Owner only, with an action-bound agent signature.",
6887
+ description: "Record a decision on a worker's evidence submission. Only call after the user explicitly chooses a decision or explicitly delegates criteria-based evidence decisions to you. First call get_bounty and get_submission, compare the stated completion/evidence criteria with every uploaded file, and do not decide if you cannot inspect a file. `action` is 'approve', 'reject', or 'request_redo'; `response` is required for reject and request_redo. Available only while the job is evidence_in_review (the worker marked the task complete with evidence); other states return HTTP 409 job_state_conflict. Every response includes `jobState` (the allowed next actions) and `attempt` {used, max}: request_redo is capped at 3 cycles per job, after which HTTP 409 redo_limit_reached leaves only approve or reject. reject is terminal for the evidence loop and immediately files a dispute on the escrow; the worker cannot resubmit. Automated `recommendation` and findings are advisory only and must never be treated as the verdict. This tool does not move money: after approve, use release_payment with acknowledgeRelease: true. Owner only, with an action-bound agent signature.",
6786
6888
  input: ReviewSubmissionRequest,
6787
6889
  annotations: {
6788
6890
  title: "Record evidence decision",
@@ -73,6 +73,7 @@ declare const CreateBountyRequest: Schema.Struct<{
73
73
  completionWindowHours: Schema.optional<Schema.filter<Schema.filter<Schema.filter<typeof Schema.Number>>>>;
74
74
  keepApplicantsOnFill: Schema.optional<typeof Schema.Boolean>;
75
75
  autoAccept: Schema.optional<typeof Schema.Boolean>;
76
+ autoAcceptMinMicScore: Schema.optional<Schema.filter<Schema.filter<typeof Schema.Number>>>;
76
77
  identityRequired: Schema.optional<typeof Schema.Boolean>;
77
78
  micCheckRequired: Schema.optional<typeof Schema.Boolean>;
78
79
  aiManaged: Schema.optional<Schema.Literal<[true]>>;
@@ -149,8 +150,10 @@ declare const UpdateBountyRequest: Schema.Struct<{
149
150
  autoExpireGhosts: Schema.optional<typeof Schema.Boolean>;
150
151
  completionWindowHours: Schema.optional<Schema.NullOr<Schema.filter<Schema.filter<Schema.filter<typeof Schema.Number>>>>>;
151
152
  spotsAvailable: Schema.optional<Schema.filter<Schema.filter<Schema.filter<typeof Schema.Number>>>>;
153
+ walletImpactAcknowledged: Schema.optional<typeof Schema.Boolean>;
152
154
  keepApplicantsOnFill: Schema.optional<typeof Schema.Boolean>;
153
155
  autoAccept: Schema.optional<typeof Schema.Boolean>;
156
+ autoAcceptMinMicScore: Schema.optional<Schema.NullOr<Schema.filter<Schema.filter<typeof Schema.Number>>>>;
154
157
  completionCriteria: Schema.optional<Schema.filter<Schema.filter<typeof Schema.String>>>;
155
158
  evidenceTypes: Schema.optional<Schema.filter<Schema.Array$<Schema.Literal<["text", "photo", "video", "link"]>>>>;
156
159
  evidenceCriteria: Schema.optional<Schema.filter<typeof Schema.String>>;
@@ -300,6 +303,7 @@ declare const ConfirmDeliveryRequest: Schema.Struct<{
300
303
  declare const ReleasePaymentRequest: Schema.Struct<{
301
304
  escrowId: Schema.filter<typeof Schema.String>;
302
305
  applicationId: Schema.optional<typeof Schema.String>;
306
+ acknowledgeRelease: Schema.optional<typeof Schema.Boolean>;
303
307
  idempotencyKey: Schema.optional<typeof Schema.String>;
304
308
  }>;
305
309
  declare const CancelEscrowRequest: Schema.Struct<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rentahuman-mcp",
3
- "version": "2.2.0",
3
+ "version": "3.0.0",
4
4
  "description": "MCP server for AI agents to browse and book humans on rentahuman.ai",
5
5
  "keywords": [
6
6
  "ai",