rentahuman-mcp 3.2.1 → 3.3.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
@@ -211,9 +211,11 @@ worker (`escrow_recipient_mismatch`).
211
211
  To target every eligible worker in one country, pass `location` with the ISO
212
212
  country code and `isRemoteAllowed: false`, omitting `city` and `state`. The
213
213
  same shape works with `update_bounty`. Platform-blocked countries are rejected.
214
+ To open one bounty to several countries, pass `supportedCountries` instead.
214
215
 
215
216
  ```text
216
217
  location: { country: "US", isRemoteAllowed: false }
218
+ supportedCountries: ["US", "CA", "GB", "NZ", "AU"]
217
219
  ```
218
220
 
219
221
  For ordinary accepted one-shot bounties, the worker marks the task complete by
@@ -307,6 +309,32 @@ Only workers whose profile country matches can apply or receive automatic
307
309
  outreach. The country gate still applies when remote work is allowed. Include a
308
310
  `city` for city-level targeting instead.
309
311
 
312
+ To recruit across several countries, pass `supportedCountries` with the ISO
313
+ codes (country names are recognized too). Omit `location.country`, or keep it
314
+ and make sure it appears in the list:
315
+
316
+ ```json
317
+ {
318
+ "location": { "isRemoteAllowed": true },
319
+ "supportedCountries": ["US", "CA", "GB", "NZ", "AU"],
320
+ "identityRequired": true
321
+ }
322
+ ```
323
+
324
+ The list is normalized to uppercase ISO codes and deduplicated; blocked or
325
+ unrecognized countries are rejected with a `400`. With `identityRequired`, the
326
+ list is enforced against the applicant's verified document country. Use
327
+ `isRemoteAllowed: true`: an on-site bounty (`isRemoteAllowed: false`) with a
328
+ location country is gated by that country alone and accepts no other list. On
329
+ `update_bounty`, send the full new list to change it. Omitting it leaves an
330
+ explicit multi-country list in place, so editing `location` alone never drops
331
+ it; legacy bounties that only mirror a country-only `location` keep deriving
332
+ that single country from `location`. An empty array is stored as an explicit
333
+ empty list; it never lifts a country-only or on-site country restriction
334
+ (remove `location.country` first), and a remote city location with a country
335
+ stays unrestricted as before. `aiManaged` bounties do not accept
336
+ `supportedCountries`.
337
+
310
338
  #### Completion deadline (auto-reassign)
311
339
 
312
340
  The bounty-level `deadline` is the application cutoff. At or after that time,
