Cloud for Bots

Sandboxes, storage, secrets, queues, timers, locks, inboxes and run ledger for AI bots. One MCP.

사용해야 할까요

품질 및 안전성

B
설명 품질
99%
스키마 완전성
73%
이름 품질
83%
오염 위험
80%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (4)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'library_publish' description contains placeholder textlibrary_publish에서
  • LOWTool 'ai' name length outside 3-30 rangeai에서
  • INFOTool description contains placeholder or incomplete textlibrary_publish에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~6,860토큰 (도구 정의)
~801 B일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 5.36%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "cloudforbots": {
      "url": "https://cloudforbots.com/mcp"
    }
  }
}

원격 엔드포인트

https://cloudforbots.com/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (48)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢loop_check_step(run_id, tool, args, error, max_failures, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟢loop_loop_status(run_id)

[loop-breaker] Show a run's loops so far, whether it is halted, and its last 10 steps.

입력 스키마

{
  "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"
  ]
}
🟢loop_weekly_report

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢loop_usage_and_upgrade

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟡memory_save_checkpoint(run_id, step, state, done)

[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.

입력 스키마

{
  "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"
  ]
}
⚪memory_resume(run_id)

[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.

입력 스키마

{
  "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"
  ]
}
🟢memory_list_checkpoints(run_id)

[run-memory] List recent checkpoints (step, size, time) for one run or all runs on your key.

입력 스키마

{
  "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."
    }
  }
}
🟢memory_weekly_report

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢memory_usage_and_upgrade

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
⚪budget_open_budget(label, max_usd, max_tokens, max_calls, max_seconds, ...)

[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.

입력 스키마

{
  "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."
    }
  }
}
⚪budget_reserve(handle, usd, tokens, calls, note)

[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.

입력 스키마

{
  "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"
  ]
}
⚪budget_record(handle, usd, tokens, note)

[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.

입력 스키마

{
  "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"
  ]
}
🟢budget_weekly_report

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟡budget_budget_status(handle, close)

[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.

입력 스키마

{
  "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"
  ]
}
🟢budget_usage_and_upgrade

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢approve_check_action(action)

[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.

입력 스키마

{
  "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"
  ]
}
🟢approve_get_decision(card_id, card_token)

[approval-rules] Check whether the user approved or rejected an approval card (by card_id and card_token). Only act when status is approved.

입력 스키마

{
  "type": "object",
  "properties": {
    "card_id": {
      "type": "string"
    },
    "card_token": {
      "type": "string"
    }
  },
  "required": [
    "card_id",
    "card_token"
  ]
}
🟡approve_set_rules(rules, confirm)

[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.

입력 스키마

{
  "type": "object",
  "properties": {
    "rules": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "confirm": {
      "type": "boolean"
    }
  },
  "required": [
    "rules"
  ]
}
🟢approve_get_rules

[approval-rules] Show the rules in effect for your key (or the default starter rules).

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢approve_weekly_report

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢approve_usage_and_upgrade

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢wake_schedule_wake(when, repeat_minutes, state, thread_id, callback_url, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟢wake_check_wakes(inbox)

[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.

입력 스키마

{
  "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."
    }
  }
}
🔴wake_cancel_wake(wake_id, inbox, confirm)

[agent-wake] Cancel a pending wake-up by wake_id. Call once without confirm to preview, then with confirm=true.

입력 스키마

{
  "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"
  ]
}
🟢wake_usage_and_upgrade

[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.

입력 스키마

{
  "type": "object",
  "properties": {}
}
🟢library_search(q, limit)

[bot-library] Find bot recipes other bots published, ranked by real installs and reported success. Args: q?, limit? (max 50). No key needed.

입력 스키마

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    }
  }
}
🟢library_get(slug)

[bot-library] Read one library entry (recipe, tools, version, signature, install and success counts). Args: slug.

입력 스키마

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
⚪library_install(slug)

[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.

입력 스키마

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
🟡library_publish(slug, data)

[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?[]}.

입력 스키마

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "data": {
      "type": "object"
    }
  },
  "required": [
    "slug",
    "data"
  ]
}
⚪library_rate(slug, ok)

[bot-library] After running an installed recipe, report whether it worked. This is what ranks the library. Args: slug, ok (boolean).

입력 스키마

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "ok": {
      "type": "boolean"
    }
  },
  "required": [
    "slug",
    "ok"
  ]
}
⚪library_report(slug, reason)

[bot-library] Report a broken, unsafe or spammy entry. 3 reports from different accounts pause it automatically. Args: slug, reason.

입력 스키마

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "slug"
  ]
}
⚪vault(action, name, domain, url, form, ...)

[login-vault] Sign-in sessions without the bot seeing passwords. Actions: put, list, delete, login, fetch, end, watch (free watch-only).

입력 스키마

{
  "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"
  ]
}
⚪handoff(action, kind, url, note, run_id, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟡replay(run_id, ui)

[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.

입력 스키마

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "ui": {
      "type": "string",
      "enum": [
        "openui"
      ]
    }
  }
}
🟡secrets(action, name, value, allowed_hosts)

[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.

입력 스키마

{
  "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"
  ]
}
🟡fetch(url, method, headers, body, timeout_s)

[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).

입력 스키마

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "method": {
      "type": "string"
    },
    "headers": {
      "type": "object"
    },
    "body": {},
    "timeout_s": {
      "type": "integer"
    }
  },
  "required": [
    "url"
  ]
}
🔴queue(action, queue, message, messages, delay_s, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟡cron(action, name, schedule, request, at, ...)

[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.

입력 스키마

{
  "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"
  ]
}
⚪browser(action, session, kind, note, fill, ...)

[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).

입력 스키마

{
  "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"
  ]
}
⚪lock(action, name, holder, ttl_s, wait_s, ...)

[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.

입력 스키마

{
  "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"
  ]
}
⚪rate(action, name, limit, n)

[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.

입력 스키마

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "take",
        "peek",
        "list"
      ]
    },
    "name": {
      "type": "string"
    },
    "limit": {
      "type": "string"
    },
    "n": {
      "type": "integer"
    }
  },
  "required": [
    "action"
  ]
}
🟡inbox(action, name)

[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.

입력 스키마

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "create",
        "list",
        "delete"
      ]
    },
    "name": {
      "type": "string"
    }
  },
  "required": [
    "action"
  ]
}
🟡topic(action, topic, queue, message, messages, ...)

[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.

입력 스키마

{
  "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"
  ]
}
⚪ai(model, prompt, messages, system, max_tokens, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟢ledger(action, bot, status, run_id, kind, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟡sandbox(action, name, ns, prefix, dir, ...)

[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.

입력 스키마

{
  "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"
  ]
}
🟡store(action, ns, key, value, ttl_seconds, ...)

[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.

입력 스키마

{
  "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"
  ]
}
⚪report(action, email, webhook_url, ui)

[daily-report] Opt-in daily owner summary (loops stopped, spend blocked, approvals waiting). Actions: subscribe, unsubscribe, preview.

입력 스키마

{
  "type": "object",
  "properties": {
    "action": {
      "type": "string"
    },
    "email": {},
    "webhook_url": {
      "type": "string"
    },
    "ui": {
      "type": "string",
      "enum": [
        "openui"
      ]
    }
  }
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 48개