{"name":"com.botrecipe/cloudforbots","slug":"botrecipe-cloudforbots","title":"Cloud for Bots","description":"Sandboxes, storage, secrets, queues, timers, locks, inboxes and run ledger for AI bots. One MCP.","url":"https://mcp.market/server/botrecipe-cloudforbots","rating":null,"grade":"C","score":67,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T03:55:59.307Z","last_ok_at":"2026-11-04T03:55:59.307Z","latency_ms":222},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://cloudforbots.com","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://cloudforbots.com/mcp","headers":[{"description":"Bearer <key>. Free key: POST https://cloudforbots.com/api/offer-free","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[],"tools":[{"name":"ai","description":"[bot-ai] Model gateway: call Grok, Claude or GPT with one cloudforbots key. Bring your own provider key, stored first in Secrets (XAI_API_KEY / ANTHROPIC_API_KEY / OPENAI_API_KEY, or key_secret). No markup: the provider bills you. Every call lands in the run ledger.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"model":{"type":"string"},"prompt":{"type":"string"},"messages":{"type":"array","items":{"type":"object"}},"system":{"type":"string"},"max_tokens":{"type":"integer"},"temperature":{"type":"number"},"provider":{"type":"string","enum":["xai","anthropic","openai"]},"key_secret":{"type":"string"},"bot":{"type":"string"},"run_id":{"type":"string"}},"required":["model"]}},{"name":"approve_check_action","description":"[approval-rules] Before a consequential action, ask whether the user's rules auto-approve it. Returns auto_approve, needs_approval (with a plain-English approval card and a link the user can tap) or deny. Free plan is watch-only: it reports what it WOULD decide and logs it for the weekly report, but nothing counts as approved, so ask your user as you normally would.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"object","description":"The action your agent wants to take.","properties":{"type":{"type":"string","description":"Short verb: read, search, draft, send_email, send_message, post, purchase, payment, delete, deploy, change_settings, ..."},"summary":{"type":"string","description":"One plain sentence of what will happen, e.g. \"Buy a $3.99 domain renewal for example.com\"."},"amount_usd":{"type":"number","description":"Money involved, if any."},"target":{"type":"string","description":"Who or what it touches: a recipient email, domain, file, repo."},"reversible":{"type":"boolean","description":"Can it be undone easily?"}},"required":["type","summary"]}},"required":["action"]}},{"name":"approve_get_decision","description":"[approval-rules] Check whether the user approved or rejected an approval card (by card_id and card_token). Only act when status is approved.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"card_id":{"type":"string"},"card_token":{"type":"string"}},"required":["card_id","card_token"]}},{"name":"approve_get_rules","description":"[approval-rules] Show the rules in effect for your key (or the default starter rules).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"approve_set_rules","description":"[approval-rules] Save the user's rules (needs an API key so they stay yours). Each rule: {name, when:{type:[...], max_usd, min_usd, reversible, target_ends_with:[...]}, verdict:\"auto\"|\"ask\"|\"deny\"}. First matching rule wins; anything unmatched needs approval. Call once without confirm to preview, then with confirm=true.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object"}},"confirm":{"type":"boolean"}},"required":["rules"]}},{"name":"approve_usage_and_upgrade","description":"[approval-rules] Show today's usage for your key or IP and the $49/month All Access upgrade link (cloudforbots.com/offer). Free tier: 200 calls/day. Not metered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"approve_weekly_report","description":"[approval-rules] Draft a plain-English report of the last 7 days: actions checked, how many your rules would auto-approve, how many needed you, top kinds of asks, and rule suggestions. Read-only; sends nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"browser","description":"[bot-browser] A real headless Chrome per named session that pauses instead of dying: logins, cookies and tabs survive between calls and across days. Actions: open (url), run (steps: [{goto:url},{click:selector},{fill:{selector,value}},{type:{selector,text}},{press:key},{select:{selector,value}},{wait_for:selector},{wait_ms:n},{scroll:n},{back:true},{extract:selector},{eval:js},{screenshot:true},{clear_cookies:true}], screenshot?), screenshot, pause, kill, list. Returns url, title, page text and links. fill values can be {{secret:NAME}} (typed only on that secret's allowed hosts, redacted from replies). Stuck on 2FA? action handoff (kind, note, fill: selector, submit?) asks a person via Human Handoff, waits, and types the code into the page without returning it. Uses the sandbox allowance (3 live, 60 min/day free).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["open","run","screenshot","pause","kill","list","handoff"]},"session":{"type":"string"},"kind":{"type":"string"},"note":{"type":"string"},"fill":{"type":"string"},"submit":{"type":"boolean"},"wait_s":{"type":"integer"},"url":{"type":"string"},"steps":{"type":"array","items":{"type":"object"}},"screenshot":{"type":"boolean"},"text":{"type":"boolean"},"links":{"type":"boolean"},"max_text":{"type":"integer"}},"required":["action"]}},{"name":"budget_budget_status","description":"[budget-guard] See spend vs limits, remaining budget, whether the run is stopped and why, and the last 20 ledger events. Set close=true when the run finishes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"handle":{"type":"string","description":"The budget handle from open_budget (looks like bg_<id>.<secret>). Pass it to every sub-agent so they all spend from the same budget."},"close":{"type":"boolean"}},"required":["handle"]}},{"name":"budget_open_budget","description":"[budget-guard] Open a hard budget for one agent run before it starts: max dollars, tokens, calls and/or wall-clock seconds. Returns a handle. Give the handle to every sub-agent; they all draw from the same ledger, so one runaway loop or fork cannot exceed the run cap.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"label":{"type":"string","description":"What this run is for, e.g. \"nightly code cleanup\"."},"max_usd":{"type":"number","description":"Dollar cap for the whole run (your own estimates per call)."},"max_tokens":{"type":"integer","description":"Token cap (input + output) for the whole run."},"max_calls":{"type":"integer","description":"Cap on model/tool calls for the whole run."},"max_seconds":{"type":"integer","description":"Wall-clock cap in seconds from now."},"ttl_hours":{"type":"integer","description":"Handle lifetime (free max 24, Pro max 168). Default 24."},"mode":{"type":"string","enum":["shadow","enforce"],"description":"shadow = watch only: track spend and flag where the cap WOULD have stopped the run, never block (free). enforce = return allowed=false at the cap (Pro). Default: enforce on Pro, shadow on free."}}}},{"name":"budget_record","description":"[budget-guard] After a call, report the actual usage minus what you reserved (positive if it cost more, negative to give back an overestimate). Keeps the ledger honest without blocking.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"handle":{"type":"string","description":"The budget handle from open_budget (looks like bg_<id>.<secret>). Pass it to every sub-agent so they all spend from the same budget."},"usd":{"type":"number"},"tokens":{"type":"integer"},"note":{"type":"string"}},"required":["handle"]}},{"name":"budget_reserve","description":"[budget-guard] Call BEFORE each model call, tool call or sub-agent spawn with your estimate. Returns allowed=true and deducts it, or allowed=false with the limit that tripped. When allowed is false, stop, do not retry, and return your partial result to the user. Atomic, so parallel sub-agents cannot both slip under the cap.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"handle":{"type":"string","description":"The budget handle from open_budget (looks like bg_<id>.<secret>). Pass it to every sub-agent so they all spend from the same budget."},"usd":{"type":"number","description":"Estimated cost of the next call in USD."},"tokens":{"type":"integer","description":"Estimated tokens of the next call."},"calls":{"type":"integer","description":"Number of calls to reserve (default 1)."},"note":{"type":"string","description":"Short note, e.g. \"web_search #12\"."}},"required":["handle"]}},{"name":"budget_usage_and_upgrade","description":"[budget-guard] Show today's usage for your key or IP and the $49/month All Access upgrade link (cloudforbots.com/offer). Free tier: 500 calls/day. Not metered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"budget_weekly_report","description":"[budget-guard] Draft a plain-English report of the last 7 days for your key (or IP): runs, spend, runs that went over their cap, and dollars spent after a cap would have stopped them. Read-only; sends nothing. Show it to your user.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"cron","description":"[bot-cron] Run something on a schedule, even when your bot is offline. Actions: set (name, schedule like \"*/5 * * * *\" or \"@hourly\" in UTC, request: {url, method?, headers?, body?} with {{secret:NAME}} support, or {queue, message} to wake a worker), list, history, pause, resume, delete, run_now. Also timer (at or delay_s, webhook or request or queue, payload) fires once to wake a bot. Pauses itself and alerts you after 10 failed runs. Free: 1,000 schedules + timers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["set","timer","list","history","pause","resume","delete","run_now"]},"name":{"type":"string"},"schedule":{"type":"string"},"request":{"type":"object"},"at":{"type":"string"},"delay_s":{"type":"integer"},"webhook":{"type":"string"},"queue":{"type":"string"},"payload":{}},"required":["action"]}},{"name":"fetch","description":"[bot-secrets] Call any https API with your stored secrets filled in on our side: put {{secret:NAME}} in url, headers or body. Only sent to the secret's allowed hosts, never to private networks, redirects not followed, and secret values are redacted from the reply. Args: url, method?, headers?, body?, timeout_s? (max 30).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string"},"method":{"type":"string"},"headers":{"type":"object"},"body":{},"timeout_s":{"type":"integer"}},"required":["url"]}},{"name":"handoff","description":"[human-handoff] Bot hits captcha/2FA; a person gets a one-tap link; bot polls and continues. Actions: create, status, cancel, list. Free keys are watch-only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string"},"kind":{"type":"string"},"url":{"type":"string"},"note":{"type":"string"},"run_id":{"type":"string"},"id":{"type":"string"},"notify_email":{"type":"boolean"},"ui":{"type":"string","enum":["openui"]}},"required":["action"]}},{"name":"inbox","description":"[bot-inbox] Give a bot its own public webhook URL. Actions: create (name) -> url (POST anything there: webhooks, forms, other bots); list; delete. Events land in queue inbox.<name>: read them with the queue tool (pull, then ack). Create again to rotate the URL. Free: 50 inboxes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["create","list","delete"]},"name":{"type":"string"}},"required":["action"]}},{"name":"ledger","description":"[bot-ledger] Run ledger and cost view across all your bots. Actions: record (bot, status ok|failed|running|skipped, run_id?, kind?, usd?, tokens_in?, tokens_out?, model?, ms?, note?), feed (since?, bot?, status?, limit?) = one feed of bot runs, Agent Cost Log costs and failed API calls, rollup (days?) = per day per bot runs, failures and USD.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["record","feed","rollup"]},"bot":{"type":"string"},"status":{"type":"string"},"run_id":{"type":"string"},"kind":{"type":"string"},"usd":{"type":"number"},"tokens_in":{"type":"integer"},"tokens_out":{"type":"integer"},"model":{"type":"string"},"ms":{"type":"integer"},"note":{"type":"string"},"since":{"type":"string"},"limit":{"type":"integer"},"days":{"type":"integer"}},"required":["action"]}},{"name":"library_get","description":"[bot-library] Read one library entry (recipe, tools, version, signature, install and success counts). Args: slug.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"]}},{"name":"library_install","description":"[bot-library] Clone a library bot into this bot: returns the recipe steps, tools, prompt and memory_seed to run now. Counts one install per account. Args: slug.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"]}},{"name":"library_publish","description":"[bot-library] Publish or update (new version) a reusable bot recipe. The publishing key owns and signs it. Blocked automatically if it contains keys, tokens, emails or phone numbers; use {{secret:NAME}} placeholders. Args: slug (3-48 lowercase/dashes), data {name, summary, steps[], tools?[], tags?[], prompt?, memory_seed?, handoff_inbox?, forked_from?, works_with?[]}.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string"},"data":{"type":"object"}},"required":["slug","data"]}},{"name":"library_rate","description":"[bot-library] After running an installed recipe, report whether it worked. This is what ranks the library. Args: slug, ok (boolean).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string"},"ok":{"type":"boolean"}},"required":["slug","ok"]}},{"name":"library_report","description":"[bot-library] Report a broken, unsafe or spammy entry. 3 reports from different accounts pause it automatically. Args: slug, reason.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string"},"reason":{"type":"string"}},"required":["slug"]}},{"name":"library_search","description":"[bot-library] Find bot recipes other bots published, ranked by real installs and reported success. Args: q?, limit? (max 50). No key needed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string"},"limit":{"type":"integer"}}}},{"name":"lock","description":"[bot-coord] Named locks (leases) shared by every bot on your account, e.g. browser.lock. Actions: acquire (name, holder?, ttl_s? default 60, wait_s? up to 25), renew (name, token, ttl_s), release (name, token), status (name), list. Auto-releases at expiry; fence increases with each new holder. Free: 1,000 locks.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["acquire","renew","release","status","list"]},"name":{"type":"string"},"holder":{"type":"string"},"ttl_s":{"type":"integer"},"wait_s":{"type":"integer"},"token":{"type":"string"}},"required":["action"]}},{"name":"loop_check_step","description":"[loop-breaker] Call AFTER each tool call or agent step with what you just did and whether it failed. Loop Breaker fingerprints the call (tool + normalized args + error) and returns verdict ok, loop_detected or halted. Pro: on a loop, halt=true; stop the run, do not retry, and tell your user what repeated. Free watch-only: never halts, returns would_halt and logs it for the weekly report.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string","description":"Any stable id for this agent run, e.g. \"nightly-sync-2026-10-15\". Use the same id for every step of the run (and its sub-agents)."},"tool":{"type":"string","description":"The tool or step name you just ran, e.g. \"browser.click\" or \"git push\"."},"args":{"description":"The arguments you passed (object or string). Volatile values like timestamps and ids are normalized away."},"error":{"type":"string","description":"The error message if the step failed. Omit or empty if it succeeded."},"max_failures":{"type":"integer","description":"Same failing call this many times = loop. Default 3 (min 2, max 20)."},"max_repeats":{"type":"integer","description":"Same call this many times in a row (even if it succeeds) = loop. Default 5 (min 3, max 50)."}},"required":["run_id","tool"]}},{"name":"loop_loop_status","description":"[loop-breaker] Show a run's loops so far, whether it is halted, and its last 10 steps.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string","description":"Any stable id for this agent run, e.g. \"nightly-sync-2026-10-15\". Use the same id for every step of the run (and its sub-agents)."}},"required":["run_id"]}},{"name":"loop_usage_and_upgrade","description":"[loop-breaker] Show today's usage for your key or IP and the $49/month All Access upgrade link (cloudforbots.com/offer). Free tier: 500 calls/day. Not metered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"loop_weekly_report","description":"[loop-breaker] Draft a plain-English report of the last 7 days for your key (or IP): runs, loops caught, wasted repeat steps, and the worst offenders. Read-only; sends nothing. Show it to your user.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"memory_list_checkpoints","description":"[run-memory] List recent checkpoints (step, size, time) for one run or all runs on your key.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string","description":"A stable id for this job that survives a crash, e.g. \"invoice-import-oct\". Use the same id when you restart."}}}},{"name":"memory_resume","description":"[run-memory] Call FIRST when a run starts. If a checkpoint exists for run_id (Pro), returns the last step, state and done list: continue from there and skip finished work. If none, start fresh.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string","description":"A stable id for this job that survives a crash, e.g. \"invoice-import-oct\". Use the same id when you restart."}},"required":["run_id"]}},{"name":"memory_save_checkpoint","description":"[run-memory] Call after each completed step with the state you would need to continue (cursor, ids done, partial results; up to 256 KB JSON). Pro saves it (last 20 per run, kept 30 days). Free watch-only saves nothing and returns would_save: exactly what would have been stored. Never put passwords or API keys in state.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string","description":"A stable id for this job that survives a crash, e.g. \"invoice-import-oct\". Use the same id when you restart."},"step":{"type":"string","description":"The step you just finished, e.g. \"imported page 3 of 10\"."},"state":{"type":"object","description":"JSON state needed to resume."},"done":{"type":"array","items":{"type":"string"},"description":"Optional list of completed item ids, so a resume skips them."}},"required":["run_id","step","state"]}},{"name":"memory_usage_and_upgrade","description":"[run-memory] Show today's usage for your key or IP and the $49/month All Access upgrade link (cloudforbots.com/offer). Free tier: 500 calls/day. Not metered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"memory_weekly_report","description":"[run-memory] Draft a plain-English report of the last 7 days: runs, checkpoints saved (Pro) or that would have been saved (free). Read-only; sends nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"queue","description":"[bot-queue] Durable job queues for bots. Actions: push (queue, message or messages[], delay_s?, max_attempts?), pull (queue, max<=10, visibility_s?), ack (ids), nack (ids, delay_s?, error?), stats, dead, retry_dead, purge (dead_only?). At-least-once: ack when done or the message returns after visibility_s; after max_attempts it moves to dead letters. Free: 1,000 queues, 10,000 pushes/day.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["push","pull","ack","nack","stats","dead","retry_dead","purge"]},"queue":{"type":"string"},"message":{},"messages":{"type":"array"},"delay_s":{"type":"integer"},"max_attempts":{"type":"integer"},"max":{"type":"integer"},"visibility_s":{"type":"integer"},"ids":{"type":"array","items":{"type":"integer"}},"error":{"type":"string"}},"required":["action"]}},{"name":"rate","description":"[bot-coord] Shared rate counters across all your bots, e.g. \"6 posts per 6h across all lanes\". Actions: take (name, limit like \"6/6h\", n?) -> allowed, remaining, retry_after_s; peek (name, limit); list. Sliding window. Free: 200 counters.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["take","peek","list"]},"name":{"type":"string"},"limit":{"type":"string"},"n":{"type":"integer"}},"required":["action"]}},{"name":"replay","description":"[run-replay] Timeline of a run: steps, loops, checkpoints, spend, stop point. Pass run_id; omit to list recent runs. Set ui=openui for a live card.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"run_id":{"type":"string"},"ui":{"type":"string","enum":["openui"]}}}},{"name":"report","description":"[daily-report] Opt-in daily owner summary (loops stopped, spend blocked, approvals waiting). Actions: subscribe, unsubscribe, preview.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string"},"email":{},"webhook_url":{"type":"string"},"ui":{"type":"string","enum":["openui"]}}}},{"name":"sandbox","description":"[bot-sandbox] A named Linux sandbox (Python, Node, shell, internet) that pauses instead of dying: files, installed packages and running processes survive between calls and across days. Actions: run (cmd, cwd?, timeout_s? up to 120, background?), write_file (path, content or content_base64), read_file (path), sync_from_store (ns?, prefix?, dir? = /home/user/store: copy your stored files in), sync_to_store (dir?, ns?, prefix?: save changed files back), run with secrets: [\"NAME\"] to call APIs from code via $CFB_FETCH_URL + $CFB_FETCH_TOKEN without the value ever entering the sandbox, status, pause, kill, list. Created on first use; auto-pauses after 1 idle minute; resumes in about a second. Free: 3 sandboxes, 60 run-minutes/day.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["run","write_file","read_file","sync_from_store","sync_to_store","status","pause","kill","list"]},"name":{"type":"string"},"ns":{"type":"string"},"prefix":{"type":"string"},"dir":{"type":"string"},"secrets":{"type":"array","items":{"type":"string"},"description":"run only: secret names this command may use via $CFB_FETCH_URL with Authorization: Bearer $CFB_FETCH_TOKEN and {{secret:NAME}}; values never enter the sandbox"},"cmd":{"type":"string"},"cwd":{"type":"string"},"timeout_s":{"type":"integer"},"background":{"type":"boolean"},"path":{"type":"string"},"content":{"type":"string"},"content_base64":{"type":"string"}},"required":["action"]}},{"name":"secrets","description":"[bot-secrets] Store API keys and tokens once; your bot never sees them again. Actions: set (name in UPPER_SNAKE_CASE, value, allowed_hosts like [\"api.openai.com\"]), list (names only, never values), delete. Use them with the fetch tool as {{secret:NAME}}. Free: 25 secrets.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["set","list","delete"]},"name":{"type":"string"},"value":{"type":"string"},"allowed_hosts":{"type":"array","items":{"type":"string"}}},"required":["action"]}},{"name":"store","description":"[bot-storage] Durable key-value + file storage for your bot, shared by every key on your account. Survives sandbox restarts. Actions: get, set (value: any JSON, ttl_seconds?, if_version? for compare-and-set), incr (by?), delete, list (prefix?, after?, limit?), file_put (name, content_base64, content_type?), file_get, file_meta, file_delete, file_list, usage. ns = namespace (default \"default\"). Free: 100 MB, 100k items, values up to 256 KB, files up to 4 MB.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["get","set","incr","delete","list","file_put","file_get","file_meta","file_delete","file_list","usage"]},"ns":{"type":"string"},"key":{"type":"string"},"value":{},"ttl_seconds":{"type":"integer"},"if_version":{"type":"integer"},"by":{"type":"number"},"prefix":{"type":"string"},"after":{"type":"string"},"limit":{"type":"integer"},"name":{"type":"string"},"content_base64":{"type":"string"},"content_type":{"type":"string"}},"required":["action"]}},{"name":"topic","description":"[bot-bus] Agent-to-agent message bus. Actions: subscribe (topic, queue), unsubscribe, publish (topic, message or messages, from?), list. publish copies each message into every subscribed queue, so a handoff waits safely while the receiving bot sleeps; it reads with the queue tool and acks. Free: 500 subscriptions.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["subscribe","unsubscribe","publish","list"]},"topic":{"type":"string"},"queue":{"type":"string"},"message":{},"messages":{"type":"array"},"from":{"type":"string"}},"required":["action"]}},{"name":"vault","description":"[login-vault] Sign-in sessions without the bot seeing passwords. Actions: put, list, delete, login, fetch, end, watch (free watch-only).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"},"url":{"type":"string"},"form":{"type":"object"},"session":{"type":"string"},"note":{"type":"string"},"ui":{"type":"string","enum":["openui"]}},"required":["action"]}},{"name":"wake_cancel_wake","description":"[agent-wake] Cancel a pending wake-up by wake_id. Call once without confirm to preview, then with confirm=true.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"wake_id":{"type":"string"},"inbox":{"type":"string","description":"Your private inbox name (12+ chars, keep it secret, reuse it every session). Optional if you send an API key: then the key is your inbox."},"confirm":{"type":"boolean"}},"required":["wake_id"]}},{"name":"wake_check_wakes","description":"[agent-wake] Collect wake-ups that are due for your inbox (each returned once, with its saved state and thread ID) and list upcoming ones. Call this at the start of a session.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"inbox":{"type":"string","description":"Your private inbox name (12+ chars, keep it secret, reuse it every session). Optional if you send an API key: then the key is your inbox."}}}},{"name":"wake_schedule_wake","description":"[agent-wake] Schedule a wake-up for your agent. At the time you pick, Agent Wake POSTs your saved state (notes, thread ID, next step) to your callback URL, or holds it for check_wakes. Use it so a later, fresh session picks up where this one stopped. Call once without confirm to preview what will be saved, show the user, then call again with confirm=true.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"when":{"type":"string","description":"When to wake: \"in 30 minutes\", \"in 2 hours\", \"in 3 days\", or an ISO time like 2026-10-16T14:00:00Z. Between 1 minute and 365 days out."},"repeat_minutes":{"type":"integer","description":"Optional. Repeat every N minutes after the first wake (free: 60+, Pro: 5+)."},"state":{"type":"object","description":"What your future session needs: goal, progress, next step, IDs. Free up to 8 KB, Pro up to 64 KB."},"thread_id":{"type":"string","description":"Optional conversation or task ID to resume."},"callback_url":{"type":"string","description":"Optional public https URL to POST the wake to (for example your agent runner webhook). Without it, collect wakes with check_wakes."},"inbox":{"type":"string","description":"Your private inbox name (12+ chars, keep it secret, reuse it every session). Optional if you send an API key: then the key is your inbox."},"confirm":{"type":"boolean","description":"false or missing = preview only, nothing saved. true = save the wake."}},"required":["when"]}},{"name":"wake_usage_and_upgrade","description":"[agent-wake] Show today's usage for your key or IP and the $49/month All Access upgrade link. Free tier: 50 calls/day. Not metered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}}],"scan":{"score":67,"grade":"C","scanned_at":"2026-10-16T17:04:47.460Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-16T17:04:47.344Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 638ms"]},"poisoning":{"score":15,"max":15,"notes":["48 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://cloudforbots.com/mcp","reachable":true,"authRequired":false,"latencyMs":638,"serverInfo":{"name":"cloud-for-bots","version":"1.0.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://cloudforbots.com/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}