package/dist/serve.js CHANGED
@@ -1326,6 +1326,7 @@ var agentCheckoutTools = [
1326
1326
  var BOUNTY_PRICE_TYPES = ["fixed", "hourly"];
1327
1327
  var BOUNTY_MIN_PRICE_USD = 3;
1328
1328
  var MAX_EXCLUDED_PARTICIPANT_SOURCE_BOUNTIES = 1e3;
1329
+ var MAX_BOUNTY_SUPPORTED_COUNTRIES = 250;
1329
1330
  var HUMANIZATION_FORMATS = ["text"];
1330
1331
  var HUMANIZATION_TRANSFORMATIONS = [
1331
1332
  "paraphrase",
@@ -1480,6 +1481,11 @@ var BountyLocationRequest = Schema5.Struct({
1480
1481
  isRemoteAllowed: Schema5.optional(Schema5.Boolean)
1481
1482
  });
1482
1483
  var BOUNTY_LOCATION_DESCRIPTION = "Worker location target. Set country to an ISO country code without city or state to target every eligible worker in that country, including when remote work is allowed. Include city (and optionally state/country) for city-level targeting. Platform-blocked countries are rejected.";
1484
+ var BountySupportedCountriesRequest = Schema5.Array(
1485
+ Schema5.String.pipe(Schema5.minLength(1), Schema5.maxLength(100))
1486
+ ).pipe(Schema5.maxItems(MAX_BOUNTY_SUPPORTED_COUNTRIES));
1487
+ var BOUNTY_SUPPORTED_COUNTRIES_CREATE_DESCRIPTION = 'Countries whose workers may see and apply, as ISO country codes (country names are also recognized), e.g. ["US", "CA", "GB", "NZ", "AU"]. Omit it to keep the location-derived policy: a country-only location restricts the bounty to that country, an on-site city location keeps its existing country gate, and other locations stay unrestricted. When location.country is set it must appear in this list, and on-site bounties (isRemoteAllowed false) with a location country accept only that one country; use isRemoteAllowed true for a remote multi-country bounty. Platform-blocked countries and unrecognized values are rejected. With identityRequired, the list is enforced against the verified document country. Not accepted on aiManaged bounties.';
1488
+ var BOUNTY_SUPPORTED_COUNTRIES_UPDATE_DESCRIPTION = 'Replace the eligible-country list with the full new list of ISO country codes (country names are also recognized), e.g. ["US", "CA", "GB", "NZ", "AU"]. Omitting it leaves an explicit multi-country list in place, so a location-only edit never drops it; legacy bounties that only mirror a country-only location keep deriving that single country from location. On-site bounties (isRemoteAllowed false) with a location country accept only that one country. An empty array is stored as an explicit empty list; it never lifts a country-only or on-site country restriction (remove location.country first), while a remote city location with a country stays unrestricted as before. When location.country is set it must appear in the list. Platform-blocked countries and unrecognized values are rejected.';
1483
1489
  var LIFECYCLE_MESSAGES_DESCRIPTION = "Auto-sent to the doer in the bounty conversation on lifecycle transitions. Supports {{name}}, {{bountyTitle}}, {{deadline}}, {{reason}} interpolation. Accepted/submission templates are only ever delivered to accepted applicants.";
1484
1490
  var LifecycleMessageTemplateSchema = Schema5.String.pipe(
1485
1491
  Schema5.maxLength(BOUNTY_LIFECYCLE_TEMPLATE_MAX_LENGTH)
@@ -1627,6 +1633,11 @@ var CreateBountyRequest = Schema5.Struct({
1627
1633
  location: Schema5.optional(BountyLocationRequest).annotations({
1628
1634
  description: BOUNTY_LOCATION_DESCRIPTION
1629
1635
  }),
1636
+ supportedCountries: Schema5.optional(
1637
+ BountySupportedCountriesRequest
1638
+ ).annotations({
1639
+ description: BOUNTY_SUPPORTED_COUNTRIES_CREATE_DESCRIPTION
1640
+ }),
1630
1641
  deadline: Schema5.optional(Schema5.String).annotations({
1631
1642
  description: "Application cutoff (ISO 8601 format). At or after this time, the listing is removed from discovery and no new applications or direct uploads are accepted. Use completionWindowHours for a post-acceptance completion deadline."
1632
1643
  }),
@@ -1892,6 +1903,11 @@ var UpdateBountyRequest = Schema5.Struct({
1892
1903
  location: Schema5.optional(BountyLocationRequest).annotations({
1893
1904
  description: BOUNTY_LOCATION_DESCRIPTION
1894
1905
  }),
1906
+ supportedCountries: Schema5.optional(
1907
+ BountySupportedCountriesRequest
1908
+ ).annotations({
1909
+ description: BOUNTY_SUPPORTED_COUNTRIES_UPDATE_DESCRIPTION
1910
+ }),
1895
1911
  status: Schema5.optional(
1896
1912
  Schema5.Literal("open", "in_review", "paused", "closed")
1897
1913
  ).annotations({
@@ -2383,7 +2399,7 @@ var CancelBountyRequest = BountyCancellationFeedbackRequest.pipe(
2383
2399
  );
2384
2400
  var createBountySpec = {
2385
2401
  name: "create_bounty",
2386
- description: `Create a one-shot task bounty for humans to apply to. Dry-run preview.fundingTotal is the total funding requirement before any existing wallet balance is applied; show that estimate to the operator before posting. Live pending_deposit responses include checkout_total, the exact hosted charge after wallet balance is applied, next to deposit_url. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. Standard application bounties support application detail items via applicationDetails, including text questions, optional or required acknowledgment checkboxes, one-file uploads (allowedFileTypes: image, docx, pdf, txt, video, audio), and one required live_video field whose label is the script applicants 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. Set liveCaptureRequirement to photo or video when accepted workers must capture new camera evidence after acceptance; neither camera-only workflow is cryptographic liveness verification. 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. Blank rows are ignored; uploads are capped at 3 fields, acknowledgments at 5 fields, and live video at 1 field. Direct-review photo, video, or document collection bounties use submissionMode and matching upload settings instead of applicationDetails. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. Set completionWindowHours (any whole number of hours from 1 to 720, e.g. 36) to give confirmed workers a completion deadline: overdue seats are automatically released and reopened for other applicants (auto-reassign), workers can request extensions, and you approve/deny/grant them per worker. 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, set autoAcceptMinMicScore (1-5) to make the mic score a hard cutoff: applications below it are auto-rejected, at/above proceed toward acceptance, and unscored recordings stay pending. When omitted, the platform default 3.0 applies and lower scores only stay pending for manual review. To keep previous participants out, pass excludedParticipantSourceBountyIds with up to ${MAX_EXCLUDED_PARTICIPANT_SOURCE_BOUNTIES} ids of your OWN earlier bounties: any worker who was ever accepted on one of them cannot see or apply to the new bounty, and you can change the list later with update_bounty. AI-managed, QA, and taste run bounties, and never-funded drafts are rejected as sources. 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.`,
2402
+ description: `Create a one-shot task bounty for humans to apply to. Dry-run preview.fundingTotal is the total funding requirement before any existing wallet balance is applied; show that estimate to the operator before posting. Live pending_deposit responses include checkout_total, the exact hosted charge after wallet balance is applied, next to deposit_url. To target an entire country, pass location with an ISO country code and isRemoteAllowed=false while omitting city and state. To open one bounty to several countries, pass supportedCountries with the ISO codes (e.g. ["US", "CA", "GB", "NZ", "AU"]); when location.country is set it must be in that list, on-site bounties (isRemoteAllowed=false) accept only their location country, and with identityRequired the list is enforced against the verified document country. Standard application bounties support application detail items via applicationDetails, including text questions, optional or required acknowledgment checkboxes, one-file uploads (allowedFileTypes: image, docx, pdf, txt, video, audio), and one required live_video field whose label is the script applicants 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. Set liveCaptureRequirement to photo or video when accepted workers must capture new camera evidence after acceptance; neither camera-only workflow is cryptographic liveness verification. 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. Blank rows are ignored; uploads are capped at 3 fields, acknowledgments at 5 fields, and live video at 1 field. Direct-review photo, video, or document collection bounties use submissionMode and matching upload settings instead of applicationDetails. lifecycleMessages can define auto-message templates for acceptance, rejection, and submission review transitions. Set completionWindowHours (any whole number of hours from 1 to 720, e.g. 36) to give confirmed workers a completion deadline: overdue seats are automatically released and reopened for other applicants (auto-reassign), workers can request extensions, and you approve/deny/grant them per worker. 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, set autoAcceptMinMicScore (1-5) to make the mic score a hard cutoff: applications below it are auto-rejected, at/above proceed toward acceptance, and unscored recordings stay pending. When omitted, the platform default 3.0 applies and lower scores only stay pending for manual review. To keep previous participants out, pass excludedParticipantSourceBountyIds with up to ${MAX_EXCLUDED_PARTICIPANT_SOURCE_BOUNTIES} ids of your OWN earlier bounties: any worker who was ever accepted on one of them cannot see or apply to the new bounty, and you can change the list later with update_bounty. AI-managed, QA, and taste run bounties, and never-funded drafts are rejected as sources. 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.`,
2387
2403
  input: CreateBountyRequest
2388
2404
  };
2389
2405
  var getBountySpec = {
@@ -2424,7 +2440,7 @@ var decideExtensionSpec = {
2424
2440
  };
2425
2441
  var updateBountySpec = {
2426
2442
  name: "update_bounty",
2427
- 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' stops new applications and outreach, including on a fully staffed bounty; status 'open' resumes it, and the resumed status is derived from its seats: open, partially_filled, or assigned when every seat is still filled), 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 (any whole number of hours from 1 to 720; 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 cutoff via autoAcceptMinMicScore (1-5 \u2014 applications scoring below your configured cutoff are auto-rejected, at/above proceed; null resets to the 3.0 default, below which applications only stay pending). The exclude-previous-participants list can be changed after posting: pass excludedParticipantSourceBountyIds with the full new list of up to ${MAX_EXCLUDED_PARTICIPANT_SOURCE_BOUNTIES} ids of your OWN earlier bounties (an empty array clears it); the same source rules as create_bounty apply, and a bounty can never exclude itself. 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.`,
2443
+ 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. To change which countries may apply, pass supportedCountries with the full new list of ISO codes; omitting it leaves an explicit multi-country list in place (legacy bounties that only mirror a country-only location keep deriving that country from location), an empty array is stored as an explicit empty list but never lifts a country-only or on-site country restriction, and on-site bounties accept only their location country. 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' stops new applications and outreach, including on a fully staffed bounty; status 'open' resumes it, and the resumed status is derived from its seats: open, partially_filled, or assigned when every seat is still filled), 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 (any whole number of hours from 1 to 720; 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 cutoff via autoAcceptMinMicScore (1-5 \u2014 applications scoring below your configured cutoff are auto-rejected, at/above proceed; null resets to the 3.0 default, below which applications only stay pending). The exclude-previous-participants list can be changed after posting: pass excludedParticipantSourceBountyIds with the full new list of up to ${MAX_EXCLUDED_PARTICIPANT_SOURCE_BOUNTIES} ids of your OWN earlier bounties (an empty array clears it); the same source rules as create_bounty apply, and a bounty can never exclude itself. 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.`,
2428
2444
  input: UpdateBountyRequest
2429
2445
  };
2430
2446
  var cancelBountySpec = {
@@ -3345,6 +3361,7 @@ var handleCreateBounty = (args) => Effect9.gen(function* () {
3345
3361
  liveCaptureRequirement: params.liveCaptureRequirement || null,
3346
3362
  category: params.category || "computer-gigs",
3347
3363
  location: params.location || { isRemoteAllowed: true },
3364
+ supportedCountries: params.supportedCountries ?? null,
3348
3365
  deadline: params.deadline || null,
3349
3366
  estimatedHours: params.estimatedHours,
3350
3367
  estimatedDurationUnit: params.estimatedDurationUnit || null,
@@ -3458,6 +3475,7 @@ var handleCreateBounty = (args) => Effect9.gen(function* () {
3458
3475
  skillsNeeded: params.skillsNeeded || [],
3459
3476
  category: params.category || "computer-gigs",
3460
3477
  location: params.location || { isRemoteAllowed: true },
3478
+ ...params.supportedCountries !== void 0 ? { supportedCountries: params.supportedCountries } : {},
3461
3479
  deadline: params.deadline,
3462
3480
  estimatedHours: params.estimatedHours,
3463
3481
  priceType: params.priceType,
@@ -49,7 +49,7 @@ declare const CreateBountyRequest: Schema.Struct<{
49
49
  title: Schema.refine<string, Schema.filter<typeof Schema.String>>;
50
50
  description: Schema.refine<string, Schema.filter<typeof Schema.String>>;
51
51
  completionCriteria: Schema.refine<string, Schema.filter<typeof Schema.String>>;
52
- evidenceTypes: Schema.refine<readonly ("link" | "text" | "photo" | "video")[], Schema.Array$<Schema.Literal<["text", "photo", "video", "link"]>>>;
52
+ evidenceTypes: Schema.refine<readonly ("text" | "link" | "photo" | "video")[], Schema.Array$<Schema.Literal<["text", "photo", "video", "link"]>>>;
53
53
  evidenceCriteria: Schema.optional<Schema.filter<typeof Schema.String>>;
54
54
  liveCaptureRequirement: Schema.optional<Schema.Literal<["photo", "video"]>>;
55
55
  requirements: Schema.optional<Schema.Array$<typeof Schema.String>>;
@@ -61,6 +61,7 @@ declare const CreateBountyRequest: Schema.Struct<{
61
61
  country: Schema.optional<Schema.filter<typeof Schema.String>>;
62
62
  isRemoteAllowed: Schema.optional<typeof Schema.Boolean>;
63
63
  }>>;
64
+ supportedCountries: Schema.optional<Schema.filter<Schema.Array$<Schema.filter<Schema.filter<typeof Schema.String>>>>>;
64
65
  deadline: Schema.optional<typeof Schema.String>;
65
66
  estimatedHours: Schema.refine<number, Schema.filter<typeof Schema.Number>>;
66
67
  priceType: Schema.Literal<["fixed", "hourly"]>;
@@ -145,6 +146,7 @@ declare const UpdateBountyRequest: Schema.Struct<{
145
146
  country: Schema.optional<Schema.filter<typeof Schema.String>>;
146
147
  isRemoteAllowed: Schema.optional<typeof Schema.Boolean>;
147
148
  }>>;
149
+ supportedCountries: Schema.optional<Schema.filter<Schema.Array$<Schema.filter<Schema.filter<typeof Schema.String>>>>>;
148
150
  status: Schema.optional<Schema.Literal<["open", "in_review", "paused", "closed"]>>;
149
151
  identityRequired: Schema.optional<typeof Schema.Boolean>;
150
152
  excludedParticipantSourceBountyIds: Schema.optional<Schema.filter<Schema.Array$<typeof Schema.String>>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rentahuman-mcp",
3
- "version": "3.2.1",
3
+ "version": "3.3.0",
4
4
  "description": "MCP server for AI agents to browse and book humans on rentahuman.ai",
5
5
  "keywords": [
6
6
  "ai",