{"serverId":"mcp-registry/com.botrecipe/cloudforbots","tools":[{"name":"approve_check_action","fixed":{"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.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"object","required":["type","summary"],"properties":{"type":{"type":"string","description":"Short verb: read, search, draft, send_email, send_message, post, purchase, payment, delete, deploy, change_settings, ..."},"target":{"type":"string","description":"Who or what it touches: a recipient email, domain, file, repo."},"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."},"reversible":{"type":"boolean","description":"Can it be undone easily?"}},"description":"The action your agent wants to take."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"approval-rules: check_action"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":322,"tokensAfter":322},{"name":"approve_get_decision","fixed":{"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.","inputSchema":{"type":"object","required":["card_id","card_token"],"properties":{"card_id":{"type":"string"},"card_token":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"approval-rules: get_decision"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"approve_get_rules","fixed":{"name":"approve_get_rules","description":"[approval-rules] Show the rules in effect for your key (or the default starter rules).","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"approval-rules: get_rules"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":50,"tokensAfter":50},{"name":"approve_set_rules","fixed":{"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.","inputSchema":{"type":"object","required":["rules"],"properties":{"rules":{"type":"array","items":{"type":"object"}},"confirm":{"type":"boolean"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"approval-rules: set_rules"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":145,"tokensAfter":145},{"name":"approve_usage_and_upgrade","fixed":{"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.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"approval-rules: usage_and_upgrade"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":73,"tokensAfter":73},{"name":"approve_weekly_report","fixed":{"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.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"approval-rules: weekly_report"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":86,"tokensAfter":86},{"name":"browser","fixed":{"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 ","inputSchema":{"type":"object","required":["action"],"properties":{"url":{"type":"string"},"fill":{"type":"string"},"kind":{"type":"string"},"note":{"type":"string"},"text":{"type":"boolean"},"links":{"type":"boolean"},"steps":{"type":"array","items":{"type":"object"}},"action":{"enum":["open","run","screenshot","pause","kill","list","handoff"],"type":"string"},"submit":{"type":"boolean"},"wait_s":{"type":"integer"},"session":{"type":"string"},"max_text":{"type":"integer"},"screenshot":{"type":"boolean"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":291,"tokensAfter":291},{"name":"budget_budget_status","fixed":{"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.","inputSchema":{"type":"object","required":["handle"],"properties":{"close":{"type":"boolean"},"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."}}},"annotations":{"readOnlyHint":true},"title":"budget-guard: budget_status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":133,"tokensAfter":133},{"name":"cron","fixed":{"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.","inputSchema":{"type":"object","required":["action"],"properties":{"at":{"type":"string"},"name":{"type":"string"},"queue":{"type":"string"},"action":{"enum":["set","timer","list","history","pause","resume","delete","run_now"],"type":"string"},"delay_s":{"type":"integer"},"payload":{"type":"string"},"request":{"type":"object"},"webhook":{"type":"string"},"schedule":{"type":"string"}}}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: payload. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":245,"tokensAfter":249},{"name":"fetch","fixed":{"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).","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"body":{"type":"string"},"method":{"type":"string"},"headers":{"type":"object"},"timeout_s":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: body. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":155},{"name":"library_get","fixed":{"name":"library_get","description":"[bot-library] Read one library entry (recipe, tools, version, signature, install and success counts). Args: slug.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":68,"tokensAfter":68},{"name":"library_publish","fixed":{"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?[]}.","inputSchema":{"type":"object","required":["slug","data"],"properties":{"data":{"type":"object"},"slug":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":150,"tokensAfter":150},{"name":"library_search","fixed":{"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.","inputSchema":{"type":"object","properties":{"q":{"type":"string"},"limit":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":78,"tokensAfter":78},{"name":"loop_check_step","fixed":{"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.","inputSchema":{"type":"object","required":["run_id","tool"],"properties":{"args":{"description":"The arguments you passed (object or string). Volatile values like timestamps and ids are normalized away.","type":"string"},"tool":{"type":"string","description":"The tool or step name you just ran, e.g. \"browser.click\" or \"git push\"."},"error":{"type":"string","description":"The error message if the step failed. Omit or empty if it succeeded."},"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)."},"max_repeats":{"type":"integer","description":"Same call this many times in a row (even if it succeeds) = loop. Default 5 (min 3, max 50)."},"max_failures":{"type":"integer","description":"Same failing call this many times = loop. Default 3 (min 2, max 20)."}}},"annotations":{"readOnlyHint":true},"title":"loop-breaker: check_step"},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: args. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":362,"tokensAfter":367},{"name":"loop_loop_status","fixed":{"name":"loop_loop_status","description":"[loop-breaker] Show a run's loops so far, whether it is halted, and its last 10 steps.","inputSchema":{"type":"object","required":["run_id"],"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)."}}},"annotations":{"readOnlyHint":true},"title":"loop-breaker: loop_status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"memory_list_checkpoints","fixed":{"name":"memory_list_checkpoints","description":"[run-memory] List recent checkpoints (step, size, time) for one run or all runs on your key.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"run-memory: list_checkpoints"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":96,"tokensAfter":96},{"name":"memory_resume","fixed":{"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.","inputSchema":{"type":"object","required":["run_id"],"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"run-memory: resume"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":127,"tokensAfter":127},{"name":"memory_save_checkpoint","fixed":{"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.","inputSchema":{"type":"object","required":["run_id","step","state"],"properties":{"done":{"type":"array","items":{"type":"string"},"description":"Optional list of completed item ids, so a resume skips them."},"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."},"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."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"run-memory: save_checkpoint"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":252,"tokensAfter":252},{"name":"memory_usage_and_upgrade","fixed":{"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.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"run-memory: usage_and_upgrade"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":72,"tokensAfter":72},{"name":"memory_weekly_report","fixed":{"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.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"run-memory: weekly_report"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":70,"tokensAfter":70},{"name":"queue","fixed":{"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.","inputSchema":{"type":"object","required":["action"],"properties":{"ids":{"type":"array","items":{"type":"integer"}},"max":{"type":"integer"},"error":{"type":"string"},"queue":{"type":"string"},"action":{"enum":["push","pull","ack","nack","stats","dead","retry_dead","purge"],"type":"string"},"delay_s":{"type":"integer"},"message":{"type":"string"},"messages":{"type":"array"},"max_attempts":{"type":"integer"},"visibility_s":{"type":"integer"}}}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: message. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":239,"tokensAfter":243},{"name":"report","fixed":{"name":"report","description":"[daily-report] Opt-in daily owner summary (loops stopped, spend blocked, approvals waiting). Actions: subscribe, unsubscribe, preview.","inputSchema":{"type":"object","properties":{"ui":{"enum":["openui"],"type":"string"},"email":{"type":"string"},"action":{"type":"string"},"webhook_url":{"type":"string"}}}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: email. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":91,"tokensAfter":95},{"name":"store","fixed":{"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.","inputSchema":{"type":"object","required":["action"],"properties":{"by":{"type":"number"},"ns":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"after":{"type":"string"},"limit":{"type":"integer"},"value":{"type":"string"},"action":{"enum":["get","set","incr","delete","list","file_put","file_get","file_meta","file_delete","file_list","usage"],"type":"string"},"prefix":{"type":"string"},"if_version":{"type":"integer"},"ttl_seconds":{"type":"integer"},"content_type":{"type":"string"},"content_base64":{"type":"string"}}}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: value. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":285,"tokensAfter":289},{"name":"topic","fixed":{"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.","inputSchema":{"type":"object","required":["action"],"properties":{"from":{"type":"string"},"queue":{"type":"string"},"topic":{"type":"string"},"action":{"enum":["subscribe","unsubscribe","publish","list"],"type":"string"},"message":{"type":"string"},"messages":{"type":"array"}}}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: message. Change to number/boolean/array where that's what you accept.","verify":true}],"tokensBefore":171,"tokensAfter":175},{"name":"wake_cancel_wake","fixed":{"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.","inputSchema":{"type":"object","required":["wake_id"],"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."},"confirm":{"type":"boolean"},"wake_id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"title":"agent-wake: cancel_wake"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":129,"tokensAfter":129},{"name":"wake_check_wakes","fixed":{"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.","inputSchema":{"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."}}},"annotations":{"readOnlyHint":true},"title":"agent-wake: check_wakes"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"wake_schedule_wake","fixed":{"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.","inputSchema":{"type":"object","required":["when"],"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."},"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."},"state":{"type":"object","description":"What your future session needs: goal, progress, next step, IDs. Free up to 8 KB, Pro up to 64 KB."},"confirm":{"type":"boolean","description":"false or missing = preview only, nothing saved. true = save the wake."},"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."},"repeat_minutes":{"type":"integer","description":"Optional. Repeat every N minutes after the first wake (free: 60+, Pro: 5+)."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"agent-wake: schedule_wake"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":413,"tokensAfter":413}],"toolsChanged":27,"tokensSaved":0,"todo":[{"tool":"ai","params":["bot","model","prompt","run_id","system","messages","provider","key_secret","max_tokens","temperature"]},{"tool":"approve_get_decision","params":["card_id","card_token"]},{"tool":"approve_set_rules","params":["rules","confirm"]},{"tool":"browser","params":["url","fill","kind","note","text","links","steps","action","submit","wait_s","session","max_text","screenshot"]},{"tool":"budget_budget_status","params":["close"]},{"tool":"budget_record","params":["usd","note","tokens"]},{"tool":"cron","params":["at","name","queue","action","delay_s","payload","request","webhook","schedule"]},{"tool":"fetch","params":["url","body","method","headers","timeout_s"]},{"tool":"handoff","params":["id","ui","url","kind","note","action","run_id","notify_email"]},{"tool":"inbox","params":["name","action"]},{"tool":"ledger","params":["ms","bot","usd","days","kind","note","limit","model","since","action","run_id","status","tokens_in","tokens_out"]},{"tool":"library_get","params":["slug"]},{"tool":"library_install","params":["slug"]},{"tool":"library_publish","params":["data","slug"]},{"tool":"library_rate","params":["ok","slug"]},{"tool":"library_report","params":["slug","reason"]},{"tool":"library_search","params":["q","limit"]},{"tool":"lock","params":["name","token","ttl_s","action","holder","wait_s"]},{"tool":"queue","params":["ids","max","error","queue","action","delay_s","message","messages","max_attempts","visibility_s"]},{"tool":"rate","params":["n","name","limit","action"]},{"tool":"replay","params":["ui","run_id"]},{"tool":"report","params":["ui","email","action","webhook_url"]},{"tool":"sandbox","params":["ns","cmd","cwd","dir","name","path","action","prefix","content","timeout_s","background","content_base64"]},{"tool":"secrets","params":["name","value","action","allowed_hosts"]},{"tool":"store","params":["by","ns","key","name","after","limit","value","action","prefix","if_version","ttl_seconds","content_type","content_base64"]},{"tool":"topic","params":["from","queue","topic","action","message","messages"]},{"tool":"vault","params":["ui","url","form","name","note","action","domain","session"]},{"tool":"wake_cancel_wake","params":["confirm","wake_id"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}