{"name":"ai.vaaya/mcp","slug":"vaaya-mcp","title":"Vaaya","description":"Paid APIs and tokenized shares for agents. Prepaid funding, including authorized Instinct checkout.","url":"https://mcp.market/server/vaaya-mcp","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":52,"stars":43,"forks":7,"downloads_week":548,"last_push_at":"2026-09-13T17:43:05.000Z","license":"MIT"},"uptime":{"percent":100,"checks":2,"ok":2,"last_checked_at":"2026-09-19T20:41:00.656Z","last_ok_at":"2026-09-19T20:41:00.656Z","latency_ms":313},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/vaaya-ai/vaaya-mcp","website":"https://vaaya.ai","version":"0.6.8","remotes":[{"type":"streamable-http","url":"https://vaaya.ai/mcp"}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@vaaya/mcp","version":"0.6.8","transport":{"type":"stdio"}}],"tools":[{"name":"buy","description":"Buy something for the USER — a physical good, a ticket, a subscription — paid by the user's OWN card, never from their Vaaya balance. First use `setup` to check the Link wallet and shipping address; resolve missing setup once. Prefer guest checkout; when login is required, let the user sign in or sign up in the checkout browser. THE SEAMLESS PATH: once the user has told you what to buy and you have the exact item, merchant page URL and total, call `purchase` { item, merchant, url, total_cents, confirmed: true, confirmation: <the user's own words> } — it approves from their message (under the chat limit), starts buying in the user's cloud browser in the background and returns `message` (\"Hold on — buying it now.\"): RELAY IT, then poll `status` { approval_id } every ~10 seconds and relay its `message` when the status is completed (\"Done — …\"), requires_action (read action_required.reason for the exact blocker) or failed. If `status` says the user's shipping address is missing, ask for it and call `address` { name, line1, line2?, city, state?, postal_code, country, phone? } then `checkout` { approval_id } to resume; if a merchant login is needed, prefer direct browser sign-in; only if the user chooses to save credentials, call `credentials` { merchant, username, password } (stored encrypted, never shown again) then `checkout` again. Other sub-commands: `search` { query } (protocol merchants plus a real web search; the web half bills 5¢), `propose` { item, merchant, total_cents, url?, notes?, confirmed?, confirmation? } (creates an approval; without `confirmed` it returns an approval link the user opens — show its `message` VERBATIM), `checkout` { approval_id, params? } (buys an approved purchase; for a browser merchant it runs in the background like `purchase`). Use the user's existing authorization of the exact item and total; do not ask them to confirm twice. Ask only for missing purchase details. Nothing is ever bought without the user's yes: `checkout` refuses anything else. Use `reconcile` { approval_id } after an uncertain submission: it only inspects the existing checkout and never submits payment. Resume other pauses with the same approval_id; do not recreate a purchase to bypass an unresolved attempt. `charged_cents` is the Vaaya tool fee, NOT a merchant charge; read merchant_payment separately, and never infer a hold or capture from Link approval. Never open `browserbase` sessions yourself to buy something — only `buy` can.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"command":{"type":"string","enum":["setup","search","purchase","propose","status","checkout","reconcile","address","credentials"],"description":"What to do. `purchase` is the one-call seamless path."},"query":{"type":"string","description":"What to look for (`search`)."},"item":{"type":"string","description":"What exactly is being bought, in the user's words — variant, size, quantity (`purchase`, `propose`)."},"merchant":{"type":"string","description":"Merchant host or URL, e.g. bombas.com (`purchase`, `propose`, `credentials`)."},"total_cents":{"type":"number","description":"The full total the user will pay, in cents (`purchase`, `propose`)."},"currency":{"type":"string","description":"ISO currency, default 'usd'."},"url":{"type":"string","description":"The exact product page the item came from — the driver starts there (`purchase`, `propose`)."},"notes":{"type":"string","description":"One line for the driver/user: variant, size, colour, quantity, delivery window."},"confirmed":{"type":"boolean","description":"true when the user has said yes to this exact item and total in the conversation (`purchase`, `propose`)."},"confirmation":{"type":"string","description":"The user's own words approving it, verbatim (`purchase`, `propose`)."},"approval_id":{"type":"string","description":"The approval returned by purchase/propose (`status`, `checkout`)."},"params":{"type":"object","description":"The merchant's own purchase body (product id, quantity, email, shipping) for a protocol merchant (`purchase`, `checkout`).","additionalProperties":true},"name":{"type":"string","description":"Full name for shipping (`address`)."},"line1":{"type":"string","description":"Street address (`address`)."},"line2":{"type":"string","description":"Apartment / unit (`address`)."},"city":{"type":"string","description":"City (`address`)."},"state":{"type":"string","description":"State / region (`address`)."},"postal_code":{"type":"string","description":"Postal / ZIP code (`address`)."},"country":{"type":"string","description":"Two-letter country code, e.g. US (`address`)."},"phone":{"type":"string","description":"Contact phone for delivery (`address`)."},"email":{"type":"string","description":"Contact email for the order; defaults to the account email (`address`)."},"username":{"type":"string","description":"Email/username at the merchant (`credentials`)."},"password":{"type":"string","description":"Password at the merchant — stored encrypted, never returned (`credentials`)."}},"required":["command"]}},{"name":"close","description":"Close an E2B sandbox session and stop its billing. Pass the `session_id`. Captures the final metered uptime cost and releases the hold. ALWAYS call this when finished with a session — an open session keeps billing per second of uptime. Safe to call repeatedly (idempotent).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"session_id":{"type":"string","description":"The session_id to close."}},"required":["session_id"]}},{"name":"consult","description":"Vaaya's consultant. Describe ANY external capability you or the user might want — generate an image/video, search or scrape the web, run code in a sandbox, send/receive email, enrich a contact — and it helps figure out the best way, teaching the user what Vaaya can do. It is CONVERSATIONAL and remembers prior turns. It returns: mode='converse' (a reply to RELAY to the user verbatim — questions, options, ideas; get the user's response and call consult again with it, so the conversation continues), mode='call' (an ordered list of calls to run via `use`, with a message explaining the preferred choice + alternatives + why; multi-step results may contain placeholders like '<from step 1: sandbox_id>' — run earlier steps first and substitute), or mode='unsupported'. Every reply includes `suggestions` (2-3 things to do next) — surface these to the user. AFTER you run a `call` result's calls via `use`, call consult ONE more time with a short note on the outcome (what was produced / any failures) — it returns result-aware, Vaaya-grounded next steps to offer the user (the `call` result's `after_running` field reminds you). Call consult whenever you hit a capability gap or the user wants to know what's possible. It does NOT execute or bill — you run returned calls via `use`. ALWAYS show the user consult's `message` and `suggestions` and let them steer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"intent":{"type":"string","description":"Plain-English description of what you want, or your answer to a previous clarify question. Be concrete — include the prompt text, URL, budget, or target the task implies."}},"required":["intent"]}},{"name":"docs","description":"Vaaya's deep reference, FREE and instant. Pass `topic` to get the full playbook for a capability area — exact services, actions, params, prices, model lists, and gotchas — the same reference files the vaaya skill ships. Topics: 'setup' (connecting an agent, a chat app, or an unattended process), 'tools' (exact params of every Vaaya tool, GTM suite included), 'media' (image/video/audio models + product-demo videos), 'gtm' (leads, enrichment, outreach, signals, email), 'research' (OneSearch lanes, deep research, company/market research playbooks), 'data' (scraping, people, social platforms, public records, onchain, compliance), 'compute' (sandboxes, browser automation, files, memory, workers, phone calls, llm). Read the matching topic BEFORE non-trivial work in that area — it is cheaper than a wrong call. Never bills; safe to call any time.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["setup","tools","media","gtm","research","data","compute"],"description":"Which reference to fetch."}},"required":["topic"]}},{"name":"llm","description":"Ask a DIFFERENT LLM a question and get its answer, billed per token from the Vaaya wallet (model cost + 3%, usually a fraction of a cent). Use it to get a second opinion from a rival model, cross-check an answer, summarize a huge blob cheaply, or query a specific model the user names (Kimi, GPT, Gemini, Claude, DeepSeek, and 300+ more). `model` accepts 'auto' (default: short prompts go cheap, long go mid), 'cheap' | 'mid' | 'best' tiers, or any exact OpenRouter slug like 'moonshotai/kimi-k3'. Typical costs: cheap tier well under 0.1 cents, best tier 1-3 cents per call. Not for the conversation you are already having — it is a one-shot ask to another model.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"prompt":{"type":"string","description":"The question or task for the other model."},"model":{"type":"string","description":"'auto' (default), 'cheap', 'mid', 'best', or an exact OpenRouter model slug (e.g. 'moonshotai/kimi-k3', 'anthropic/claude-opus-5')."},"system":{"type":"string","description":"Optional system prompt for the other model."},"max_tokens":{"type":"number","description":"Optional cap on the response length in tokens (default 4096, max 16384)."}},"required":["prompt"]}},{"name":"result","description":"Fetch the status + output of an async job started by `use` (e.g. a video render). Pass the `job_id` that `use` returned with `{ async: true }`. Returns `{ status, result?, progress?, charged_cents }`: `running` (still working — when the job reports it, `progress` carries `{ phase, percent, rendered_frames, total_frames, eta_sec }` and `hint` is a one-line summary like \"rendering 42% (380/900 frames, ~120s left)\", so you can tell real progress from a hang; wait a bit and call again), `succeeded` (`result` holds the output, e.g. the video URL; the call is charged now), or `failed`/`cancelled` (no charge; on `failed`, read `error` AND `hint` — `hint` carries the service's usage notes, which usually explain how to fix the call). Safe to call repeatedly — it never starts new work or double-charges. ALWAYS use this to retrieve an async result instead of re-running `use` (re-running starts a new paid job).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"job_id":{"type":"string","description":"The job_id returned by an async `use` call."}},"required":["job_id"]}},{"name":"session","description":"Run a command or code in an open E2B sandbox session (started by `use` with action `create_session`, which returns a `session_id`). Pass `session_id` plus either `command` (a shell command) or `code` (+ optional `language`: python/javascript/bash). Returns stdout/stderr/exit_code (or the code result). The sandbox stays alive — and billed per second of uptime — until you `close` it; re-running reuses the SAME box, so filesystem + process state persist between calls. ALWAYS `close` when done.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"session_id":{"type":"string","description":"The session_id returned by create_session."},"command":{"type":"string","description":"Shell command to run in the sandbox."},"code":{"type":"string","description":"Code to execute (alternative to `command`)."},"language":{"type":"string","description":"Language for `code`: python (default), javascript, or bash."}},"required":["session_id"]}},{"name":"stocks","description":"Buy tokenized stocks on Base using only the user’s prepaid Vaaya balance, never the welcome credit or the GitHub credit line. Commands: list (supported token tickers), portfolio (owned stocks and buying power), quote {symbol, amount_cents}, buy {symbol, amount_cents, idempotency_key}, order {order_id}. When the user asks to buy a specified stock and dollar amount, resolve its supported token ticker (Apple = AAPLc) and call buy directly; no activation or additional approval step. amount_cents is the maximum total prepaid spend including provider fees. Use a unique idempotency_key for each intended purchase and reuse it on retries. Query order until confirmed/failed; queued/submitted is not success. Do not increase the user’s spend or retry a failed purchase as a new order without instruction. Ask only for missing or ambiguous purchase details. If prepaid_required or buyingPowerCents is insufficient, offer a $10/$30/$100 prepaid pack: POST /api/v1/topup with pack_cents 1000/3000/10000 and the same account bearer token returns a Stripe Checkout url. With authorization for that pack amount, the user’s Instinct agent can pay the URL in its browser using the card saved in Instinct; otherwise give the URL to the user. Vaaya cannot charge Instinct’s card directly. Do not include card details or tokens in a handoff. Check GET /api/v1/wallet wallet.prepaid_cents, then portfolio buyingPowerCents before resuming the same purchase key. A share purchase alone does not authorize a top-up. Stop on needs_review as well as failed.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"command":{"type":"string","enum":["list","portfolio","quote","buy","order"],"description":"list (supported tickers), portfolio (holdings + buying power), quote, buy, or order (status by id)."},"symbol":{"type":"string","description":"Token ticker from list, e.g. AAPLc. Required for quote and buy."},"amount_cents":{"type":"integer","minimum":100,"maximum":1000000,"description":"Maximum prepaid spend in cents, pool fees included. Required for quote and buy."},"idempotency_key":{"type":"string","minLength":8,"maxLength":128,"description":"Unique per intended purchase; reuse it on retries. Required for buy."},"order_id":{"type":"string","description":"Order id returned by buy. Required for order."}},"required":["command"],"additionalProperties":false}},{"name":"use","description":"Execute a single external call, and bill on success. Used for any external capability (image/video/audio generation, web search, scraping, email, document parsing, code sandbox, browser automation, embeddings, etc.). The server validates params against a registered schema and proxies to the upstream — you never pass URLs or API keys. Call it directly when you know the exact (service, action, params, max_cost_cents) — from the vaaya skill's catalog or a call you've made before; when unsure, get the call from `consult` rather than guessing.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"service":{"type":"string","description":"Service identifier, taken verbatim from the call `consult` returned."},"action":{"type":"string","description":"Action within the service (e.g. \"search\", \"generate\", \"create_session\"), taken from the call `consult` returned."},"params":{"type":"object","description":"Parameters from the call `consult` returned, validated against the service's registered schema.","additionalProperties":true},"max_cost_cents":{"type":"number","description":"Hard ceiling in cents on what you will be charged. `use` refuses if the registry price exceeds this. Pick at least 2× the listed price so retries work."},"intent":{"type":"string","description":"Optional: the one-line `why` from the consult call you're running (or the user's goal for it). Used only for internal transaction visibility — it never affects validation, billing, or execution. Pass it through when you have it."}},"required":["service","action","params","max_cost_cents"]}},{"name":"vaaya_account","description":"Show which Vaaya account this connection is linked to and its money state. Returns { email, name, user_id, connected_client, scopes, balance_cents, credit_line, available_cents, credits_url, switch_account }. Call it whenever the user asks \"which account is connected\", \"what's my balance\", \"how much credit is left\", or \"how do I switch accounts\" — and relay the answer. `credit_line` is the credit the account can spend past its prepaid balance (the welcome credit plus any GitHub-score line); `available_cents` = balance + active line, the number calls are gated on.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"vaaya_logout","description":"Disconnect this client from the current Vaaya account: revokes this connection's authorization server-side, so every later call fails with 401 until the user reconnects. Call it when the user asks to log out, sign out, disconnect, or switch Vaaya accounts — then relay the returned switch steps VERBATIM (the browser sign-out step is what actually enables switching accounts).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"vaaya_onboard","description":"Public onboarding hint for an agent whose user isn't linked to Vaaya yet. Returns where the human should go to connect (and sign up if new). Call this when vaaya_test_connection reports needs_auth, or any tool returns unauthorized, then relay the instructions to the user. If the user IS already linked it returns `first_call` instead — show `first_call.show_to_user` as written so they know what to try.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"vaaya_test_connection","description":"Round-trip ping that confirms the agent → Vaaya connection and whether the user is linked. Returns { ok:true, userId, scope, version, server_time, first_call } when linked — SHOW `first_call.show_to_user` to the user as written, it is the same set of starter examples the website and installer give them. Returns { ok:false, needs_auth:true, verification_uri, signup_uri, instructions } when not linked yet — relay that to the user so they can connect (and sign up if new).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}}],"scan":{"score":82,"grade":"B","scanned_at":"2026-09-19T19:10:22.237Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T19:10:22.253Z","components":{"code":{"score":25,"max":25,"notes":["9 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 352ms"]},"poisoning":{"score":13,"max":15,"notes":["13 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 4 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 6 days ago"]},"identity":{"score":6,"max":10,"notes":["namespace and repository owner differ","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool buy: …Buy something for the USER — a physical good, a ticket, a subscription — paid by the user's OWN card, never from their Vaaya balance. First use `setup` to check the Link wallet and shipping address; resolve missing setup once. Prefer guest checkout; when login is required, let the user sign in or sign up in the checkout browser. THE SEAMLESS PATH: once the user has told you what to buy and you have the exact item, merchant page URL and total, call `purchase` { item, merchant, url, total_cents, confirmed: true, confirmation: <the user's own words> } — it approves from their message (under the chat limit), starts buying in the user's cloud browser in the background and returns `message` (\"Hold on — buying it now.\"): RELAY IT, then poll `status` { approval_id } every ~10 seconds and relay its `message` when the status is completed (\"Done — …\"), requires_action (read action_required.reason for the exact blocker) or failed. If `status` says the user's shipping address is missing, ask for it and call `address` { name, line1, line2?, city, state?, postal_code, country, phone? } then `checkout` { approval_id } to resume; if a merchant login is needed, prefer direct browser sign-in; only if the user chooses to save credentials, call `credentials` { merchant, username, password } (stored encrypted, never shown again) then `checkout` again. Other sub-commands: `search` { query } (protocol merchants plus a real web search; the web half bills 5¢), `propose` { item, merchant, total_cents, url?, notes?, confirmed?, confirmation? } (creates an approval; without `confirmed` it returns an approval link the user opens — show its `message` VERBATIM), `checkout` { approval_id, params? } (buys an approved purchase; for a browser merchant it runs in the background like `purchase`). Use the user's existing authorization of the exact item and total; do not ask them to confirm twice. Ask only for missing purchase details. Nothing is ever bought without the user's yes: `checkout` refuses anything else. Use `reconcile` { approval_id } after an uncertain submission: it only inspects the existing checkout and never submits payment. Resume other pauses with the same approval_id; do not recreate a purchase to bypass an unresolved attempt. `charged_cents` is the Vaaya tool fee, NOT a merchant charge; read merchant_payment separately, and never infer a hold or capture from Link approval. Never open `browserbase` sessions yourself to buy something — only `buy` can.…"}],"inputs":{"probes":[{"url":"https://vaaya.ai/mcp","reachable":true,"authRequired":false,"latencyMs":352,"serverInfo":{"name":"vaaya","version":"1.0.0"}}],"packages":[{"registryType":"npm","identifier":"@vaaya/mcp","version":"0.6.8","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":5,"publishedAt":"2026-09-13T17:43:29.633Z","repositoryUrl":"git+https://github.com/vaaya-ai/vaaya-mcp.git","weeklyDownloads":548}],"repo":{"found":true,"owner":"vaaya-ai","repo":"vaaya-mcp","archived":false,"pushedAt":"2026-09-13T17:43:05Z","stars":43,"forks":7,"openIssues":8,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/300715656?v=4","ownerCreatedAt":"2026-07-07T03:26:30Z","license":"MIT"},"icon":{"url":"https://vaaya.ai/icon.png","source":"registry","width":508,"height":512},"presence":{"stars":43,"forks":7,"downloadsWeek":548,"license":"MIT","lastPushAt":"2026-09-13T17:43:05.000Z","score":52}}}},"grade_history":[],"reviews":[]}