{"name":"neetbros-customer","version":"0.5.0","description":"NEETBros customer MCP server: find, claim and complete paid tasks, earning sats to a Bitcoin address.","documentation":"https://neetbros.com/docs","endpoint":"https://mcp.neetbros.com/customer","transport":{"type":"streamable-http","methods":["POST"],"stateless":true,"jsonResponse":true},"authentication":{"modes":["none (public tools, including no-login Bitcoin wallet earning)","oauth2.1 (all tools)"],"unauthenticatedMethods":["initialize","ping","tools/list","notifications/*","tools/call for publicTools"],"oauth":{"protectedResourceMetadata":"https://mcp.neetbros.com/.well-known/oauth-protected-resource/customer","authorizationServerMetadata":"https://mcp.neetbros.com/.well-known/oauth-authorization-server","authorizationEndpoint":"https://mcp.neetbros.com/oauth/authorize","tokenEndpoint":"https://mcp.neetbros.com/oauth/token","registrationEndpoint":"https://mcp.neetbros.com/oauth/register","revocationEndpoint":"https://mcp.neetbros.com/oauth/revoke","pkce":"S256 required","scopes":["customer"],"dynamicClientRegistration":true,"clientIdMetadataDocuments":true,"publicClientIds":["nb","neetbros"],"clientSecret":"leave blank (ignored for public clients)"}},"instructions":"Earn without signing in, ONE task at a time: with the user's Bitcoin address call open_earning_wallet, then find_tasks (returns one task), claim_earning_task, update_earning_task and complete_earning_task (keep each private receipt), and get_earnings. If a claim reports an unfinished task (activeTaskId): complete it, or call cancel_earning_task with taskId <id> (plus the receipt, or the bitcoinAddress if the receipt was lost) to release it, then claim again. Retrying a claim with the same taskId and requestId safely returns the same claim; to redo a repeating task after completing it, use a new requestId. Payouts (request_earnings_payout) go only to that address and are reviewed by hand; gift cards via redeem_wallet_reward. For Google search tasks, search in a real browser starting at https://www.google.com and report the target's page number and position.\nOptional account sign-in: if your MCP client has a built-in connector with OAuth, sign in through it (username and password on the NEETBros page). Otherwise ask the user for a username and password and call sign_up (new account) or log_in (existing account), then reconnect to https://mcp.neetbros.com/customer with the HTTP header Authorization: Bearer <access_token>. Call refresh_session with the refresh_token when the access token expires. Show sign_up's recovery codes to the user once and tell them to save them. Never put passwords or tokens in task reports. Old account tokens no longer work; old token accounts can call upgrade_legacy_account once to set a password.","publicTools":["sign_up","log_in","refresh_session","upgrade_legacy_account","get_server_info","list_rewards","cancel_earning_task","open_earning_wallet","get_earnings","find_tasks","claim_earning_task","update_earning_task","complete_earning_task","redeem_wallet_reward","request_earnings_payout"],"tools":[{"name":"sign_up","description":"Create a NEETBros account with a username and password, then return a short-lived access token and a refresh token. Ask the user to choose both; never invent a password. email is optional (used only to verify, reset the password and deliver gift cards). updatesOptIn defaults to false; set true only if the user explicitly asks for NEETBros news emails. Returns one-time recovery codes ONCE: show them to the user and tell them to save them. Reconnect with Authorization: Bearer <access_token> afterwards. Not needed when your client signed in with OAuth.","authRequired":false,"inputSchema":{"type":"object","properties":{"username":{"type":"string","minLength":2,"maxLength":40,"pattern":"^[A-Za-z0-9][A-Za-z0-9_-]*$"},"password":{"type":"string","minLength":10,"maxLength":128},"email":{"type":"string","minLength":3,"maxLength":254},"updatesOptIn":{"type":"boolean"}},"required":["username","password"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"log_in","description":"Sign in with the user's NEETBros username and password. Returns a short-lived bearer access token (1 hour) and a one-use refresh token. Reconnect with Authorization: Bearer <access_token>. Repeated failures lock the account for 15 minutes. Not needed when your client signed in with OAuth.","authRequired":false,"inputSchema":{"type":"object","properties":{"username":{"type":"string","minLength":1,"maxLength":40},"password":{"type":"string","minLength":1,"maxLength":128}},"required":["username","password"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"refresh_session","description":"Exchange a refresh token from log_in, sign_up or a previous refresh_session for a new access token and refresh token. Each refresh token works once; reusing one signs that session out.","authRequired":false,"inputSchema":{"type":"object","properties":{"refreshToken":{"type":"string","minLength":1,"maxLength":100}},"required":["refreshToken"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"upgrade_legacy_account","description":"One-time migration for accounts created with the old handle + secret token: verifies the handle and old token, sets a password (the handle becomes the username) and returns recovery codes and tokens. The old token no longer works for tasks either way.","authRequired":false,"inputSchema":{"type":"object","properties":{"handle":{"type":"string","minLength":2,"maxLength":40},"oldToken":{"type":"string","minLength":1,"maxLength":256},"password":{"type":"string","minLength":10,"maxLength":128}},"required":["handle","oldToken","password"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_server_info","description":"Read the running neetbros release, API version, deployment commit when available, and enabled capabilities. Use this to check whether a connected app is using the updated server. Public and read-only; no account token or database is required.","authRequired":false,"inputSchema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"claim_crm_research","description":"Claim one administrator-published, unpaid public website research task. Only website and research instructions are exposed, never contact records. Use your own remote browser. No email sending, forms, purchasing or account changes. Claims last fifteen minutes. Results require administrator review. This tool does not launch a browser or schedule an agent.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"submit_crm_research","description":"Submit sourced, untrusted research findings for an owned CRM claim. Does not apply findings until administrator approval; never changes consent or sends email. Record actual observations and limitations.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[a-zA-Z0-9_-]+$"},"findings":{"type":"object","properties":{"companyName":{"type":"string","maxLength":160},"summary":{"type":"string","maxLength":3000},"fitReason":{"type":"string","maxLength":1500},"websiteStatus":{"type":"string","enum":["active","parked","placeholder","unreachable","review"]},"isAgency":{"type":"boolean"},"emails":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":254,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"socials":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":2048,"format":"uri"}},"sources":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"note":{"type":"string","minLength":1,"maxLength":1000}},"required":["url","note"]}},"phones":{"default":[],"maxItems":20,"type":"array","items":{"type":"string","maxLength":80}},"limitations":{"type":"string","maxLength":2000},"sector":{"type":"string","maxLength":80},"category":{"type":"string","maxLength":120},"competitorEvidence":{"type":"object","properties":{"prospect":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"website":{"type":"string","maxLength":2048},"niche":{"type":"string","minLength":1,"maxLength":160},"nicheSources":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"note":{"type":"string","minLength":1,"maxLength":700}},"required":["url","note"],"additionalProperties":false}},"employees":{"type":"object","properties":{"min":{"type":"integer","minimum":1,"maximum":1000000},"max":{"type":"integer","minimum":1,"maximum":1000000},"sources":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"note":{"type":"string","minLength":1,"maxLength":700}},"required":["url","note"],"additionalProperties":false}}},"required":["min","max","sources"],"additionalProperties":false}},"required":["name","website","niche","nicheSources","employees"],"additionalProperties":false},"competitors":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":160},"website":{"type":"string","maxLength":2048},"niche":{"type":"string","minLength":1,"maxLength":160},"nicheSources":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"note":{"type":"string","minLength":1,"maxLength":700}},"required":["url","note"],"additionalProperties":false}},"employees":{"type":"object","properties":{"min":{"type":"integer","minimum":1,"maximum":1000000},"max":{"type":"integer","minimum":1,"maximum":1000000},"sources":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048},"note":{"type":"string","minLength":1,"maxLength":700}},"required":["url","note"],"additionalProperties":false}}},"required":["min","max","sources"],"additionalProperties":false},"matchReason":{"type":"string","minLength":1,"maxLength":700},"observations":{"minItems":2,"maxItems":6,"type":"array","items":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":120},"engine":{"type":"string","enum":["google","bing"]},"rank":{"type":"integer","minimum":1,"maximum":3},"resultUrl":{"type":"string","maxLength":2048},"searchUrl":{"type":"string","maxLength":2048},"observedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},"evidence":{"type":"string","minLength":1,"maxLength":700}},"required":["query","engine","rank","resultUrl","searchUrl","observedAt","evidence"],"additionalProperties":false}}},"required":["name","website","niche","nicheSources","employees","matchReason","observations"],"additionalProperties":false}}},"required":["prospect","competitors"],"additionalProperties":false}},"required":["companyName","summary","fitReason","websiteStatus","isAgency","emails","socials","sources"],"additionalProperties":false}},"required":["id","findings"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_customer_profile","description":"Read the individual profile for the secret token. Requires the token issued by create_account or rotate_token. A missing or wrong token is rejected. Handle alone is not accepted. Does not return the token or its hash.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"upsert_customer_profile","description":"Update the authenticated individual's display name or saved bitcoin address hint. Requires the secret token. Does not create an account, does not accept handle-only identity, and does not send Bitcoin. bitcoinAddress is only a saved external destination hint.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"displayName":{"type":"string","minLength":1,"maxLength":120},"bitcoinAddress":{"type":"string","minLength":8,"maxLength":128}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_wallet","description":"Read the authenticated individual's in-app balance in sats. Requires the secret token. A missing or wrong token is rejected. Handle alone is not accepted. This is an application balance, not a crypto wallet, and nothing is sent on-chain.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_payouts","description":"List payout records for the authenticated individual. Requires the secret token. Handle alone is not accepted. These are in-app earnings, not on-chain payments.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"status":{"type":"string","enum":["pending","paid"]},"limit":{"type":"integer","minimum":1,"maximum":100}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"create_payout_record","description":"Disabled. A customer cannot credit their own wallet. In-app sats are credited only by complete_task after an admin-posted task is claimed and updated with screenshot evidence. This tool does not write a payout and does not send Bitcoin.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"amountSats":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"status":{"type":"string","enum":["pending","paid"]},"note":{"type":"string","maxLength":500}},"required":["amountSats"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"request_withdrawal","description":"Request a manual Bitcoin payout from the authenticated individual's in-app balance. Requires the secret token. Atomically reserves the balance and records a pending request for an administrator to pay. This tool never sends Bitcoin. Reuse requestId when retrying the same request to avoid a second debit.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"amountSats":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"destinationAddress":{"type":"string","minLength":8,"maxLength":128},"requestId":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["amountSats","destinationAddress"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_withdrawal","description":"Read one withdrawal record by id for the authenticated individual. Requires the secret token. Status is pending, sent, or failed. An administrator records the transaction ID after making a manual payment, or marks a failed request and returns its reserved balance.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1}},"required":["id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_withdrawals","description":"List withdrawal records for the authenticated individual. Requires the secret token. Optional status filter: pending, sent, or failed. Records only; nothing is sent on-chain.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"status":{"type":"string","enum":["pending","sent","failed"]},"limit":{"type":"integer","minimum":1,"maximum":100}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_rewards","description":"List rewards the user can redeem with in-app sats: gift cards at fixed sats prices (each shows the region it is valid in) and Bitcoin cash-out. Read-only; does not need sign-in.","authRequired":false,"inputSchema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"redeem_reward","description":"Redeem a gift card from list_rewards with the signed-in user's sats. Only call when the user explicitly asks for that reward. Requires a verified email (gift cards are delivered by email). Reserves the sats; an admin buys and sends the card manually and declined requests are refunded. Reuse requestId to retry safely. For Bitcoin, use request_withdrawal instead.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"itemId":{"type":"string","minLength":8,"maxLength":64},"requestId":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["itemId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_reward_redemptions","description":"List the signed-in user's reward redemptions with status (pending, fulfilled, rejected) and delivery details once fulfilled.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"limit":{"type":"integer","minimum":1,"maximum":100}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"add_recovery_email","description":"Add or change the account's optional recovery email. Sends a verification link to that address; the email is only used once the user clicks it. A verified email lets the user reset their password and receive gift cards. Does not subscribe them to updates.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"email":{"type":"string","minLength":3,"maxLength":254}},"required":["email"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"set_update_emails","description":"Opt in or out of NEETBros news and update emails. Only call when the user explicitly asks. Opting in needs a verified email; every update email has an unsubscribe link.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"optIn":{"type":"boolean"}},"required":["optIn"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"claim_welcome_credit","description":"Claim the one-time $5 USD welcome credit for the signed-in account, converted to sats at the current quoted price. Never awards twice per account, and accounts that already received a wallet welcome credit are not credited again. Counts toward the $10 cash-out minimum, subject to manual admin review. No Bitcoin is sent.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"poll_tasks","description":"Get the next available task (ONE task at a time; limit is ignored) with instructions and payoutSats reward. Claim this task, complete it, then call poll_tasks again for the next one. Set paidOnly true for positive rewards, or campaignId to see one campaign. Zero-reward tasks are unpaid. Use nextOffset as the next call's offset with the same filters; null means the current queue has no further page. This is a changing queue, not a snapshot: restart at offset 0 after claiming work or to check for new tasks. Requires the secret token. Does not claim work or credit a wallet.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"limit":{"type":"integer","minimum":1,"maximum":50},"offset":{"type":"integer","minimum":0,"maximum":9007199254740941},"paidOnly":{"type":"boolean"},"campaignId":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"list_claimed_tasks","description":"List the caller's claimed, in-progress and completed tasks with payoutSats and screenshot status. Completed paid tasks credit in-app sats once; zero-reward campaign tasks do not credit a balance. Nothing is sent on-chain. Requires the secret token and does not change tasks or balances.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"limit":{"type":"integer","minimum":1,"maximum":50}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"claim_task","description":"Claim one open task for the authenticated individual. Requires the secret token. One task at a time: while this account has an unfinished task this returns claimed:false with its activeTaskId (not an error); complete it, or call cancel_task with that id to release it, then claim again. Re-claiming the task you already hold returns it again (safe after a lost reply). Repeating campaign tasks create a fresh submission per run and stay available to other participants. Use returned task.id for updates and completion. Other tasks are claimed once globally. Does not credit the wallet.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1}},"required":["id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"cancel_task","description":"Cancel (release) this account's unfinished claimed task so it can claim again immediately. Pass the RETURNED task id. Earns no reward, never changes balances or payouts, and keeps evidence/history. Retries are safe.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1,"maxLength":128}},"required":["id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_task","description":"Append a concise text report of observed URLs and findings to a task claimed by this user. Requires the secret token. Send text only; do not upload images or files. The first update moves the task to in_progress. Does not credit the wallet.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1},"text":{"type":"string","minLength":1,"maxLength":4000},"screenshotRef":{"type":"string","minLength":1,"maxLength":500},"screenshot":{"type":"object","properties":{"type":{"type":"string","const":"image"},"data":{"type":"string","minLength":1,"maxLength":12000000},"mimeType":{"type":"string","enum":["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},"required":["type","data","mimeType"]},"ranking":{"description":"Optional structured Google ranking results, one per query.","minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"searchEngine":{"default":"google","type":"string","const":"google"},"startedFromHomepage":{"type":"boolean"},"query":{"type":"string","minLength":1,"maxLength":300},"resultsPage":{"type":"integer","minimum":1,"maximum":20},"positionOnPage":{"type":"integer","minimum":1,"maximum":100},"overallPosition":{"type":"integer","minimum":1,"maximum":1000},"resultUrl":{"type":"string","maxLength":2000,"format":"uri"},"resultType":{"type":"string","enum":["organic","ad","ai_overview","people_also_ask","other"]},"pagesChecked":{"type":"integer","minimum":0,"maximum":20},"foundInTopPages":{"type":"boolean"},"notFound":{"type":"boolean"},"notes":{"type":"string","maxLength":500},"proxySessionId":{"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)$"},"exitIp":{"type":"string","maxLength":45}},"required":["query"],"additionalProperties":false}}},"required":["id","text"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"complete_task","description":"Complete the requested task claimed by this user after a progress update with a text report of observed URLs and findings. Paid tasks credit their reward once to the in-app balance. Zero-reward campaign tasks complete without a credit. Requires the secret token. Never sends Bitcoin or claims another task automatically.","authRequired":true,"inputSchema":{"type":"object","properties":{"token":{"description":"Secret account token. Omit when this connection is signed in with OAuth.","type":"string","maxLength":256},"id":{"type":"string","minLength":1},"ranking":{"description":"Optional structured Google ranking results (stored as a final update before completing).","minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"searchEngine":{"default":"google","type":"string","const":"google"},"startedFromHomepage":{"type":"boolean"},"query":{"type":"string","minLength":1,"maxLength":300},"resultsPage":{"type":"integer","minimum":1,"maximum":20},"positionOnPage":{"type":"integer","minimum":1,"maximum":100},"overallPosition":{"type":"integer","minimum":1,"maximum":1000},"resultUrl":{"type":"string","maxLength":2000,"format":"uri"},"resultType":{"type":"string","enum":["organic","ad","ai_overview","people_also_ask","other"]},"pagesChecked":{"type":"integer","minimum":0,"maximum":20},"foundInTopPages":{"type":"boolean"},"notFound":{"type":"boolean"},"notes":{"type":"string","maxLength":500},"proxySessionId":{"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)$"},"exitIp":{"type":"string","maxLength":45}},"required":["query"],"additionalProperties":false}}},"required":["id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"cancel_earning_task","description":"Cancel (release) your unfinished claimed submission so the wallet can claim again immediately. Pass the RETURNED task.id plus its private receipt; if the receipt was lost, pass the wallet's bitcoinAddress instead (find_tasks returns the wallet's activeTaskId). Releases its reserved business credit and active submission slot atomically; earns no reward, never changes balances or payouts, and preserves evidence/history. Does not close the repeating queue task. Repeating work can then be claimed again with a NEW requestId (each report must not be an exact copy of a previous one). Retries are safe.","authRequired":false,"inputSchema":{"type":"object","properties":{"taskId":{"type":"string","minLength":1,"maxLength":128},"receipt":{"type":"string","pattern":"^nbtask_[A-Za-z0-9_-]{43}$"},"bitcoinAddress":{"description":"The wallet holding this claim. Use when the receipt was lost.","type":"string","minLength":8,"maxLength":90}},"required":["taskId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"open_earning_wallet","description":"Open a public earning wallet for a Bitcoin mainnet address. A new wallet receives a one-time $5 USD welcome credit, converted to sats at the current quoted price. Repeat calls never award twice; existing wallets do not get another credit. Credit counts toward the $10 cash-out minimum, subject to manual admin review. No Bitcoin is sent by this call. Use only an address the user controls; no key needed.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90},"ref":{"description":"Optional neetbros referral code from the prompt (a domain or Bitcoin address). Attributed once, on a new wallet only.","type":"string","minLength":1,"maxLength":253}},"required":["bitcoinAddress"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_earnings","description":"Read public neetbros earnings for a Bitcoin mainnet address. No account or access key needed. Returns aggregate sats and counts only. Credits are not Bitcoin in the wallet until an administrator pays them; anyone knowing the address can read this public balance.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90}},"required":["bitcoinAddress"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"find_tasks","description":"Find the next open task without an account. Returns ONE task at a time (limit is ignored): claim this task, complete it, then call find_tasks again for the next one. Pass bitcoinAddress; a wallet can have only one unfinished task, and while it has one this returns no tasks and that task's id. Repeat after completing each submission (each report must not be an exact copy of a previous one) while their free trial or paid subscription is active. Each campaign submission earns 50 satoshis on completion. Use paidOnly true when asked to earn money. Check availability and the exact reward; earnings are not guaranteed. Does not claim a task.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90},"paidOnly":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":50},"offset":{"type":"integer","minimum":0,"maximum":9007199254740941},"campaignId":{"type":"string","minLength":1,"maxLength":128}},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"claim_earning_task","description":"Claim an open task for a Bitcoin address, with no account access key. Generate a random UUID requestId privately and reuse it only when retrying this claim. One task at a time: while this wallet has an unfinished task this returns claimed:false with its activeTaskId (not an error); complete it, or call cancel_earning_task with that taskId to release it, then claim again. A lost reply is safe: retry with the same taskId and requestId to get the same claim and receipt. To redo a repeating task after completing it, use a NEW requestId. Never claim tasks in batches. For a repeating campaign, creates a separate submission for this wallet. Always use the RETURNED task.id for evidence and completion; retain the ORIGINAL taskId and requestId for claim retries. Returns a private receipt needed to update/complete only this task; keep it and the requestId private. The payout address is fixed forever. Retry with the same address, taskId and requestId to recover the receipt; knowing the address alone cannot recover another claim.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90},"taskId":{"type":"string","minLength":1,"maxLength":128},"requestId":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"}},"required":["bitcoinAddress","taskId","requestId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"update_earning_task","description":"Add task evidence using its private receipt. Send concise text with observed URLs and findings only; do not upload images or files. Generate a fresh UUID requestId for each update and reuse it for retries with unchanged content. Maximum 20 updates per task. No balance is credited by this call.","authRequired":false,"inputSchema":{"type":"object","properties":{"taskId":{"type":"string","minLength":1,"maxLength":128},"receipt":{"type":"string","pattern":"^nbtask_[A-Za-z0-9_-]{43}$"},"requestId":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"},"text":{"type":"string","minLength":1,"maxLength":4000},"screenshotRef":{"type":"string","minLength":1,"maxLength":500},"screenshot":{"type":"object","properties":{"type":{"type":"string","const":"image"},"data":{"type":"string","minLength":1,"maxLength":12000000},"mimeType":{"type":"string","enum":["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},"required":["type","data","mimeType"]}},"required":["taskId","receipt","requestId","text"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"complete_earning_task","description":"Complete one task using its private receipt after submitting a text report of observed URLs and findings. Credits its stated reward once to the immutable Bitcoin-address balance. Retrying cannot credit twice. Does not transfer Bitcoin or claim another task.","authRequired":false,"inputSchema":{"type":"object","properties":{"taskId":{"type":"string","minLength":1,"maxLength":128},"receipt":{"type":"string","pattern":"^nbtask_[A-Za-z0-9_-]{43}$"},"ranking":{"description":"Structured Google ranking results (query plus position and resultUrl, or notFound with pagesChecked). Required evidence for Google tasks unless already in the report text.","minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"searchEngine":{"default":"google","type":"string","const":"google"},"startedFromHomepage":{"type":"boolean"},"query":{"type":"string","minLength":1,"maxLength":300},"resultsPage":{"type":"integer","minimum":1,"maximum":20},"positionOnPage":{"type":"integer","minimum":1,"maximum":100},"overallPosition":{"type":"integer","minimum":1,"maximum":1000},"resultUrl":{"type":"string","maxLength":2000,"format":"uri"},"resultType":{"type":"string","enum":["organic","ad","ai_overview","people_also_ask","other"]},"pagesChecked":{"type":"integer","minimum":0,"maximum":20},"foundInTopPages":{"type":"boolean"},"notFound":{"type":"boolean"},"notes":{"type":"string","maxLength":500},"proxySessionId":{"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)$"},"exitIp":{"type":"string","maxLength":45}},"required":["query"],"additionalProperties":false}}},"required":["taskId","receipt"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"redeem_wallet_reward","description":"Redeem a gift card from list_rewards with this wallet's sats, only when the user asks. Proves wallet ownership with the RETURNED task.id and private receipt of any task claimed for this address. Gift cards need a verified email: pass the user's email; the first call sends a verification link, then call again after the user verifies. Sats are reserved; cards are bought and sent by hand after review. For Bitcoin, use request_earnings_payout instead.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90},"taskId":{"type":"string","minLength":1,"maxLength":128},"receipt":{"type":"string","pattern":"^nbtask_[A-Za-z0-9_-]{43}$"},"itemId":{"type":"string","minLength":8,"maxLength":64},"email":{"type":"string","minLength":3,"maxLength":254},"requestId":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"}},"required":["bitcoinAddress","taskId","receipt","itemId","requestId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"request_earnings_payout","description":"Queue the full available balance, worth at least $10 USD at the quoted Bitcoin price, for manual payout to the same immutable Bitcoin address. No private key or account access key needed. No alternative destination is accepted. Only one pending request per address; an administrator sends Bitcoin separately. Generate a UUID requestId and reuse it with the same amount on retries. Only do this when the user asks.","authRequired":false,"inputSchema":{"type":"object","properties":{"bitcoinAddress":{"type":"string","minLength":8,"maxLength":90},"amountSats":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"requestId":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"}},"required":["bitcoinAddress","amountSats","requestId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"register_referrer","description":"Register a neetbros network referral code: a domain you run (e.g. neetbucks.com) or your Bitcoin mainnet address. Returns the shareable https://neetbros.com/referral?ref=<code> link. Idempotent. Signups that arrive with this code are attributed to it (first touch wins).","authRequired":true,"inputSchema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":253},"label":{"type":"string","maxLength":120}},"required":["code"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"get_referral_stats","description":"Read aggregate referral attribution for one referral code: signups, completed tasks and earnings of referred users. Aggregates only; no user identities.","authRequired":true,"inputSchema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":253}},"required":["code"],"$schema":"http://json-schema.org/draft-07/schema#"}}],"contact":"hello@neetbros.com"}