Let Claude or Cursor pay for MCP tools under hard caps, with Approve or Decline on every pay.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer vapt_ spend key for Cursor. Claude can Sign in with OAuth instead.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a get-paid invoice for the spend-key owner. Returns a /r/{publicId} URL. Another agent can call pay_invoice with that URL; a human opening the link sees Vybe crypto checkout. Does not move money and does not require Approve. After sharing, call get_invoice with the publicId to check if it was paid before taking a follow-up action. Related: get_invoice, list_invoices, pay_invoice.
Invoice face amount as a decimal string, e.g. 25 or 5.50.
Short note shown on /r/ and on the payer’s Approve card.
Stablecoin. Defaults to usdc.
Who absorbs the platform fee when fees are live. creator (default) or client.
Hours until expiry. Defaults to 72.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http pay https://www.vybe.finance/api/mcp/pay
Headers
Authorization (optional, not in the config above): Bearer vapt_ spend key for Cursor. Claude can Sign in with OAuth instead.Create a get-paid invoice for the spend-key owner. Returns a /r/{publicId} URL. Another agent can call pay_invoice with that URL; a human opening the link sees Vybe crypto checkout. Does not move money and does not require Approve. After sharing, call get_invoice with the publicId to check if it was paid before taking a follow-up action. Related: get_invoice, list_invoices, pay_invoice.
| Argument | Type | Description |
|---|---|---|
| memo | string | Short note shown on /r/ and on the payer’s Approve card. |
| token | string | Stablecoin. Defaults to usdc. |
| amount* | string | Invoice face amount as a decimal string, e.g. 25 or 5.50. |
| feePayer | string | Who absorbs the platform fee when fees are live. creator (default) or client. |
| expiresInHours | integer | Hours until expiry. Defaults to 72. |
{
"type": "object",
"title": "CreateInvoiceInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"amount"
],
"properties": {
"memo": {
"type": "string",
"maxLength": 140,
"description": "Short note shown on /r/ and on the payer’s Approve card."
},
"token": {
"enum": [
"usdc",
"usdt"
],
"type": "string",
"description": "Stablecoin. Defaults to usdc."
},
"amount": {
"type": "string",
"description": "Invoice face amount as a decimal string, e.g. 25 or 5.50."
},
"feePayer": {
"enum": [
"creator",
"client"
],
"type": "string",
"description": "Who absorbs the platform fee when fees are live. creator (default) or client."
},
"expiresInHours": {
"type": "integer",
"maximum": 720,
"minimum": 1,
"description": "Hours until expiry. Defaults to 72."
}
},
"description": "Amount and optional memo for a shareable agent invoice.",
"additionalProperties": false
}Unlock research/file offerings only. For MCP or API offerings, call use_paid_offering with the same publicId instead. Related: use_paid_offering, pay_offering.
| Argument | Type | Description |
|---|---|---|
| publicId* | string | Vybe payment request id from pay_offering or list_recent_pays (e.g. vybe_col_…). |
{
"type": "object",
"title": "FetchPaidContentInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"publicId"
],
"properties": {
"publicId": {
"type": "string",
"minLength": 8,
"description": "Vybe payment request id from pay_offering or list_recent_pays (e.g. vybe_col_…)."
}
},
"description": "Identify the settled pay. publicId alone is enough when this spend key created it.",
"additionalProperties": false
}Check whether an invoice you created is still pending or already paid. Pass the publicId or /r/ url from create_invoice. Use this before taking a follow-up action that should only run after payment. Only works for invoices owned by this spend key’s owner. Related: create_invoice, list_invoices.
| Argument | Type | Description |
|---|---|---|
| url | string | Invoice URL from create_invoice. |
| publicId | string | Invoice publicId from create_invoice. |
{
"type": "object",
"title": "GetInvoiceInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"url": {
"type": "string",
"description": "Invoice URL from create_invoice."
},
"publicId": {
"type": "string",
"description": "Invoice publicId from create_invoice."
}
},
"description": "Identify the invoice with url or publicId.",
"additionalProperties": false
}Return the bound spend key’s hard limits: label, per-transaction max in USD, daily cap, optional seller allowlist, expiry, and authMode (oauth or vapt). Use this to tell the user what the agent is allowed to request before calling pay_offering. Related: get_spend_balance, get_wallet_balance.
No arguments.
{
"type": "object",
"title": "NoArguments",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"description": "This tool takes no arguments. Authenticate with OAuth (Claude Sign in) or Authorization: Bearer vapt_… (Cursor).",
"additionalProperties": false
}Return the bound spend key’s policy headroom for the last 24 hours: daily remaining, pending, and paid. This is not the on-chain USDC wallet balance — use get_wallet_balance for that. Call this before pay_offering to check whether a pay would hit the daily cap. Related: get_wallet_balance, get_limits.
No arguments.
{
"type": "object",
"title": "NoArguments",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"description": "This tool takes no arguments. Authenticate with OAuth (Claude Sign in) or Authorization: Bearer vapt_… (Cursor).",
"additionalProperties": false
}Full details for one marketplace tool: actions with their inputs, an example, price, seller and health, plus the exact next step. For a paid tool the next step is pay_offering with its offeringUrl, then use_paid_offering with toolName and toolArguments. For a free tool it is run_free_tool, which needs no sign-in. Pass slug or the tool page URL. Related: search_tools, run_free_tool, pay_offering, use_paid_offering.
| Argument | Type | Description |
|---|---|---|
| url | string | Tool page URL, e.g. https://www.vybe.finance/marketplace/tools/pathguard. |
| slug | string | Tool slug from search_tools, e.g. pathguard. |
{
"type": "object",
"title": "GetToolInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"url": {
"type": "string",
"description": "Tool page URL, e.g. https://www.vybe.finance/marketplace/tools/pathguard."
},
"slug": {
"type": "string",
"maxLength": 60,
"description": "Tool slug from search_tools, e.g. pathguard."
}
},
"description": "Provide slug or url.",
"additionalProperties": false
}Read-only on-chain USDC/USDT balances for the spend key owner’s Vybe wallet (Base, Ethereum, BNB). Use this to tell the user how much they can spend. Separate from get_spend_balance (VAPT caps). Does not move funds. Related: get_spend_balance, get_limits, pay_offering.
No arguments.
{
"type": "object",
"title": "NoArguments",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"description": "This tool takes no arguments. Authenticate with OAuth (Claude Sign in) or Authorization: Bearer vapt_… (Cursor).",
"additionalProperties": false
}List invoices the spend-key owner created (open, paid, etc.). Use to find a publicId, then get_invoice for details. Related: create_invoice, get_invoice.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max rows to return. Defaults to 20. |
| status | string | Which invoices to return. Defaults to all. |
{
"type": "object",
"title": "ListInvoicesInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 40,
"minimum": 1,
"description": "Max rows to return. Defaults to 20."
},
"status": {
"enum": [
"all",
"pending",
"paid",
"expired",
"cancelled"
],
"type": "string",
"default": "all",
"description": "Which invoices to return. Defaults to all."
}
},
"description": "Optional status filter and limit.",
"additionalProperties": false
}List recent Collect pays, friend sends, and invoice pays started by the bound spend key, newest first. Filter by status: pending (waiting on Approve), paid (settled), or all. For paid Collect rows, call use_paid_offering with publicId. Related: pay_offering, pay_invoice, send_to_user, use_paid_offering.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of pays to return, from 1 to 40. Defaults to 20. |
| status | string | Which pays to return. pending = waiting on Approve, paid = settled, all = both. Defaults to all. |
{
"type": "object",
"title": "ListRecentPaysInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 40,
"minimum": 1,
"description": "Maximum number of pays to return, from 1 to 40. Defaults to 20."
},
"status": {
"enum": [
"all",
"pending",
"paid"
],
"type": "string",
"default": "all",
"description": "Which pays to return. pending = waiting on Approve, paid = settled, all = both. Defaults to all."
}
},
"description": "Optional filters for pays started by this spend key.",
"additionalProperties": false
}Pay a Vybe invoice by /r/ URL or publicId under the owner’s spend key. Creates awaiting_approval — money does not move until Approve in Vybe. Only vybe.finance/r/… links are allowed (not arbitrary URLs). Friendship is not required. Related: create_invoice, get_invoice, get_limits, get_spend_balance, list_recent_pays.
| Argument | Type | Description |
|---|---|---|
| url | string | Full invoice URL, e.g. https://www.vybe.finance/r/Vh3xR2mQ |
| publicId | string | Invoice publicId when you already have it. |
{
"type": "object",
"title": "PayInvoiceInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"url": {
"type": "string",
"description": "Full invoice URL, e.g. https://www.vybe.finance/r/Vh3xR2mQ"
},
"publicId": {
"type": "string",
"description": "Invoice publicId when you already have it."
}
},
"description": "Provide url or publicId for a pending Vybe /r/ invoice.",
"additionalProperties": false
}Start a Vybe Collect payment under the owner's connected spend key (OAuth Sign in or Bearer VAPT). Creates a pending pay and returns awaiting_approval — money does not move until the wallet owner taps Approve in Vybe (web or mobile). After paid (or trial), call use_paid_offering with the returned publicId — that unlocks research files, lists/runs seller MCP tools, or proxies paid API calls. Do not scrape the marketplace page. Pass username plus offeringId, or a Collect / marketplace offeringUrl. Related: use_paid_offering, fetch_paid_content, get_limits, get_spend_balance, list_recent_pays.
| Argument | Type | Description |
|---|---|---|
| calls | integer | Optional. Buy a prepaid bundle of this many calls (see bundles in get_tool), usually cheaper per call. Omit it to use free calls and bundle calls first; when those run out, a tool that sells bundles charges for its smallest bundle, and only tools without bundles charge for one call. |
| username | string | Seller Collect username without the @ prefix, for example yellobots. Required with offeringId when offeringUrl is omitted. |
| offeringId | string | Collect offering id from the seller catalog, for example svc_gMcO7ioZ. Required with username when offeringUrl is omitted. |
| offeringUrl | string | Full Collect or marketplace URL for the offering, including tool pages like https://www.vybe.finance/marketplace/tools/{slug} (offeringUrl from search_tools). Use this instead of username plus offeringId when you already have the link. |
{
"type": "object",
"title": "PayOfferingInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"calls": {
"enum": [
500,
1000,
5000
],
"type": "integer",
"description": "Optional. Buy a prepaid bundle of this many calls (see bundles in get_tool), usually cheaper per call. Omit it to use free calls and bundle calls first; when those run out, a tool that sells bundles charges for its smallest bundle, and only tools without bundles charge for one call."
},
"username": {
"type": "string",
"minLength": 3,
"description": "Seller Collect username without the @ prefix, for example yellobots. Required with offeringId when offeringUrl is omitted."
},
"offeringId": {
"type": "string",
"description": "Collect offering id from the seller catalog, for example svc_gMcO7ioZ. Required with username when offeringUrl is omitted."
},
"offeringUrl": {
"type": "string",
"description": "Full Collect or marketplace URL for the offering, including tool pages like https://www.vybe.finance/marketplace/tools/{slug} (offeringUrl from search_tools). Use this instead of username plus offeringId when you already have the link."
}
},
"description": "Identify the Collect offering to pay. Provide username and offeringId together, or offeringUrl alone.",
"additionalProperties": false
}Run a free tool from the Vybe Marketplace and get its answer. No sign-in or spend key needed, and nothing is charged. Get the slug, action names and inputs from search_tools or get_tool first. Free tools have fair-use limits per caller; if you hit one, tell the user when it resets. Paid tools can't run here: use pay_offering and use_paid_offering. Related: search_tools, get_tool.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Tool slug from search_tools or get_tool. |
| toolName | string | Action name from get_tool. Optional when the tool has one action. |
| toolArguments | object | The action's inputs as JSON, using the keys from get_tool. |
{
"type": "object",
"title": "RunFreeToolInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"maxLength": 60,
"description": "Tool slug from search_tools or get_tool."
},
"toolName": {
"type": "string",
"maxLength": 80,
"description": "Action name from get_tool. Optional when the tool has one action."
},
"toolArguments": {
"type": "object",
"description": "The action's inputs as JSON, using the keys from get_tool.",
"additionalProperties": true
}
},
"description": "slug is required. Pass toolName when the tool has more than one action.",
"additionalProperties": false
}Search the Vybe Marketplace for MCP tools the user can use: free tools (run with run_free_tool, no sign-in) and paid tools (pay per use with pay_offering). Use this when the user asks for a capability you do not have, e.g. reading a PDF, looking up a postcode or checking a crypto transaction. Returns name, one-line summary, price, actions and offeringUrl. Never invent tools; if nothing fits, say so. Related: get_tool, pay_offering.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max results, default 8. |
| query | string | Plain words for what the user needs, e.g. 'pdf to text' or 'uk postcode'. |
| access | string | Optional: only free or only paid tools. Defaults to all. |
| category | string | Optional category filter. |
{
"type": "object",
"title": "SearchToolsInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Max results, default 8."
},
"query": {
"type": "string",
"maxLength": 120,
"description": "Plain words for what the user needs, e.g. 'pdf to text' or 'uk postcode'."
},
"access": {
"enum": [
"all",
"free",
"paid"
],
"type": "string",
"description": "Optional: only free or only paid tools. Defaults to all."
},
"category": {
"enum": [
"web",
"search",
"data",
"documents",
"location",
"finance",
"developer",
"media",
"business",
"other"
],
"type": "string",
"description": "Optional category filter."
}
},
"description": "All fields optional. With no query, returns the most used tools.",
"additionalProperties": false
}Send USDC/USDT to a mutual friend. Pass username (@handle) when known, or name (first, last, or full name). Lookup is limited to mutual friends — never invent wallet addresses. If several friends match the name, the tool returns candidates; ask the owner which @username, then retry. Creates a pending pay — money does not move until Approve in Vybe. Trusted mutual friends still Approve once but notify quietly. Related: get_limits, get_spend_balance, get_wallet_balance, list_recent_pays.
| Argument | Type | Description |
|---|---|---|
| memo | string | Optional short note shown on the Approve card. |
| name | string | First name, last name, or full name among mutual friends (e.g. Ada or Ada Lovelace). Used when username is omitted, or as an alternate hint. |
| token | string | Stablecoin to send. Defaults to usdc. |
| amount* | string | Amount as a decimal string, for example 5 or 1.50. |
| username | string | Recipient Vybe @username (with or without @), or a name string if name is omitted. Must resolve to a mutual friend. |
{
"type": "object",
"title": "SendToUserInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"amount"
],
"properties": {
"memo": {
"type": "string",
"maxLength": 140,
"description": "Optional short note shown on the Approve card."
},
"name": {
"type": "string",
"minLength": 2,
"description": "First name, last name, or full name among mutual friends (e.g. Ada or Ada Lovelace). Used when username is omitted, or as an alternate hint."
},
"token": {
"enum": [
"usdc",
"usdt"
],
"type": "string",
"description": "Stablecoin to send. Defaults to usdc."
},
"amount": {
"type": "string",
"description": "Amount as a decimal string, for example 5 or 1.50."
},
"username": {
"type": "string",
"minLength": 2,
"description": "Recipient Vybe @username (with or without @), or a name string if name is omitted. Must resolve to a mutual friend."
}
},
"description": "Provide username and/or name plus amount. Prefer @username when known.",
"additionalProperties": false
}After a Collect pay is settled (status paid or trial), use this tool with the publicId from pay_offering. It branches by offering type: research/asset returns the file; MCP lists seller tools (omit toolName) or runs one (pass toolName + toolArguments); API proxies method+path(+body) through Vybe. Prefer this over inventing HTTP calls or scraping marketplace HTML. Related: pay_offering, list_recent_pays, fetch_paid_content.
| Argument | Type | Description |
|---|---|---|
| body | any | API only: JSON body for POST/PUT/PATCH. |
| path | string | API only: path under the offering invoke base, e.g. /v1/scan. |
| method | string | API only: HTTP method, e.g. GET or POST. Defaults to GET. |
| publicId* | string | Vybe payment request id from pay_offering or list_recent_pays. |
| toolName | string | MCP only: seller tool name from the prior tools/list response. |
| toolArguments | object | MCP only: JSON arguments for tools/call. |
{
"type": "object",
"title": "UsePaidOfferingInput",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"publicId"
],
"properties": {
"body": {
"description": "API only: JSON body for POST/PUT/PATCH."
},
"path": {
"type": "string",
"description": "API only: path under the offering invoke base, e.g. /v1/scan."
},
"method": {
"type": "string",
"description": "API only: HTTP method, e.g. GET or POST. Defaults to GET."
},
"publicId": {
"type": "string",
"minLength": 4,
"description": "Vybe payment request id from pay_offering or list_recent_pays."
},
"toolName": {
"type": "string",
"description": "MCP only: seller tool name from the prior tools/list response."
},
"toolArguments": {
"type": "object",
"description": "MCP only: JSON arguments for tools/call.",
"additionalProperties": true
}
},
"description": "publicId is required. For MCP, omit toolName to list tools, then pass toolName to run one. For API, pass method and path.",
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.