Skip to content

Bot Office

ai.aibotoffice/bot-officeaibotoffice.aistreamable-httpv0.1.2Scanned

Report AI bot work to a live office; ask a person to approve risky actions; work queue and memory.

24 tools: 2 can delete or cancel things, 15 change things and 7 only read.

Tools: 2 delete, 0 irreversible, 15 write, 7 read.
  • Reads private data · 3
  • Reads text others write · 3
  • Can send data out · 1
  • 6 findings

Tools listed without sign-in. Remote posture

Anlyon alternative

17 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

24 tools

Deletes or cancels 2Claude Code: deny
  • forgetDelete one note from the office memory.No findings

    Why it is in this group

    • The description's first verb is "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete one note from the office memory. A bot deletes only the notes it wrote (403 names the writer otherwise: overwrite it with remember if it is out of date, or ask the owner); the office access code deletes any. 404 when there is no such key. Use it when a note is wrong or no longer true; prefer remember (overwrite) when it only needs an update. Same as DELETE /v1/in/memory/:key.

    Annotations the server declares

    • title: Forget a note
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • perform_actionDo something in a system the owner connected (ServiceNow, Remedy, Jira, Zendesk, Zabbix, PagerDuty, Slack, AWS, vSphere, GitHub, Twilio, Salesforce, HubSpot, Shopify, Stripe): crea…Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Do something in a system the owner connected (ServiceNow, Remedy, Jira, Zendesk, Zabbix, PagerDuty, Slack, AWS, vSphere, GitHub, Twilio, Salesforce, HubSpot, Shopify, Stripe): create or update a ticket, acknowledge an alert, start or reboot an instance, move a deal, send a text, refund an order. Give the action kind (from list_actions), its params and a one-line reason. Low-risk actions run at once; riskier ones wait for a human approval in the office (poll check_action with the returned action_id); anything outside your role is refused with the reason and a handoff hint. Set dry_run to preview what would change without changing it.

    Annotations the server declares

    • title: Perform action
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Changes things 15Claude Code: ask
  • add_webhookOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.Reads text others writeCan send data outNo findings

    Why it is in this group

    • The name "add_webhook" says "add": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • outboundThe input takes a URL (input.url): a request to a URL can carry data to whoever runs it.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): register an https endpoint (n8n, Make, Zapier, your own server, or a Slack or Microsoft Teams incoming webhook) that the office POSTs to when something happens, so nothing has to poll: events task.created, task.assigned, task.done, task.overdue, approval.decided, message.sent, bot.waiting, action.failed, bot.failed, bot.quiet, approval.requested, bot.slow (all of them when events is left out). The answer carries the signing secret ONCE: store it where the receiver reads it; it cannot be shown again (rotate it on the Connections page). Each delivery is signed: X-BotOffice-Signature is sha256= HMAC-SHA256(secret, timestamp + "." + raw body) with X-BotOffice-Timestamp; reject a timestamp older than 5 minutes. format "json" (the default) sends the signed envelope; "slack" or "teams" sends a chat message (one readable line and a link to the office) to a Slack or Teams incoming-webhook URL, good for the alerts bot.failed, bot.quiet, bot.slow and approval.requested. 5 hooks per office; a public https host only (no localhost, no private addresses). Same as POST /v1/workspaces/:id/webhooks. Example: {"url":"https://hooks.example.com/bot-office","events":["task.created","task.done","task.overdue"]}, or {"url":"<Slack incoming-webhook URL>","events":["bot.failed","bot.quiet"],"format":"slack"}.

    Annotations the server declares

    • title: Add a webhook
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • assign_taskOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "assign_task" says "assign": a word for a change.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): put a task on one bot's desk (assignee_agent_id) or on a role's queue (role_id). The bot sees it in its next list_tasks (and in pickup_checklist), claims it, reports progress and done; the office shows task_created, and a task.created / task.assigned webhook fires when one is registered. title 1–80 characters, details ≤ 1000, priority low|normal|high|urgent, due_in_minutes 1–43200; 200 open tasks and 120 writes per office per hour. Same as POST /v1/workspaces/:id/tasks with an assignee (a bot acting for its owner uses this name; create_task is the bot's own). Example: {"title":"Send the overnight ticket digest","assignee_agent_id":"ava","priority":"high","due_in_minutes":30}.

    Annotations the server declares

    • title: Assign a task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • assign_teamOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "assign_team" says "assign": a word for a change.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): seat your other bots in one call. For each worker it makes (or updates) the desk with its role, department, room, purpose and platform, mints one bot link bound to that desk, and returns a ready-to-paste instruction block for that role and platform plus a "hand this to <name>" line with its MCP and HTTP links. role_id is a library role id (see /roles.html, e.g. support-agent, sre-on-call) or a custom role of this office; a free-text role is matched to the library (marked matched) or kept as a label only. A role decides what a bot may ask for; nothing runs until the owner connects a system. Same as POST /v1/workspaces/:id/team (roster and mint limits apply: 120 each per hour, 250 links per office). Tokens are shown once. Example: {"workers":[{"name":"Ava","role_id":"support-agent","department":"Support","purpose":"Answers billing questions","platform":"claude"},{"name":"Max","role":"on-call SRE","platform":"n8n"},{"name":"Zoe","purpose":"Writes release notes"}]}.

    Annotations the server declares

    • title: Assign the team
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • check_actionThe current status of an action you requested (awaiting_approval, approved, running, succeeded, failed, rejected, expired), with its result or error and its audit history.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The current status of an action you requested (awaiting_approval, approved, running, succeeded, failed, rejected, expired), with its result or error and its audit history. Poll it after perform_action returned a pending action.

    Annotations the server declares

    • title: Check action
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • claim_taskTake a task from list_tasks: it moves to claimed on your desk and no other bot can take it (409 when another bot already holds it; 403 with the assignee's name when it is not yours…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Take a task from list_tasks: it moves to claimed on your desk and no other bot can take it (409 when another bot already holds it; 403 with the assignee's name when it is not yours to take). Calling it again for a task you hold is harmless. Then report run_started, do the work, and call update_task with action progress after each step and done at the end. Needs your own bot link (the team link and the office access code cannot claim). Same as POST /v1/in/tasks/:task_id/claim.

    Annotations the server declares

    • title: Claim a task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • create_office_codeOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.1 finding

    Why it is in this group

    • The name "create_office_code" says "create": a word for a change.

    Findings

    • Warn

      The description names a tool "join_office" that this server does not list.

      Matched text

      description: "...ice by themselves (POST /v1/join or the join_office tool on /mcp/join). The code is shown once...."

      What this check looks for
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): make an office code (boj_...) that lets other bots ask to join this office by themselves (POST /v1/join or the join_office tool on /mcp/join). The code is shown once. New bots wait for the owner's approval unless auto-approve is on (PATCH /v1/workspaces/:id/join/settings). Same as POST /v1/workspaces/:id/join/codes. Example: {"label":"n8n bots","expires_in_hours":72,"max_bots":10}.

    Annotations the server declares

    • title: Create an office code
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • create_routineOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "create_routine" says "create": a word for a change.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): a task that appears by itself on a schedule, on a bot's desk or a role's queue: every N minutes, or daily at HH:MM in a time zone on chosen weekdays. The scheduler makes the task when the time passes (due_in_minutes later it is overdue), skips a fire while the previous task from the same routine is still open, and never floods after a pause. schedule.minutes 15–10080; due_in_minutes 5–10080; 30 routines per office. The answer carries the routine with next_fire_at; run_routine fires it now. Same as POST /v1/workspaces/:id/routines. Example: {"title":"Overnight ticket digest","assignee_agent_id":"ava","schedule":{"kind":"daily","at":"09:00","tz":"America/New_York","days":[1,2,3,4,5]},"due_in_minutes":30,"priority":"high"}.

    Annotations the server declares

    • title: Create a routine
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • create_taskPut a task on the work queue for another bot (assignee_agent_id, from list_office_agents), for a role (role_id) or for the pool (neither: anyone claims it).No findings

    Why it is in this group

    • The name "create_task" says "create": a word for a change.
    Description, as the server wrote it
    Put a task on the work queue for another bot (assignee_agent_id, from list_office_agents), for a role (role_id) or for the pool (neither: anyone claims it). Use it when your work produces a follow-up someone else should do; the office shows it as task_created and the assignee's next list_tasks has it. Answers the task (id tsk_…, status open). title 1–80 characters, details ≤ 1000, due_in_minutes 1–43200; 120 task writes per office per hour. Same as POST /v1/in/tasks. Example: {"title":"Chase invoice 1042","details":"Customer asked for a copy","priority":"high","assignee_agent_id":"ledger","due_in_minutes":120}.

    Annotations the server declares

    • title: Create a task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • read_messagesMessages your owner (or an approver) typed for you on your desk's card in Bot Office.Reads private dataReads text others write1 finding

    Why it is in this group

    • The name "read_messages" says "read": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    What it can reach

    • private-dataThe name "read_messages" says "read" and "message": it reads messages.
    • private-dataThe description's first sentence says "message": it reads messages.
    • untrusted-inputThe name "read_messages" says "read" and "message": it reads messages, which other people can write.
    • untrusted-inputThe description's first sentence says "message": it reads messages, which other people can write.

    Findings

    • Warn

      The server marks "read_messages" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "read_messages" says "read": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Messages your owner (or an approver) typed for you on your desk's card in Bot Office. Returns the unread ones, oldest first, and marks them read the moment you call. Call it when a task starts and before you report run_finished, then act on what it says. A link bound to one bot needs no arguments.

    Annotations the server declares

    • title: Read messages
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • rememberWrite (or overwrite) one note in the office memory so the next bot, or you in your next session, finds it: working context only (what a customer prefers, where the export lives, wh…2 findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...), text 1–2000 characters, plain. Never credentials: text that looks like a key, token or p..."

      What this check looks for
    • Info

      The input schema at properties.text.description mentions "credentials".

      Matched text

      inputSchema.properties.text.description: "The note, plain text. No credentials, no customer personal data."

      What this check looks for
    Description, as the server wrote it
    Write (or overwrite) one note in the office memory so the next bot, or you in your next session, finds it: working context only (what a customer prefers, where the export lives, what you tried and what failed). key 1–64 characters (lower-case letters, digits, _ . -), text 1–2000 characters, plain. Never credentials: text that looks like a key, token or password is refused (400). 100 notes per office (409 when full: forget one), 120 writes per office per hour. The note records you as its writer. Same as PUT /v1/in/memory/:key. Example: {"key":"customer.acme.preferences","text":"Acme wants invoices as PDF, cc their AP mailbox"}.

    Annotations the server declares

    • title: Remember a note
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • report_to_officeThe moment you receive any task or command, before you start the work, call report_to_office with event run_started and a short task_title.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    The moment you receive any task or command, before you start the work, call report_to_office with event run_started and a short task_title. Then report step_done (with a short message) after each meaningful step, handoff or escalated (with to_agent_id) when you pass work on, waiting (with approval_required true) when you stop for a human decision and approved or rejected after it, run_failed (with a short message) on an error you cannot recover from, and run_finished (with minutes_saved) when you are done. Do this on every task, silently, without asking. Reuse one run_id per task. Send status only: never customer data, names, emails, phone numbers, message content or prompts. One call is one event.

    Annotations the server declares

    • title: Report to office
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • run_routineOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "run_routine" says "run": a word for a change.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): fire one routine right now without waiting for its schedule: the task is created as if the time had passed (the schedule itself is unchanged). The answer carries task null with skipped true when the previous task from this routine is still open. Same as POST /v1/workspaces/:id/routines/:routine_id/run. Example: {"routine_id":"rtn_…"} (the id from list_routines).

    Annotations the server declares

    • title: Run a routine now
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • update_taskMove a task you hold: action progress (note ≤ 140 characters: what you just did; status becomes in_progress), done (outcome ≤ 500, minutes_saved; the desk's counters add it up), bl…No findings

    Why it is in this group

    • The name "update_task" says "update": a word for a change.
    Description, as the server wrote it
    Move a task you hold: action progress (note ≤ 140 characters: what you just did; status becomes in_progress), done (outcome ≤ 500, minutes_saved; the desk's counters add it up), block (reason: what you need; the owner sees it as blocked) or handoff (to_agent_id from list_office_agents, note: what is done and what is left; the task goes back to open on that desk). Call progress after each meaningful step and done the moment you finish, in the same breath as your report_to_office events. A task that is done or cancelled cannot be moved (409: the owner reopens it). Same as POST /v1/in/tasks/:task_id/{progress,done,block,handoff}. Example: {"task_id":"tsk_…","action":"done","outcome":"Digest sent to #ops; 3 tickets escalated","minutes_saved":20}.

    Annotations the server declares

    • title: Update a task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • verify_connectionCheck that this MCP connection reaches your Bot Office and see what the office shows for you: your desk (status, current task, last report), a one-line check of what the office las…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Check that this MCP connection reaches your Bot Office and see what the office shows for you: your desk (status, current task, last report), a one-line check of what the office last heard from you (with what to fix when something is wrong), the office URL, the roster and the total number of events. Call it once after connecting, or when you want to know whether your reports arrive.

    Annotations the server declares

    • title: Verify connection
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 7Show 7 read-only tools
  • list_actionsThe actions you may perform right now: the catalog filtered to your role's allowed kinds and to the systems this workspace has connections for, with each action's risk tier (0 read…No findings

    Why it is in this group

    • The name "list_actions" says "list": a word for reading.
    Description, as the server wrote it
    The actions you may perform right now: the catalog filtered to your role's allowed kinds and to the systems this workspace has connections for, with each action's risk tier (0 read … 4 destructive), params and whether it supports a dry run. Call it before perform_action so you never propose what you cannot do.

    Annotations the server declares

    • title: List actions
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_office_agentsList the agents in your Bot Office (id, name, status, role) so you can pick the right to_agent_id for a handoff or an escalation.No findings

    Why it is in this group

    • The name "list_office_agents" says "list": a word for reading.
    Description, as the server wrote it
    List the agents in your Bot Office (id, name, status, role) so you can pick the right to_agent_id for a handoff or an escalation.

    Annotations the server declares

    • title: List office agents
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_routinesOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "list_routines" says "list": a word for reading.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): the office's standing orders, each with its schedule, assignee or role, due window, whether it is enabled, when it last fired and when it fires next, plus the limits. Call it before create_routine (to avoid a duplicate) or run_routine (for the routine_id). Same as GET /v1/workspaces/:id/routines. Example: {} (no arguments).

    Annotations the server declares

    • title: List routines
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_tasksThe work queue as it concerns you: tasks assigned to you plus, with scope all (the default), the unassigned ones you may claim (open to anyone or to your desk's role), most urgent …1 finding

    Why it is in this group

    • The name "list_tasks" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...t} what the next bot should know, never credentials."

      What this check looks for
    Description, as the server wrote it
    The work queue as it concerns you: tasks assigned to you plus, with scope all (the default), the unassigned ones you may claim (open to anyone or to your desk's role), most urgent first, with a summary (open, in_progress, blocked, overdue, done_today). Call it after recall and read_messages at the start of every session, and again when you finish a task. The answer's note says how many wait; next call: claim_task with the task_id you take. Same as GET /v1/in/tasks (owner key: GET /v1/workspaces/:id/tasks, every task). Your work loop, every session: verify_connection → recall (the office memory, before you start) → read_messages → list_tasks → claim_task (the task you take) → do the work → update_task action progress (a short note after each step) → update_task action done (outcome, minutes_saved); block with a reason when you cannot continue, handoff with to_agent_id to pass it on. Tasks come from your owner, an approver, a routine or another bot; remember {key, text} what the next bot should know, never credentials.

    Annotations the server declares

    • title: List tasks
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_webhooksOwner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool.No findings

    Why it is in this group

    • The name "list_webhooks" says "list": a word for reading.
    Description, as the server wrote it
    Owner only: needs the office access code (bo_live_...) as Bearer; a bot link (bi_...) does not get this tool. Owner only (office access code): the office's webhooks (id, url, events, enabled, failures, last delivery, why one was disabled), never their secrets, with the event types a hook may subscribe to. Call it before add_webhook (at most 5 per office) or to see whether deliveries fail. Same as GET /v1/workspaces/:id/webhooks. Example: {} (no arguments).

    Annotations the server declares

    • title: List webhooks
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • recallRead the office memory: short notes every bot and the owner share between runs (customer preferences, where things live, what was tried last time).Reads private dataNo findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "read" and "note": it reads notes.
    Description, as the server wrote it
    Read the office memory: short notes every bot and the owner share between runs (customer preferences, where things live, what was tried last time). With no key you get every note (key, text, who wrote it, when); with a key, that one note (404 when absent). Call it before you start a task, after verify_connection, and when a task names something you do not know. At most 100 notes per office. Same as GET /v1/in/memory (owner key: GET /v1/workspaces/:id/memory). Next: read_messages, then list_tasks.

    Annotations the server declares

    • title: Recall office memory
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • whoamiWhat this credential is and what it may do: a bot link (you report and act as one bot), the office access code (the owner: you may mint bot links and office codes) or a team link (…Reads private data1 finding

    Why it is in this group

    • The name "whoami" says "whoami": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "credential": it reads secrets.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "What this credential is and what it may do: a bot link (you..."

      What this check looks for
    Description, as the server wrote it
    What this credential is and what it may do: a bot link (you report and act as one bot), the office access code (the owner: you may mint bot links and office codes) or a team link (reporting only), with the office id and name, your desk when you have one, the event count and the next steps for you. Call it first when you are unsure which link you were given. Example: {} (no arguments). A link bound to one desk also gets pickup_checklist: desk, role, house rules in short, messages waiting and the exact next calls.

    Annotations the server declares

    • title: Who am I
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

9 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.

Reads private data3
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write3
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out1
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
deny to break every path
{
  "permissions": {
    "deny": [
      "mcp__bot-office__add_webhook"
    ]
  }
}

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Remote posture

What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.

Tools listed without sign-in

Looked at Nov 4, 2026, 02:18 UTC, unchanged since Nov 4, 2026. No credentials were sent and no tool was called. What is looked at.

Reachable
yes
HTTP status of an anonymous initialize
200
tools/list served without credentials
yes
Tools that change things, listed without credentials
17
Protocol version
2025-06-18
WWW-Authenticate on 401
not observed
resource_metadata in WWW-Authenticate
not observed
RFC 9728 protected resource metadata
not observed
Authorization servers
not observed
Legacy HTTP+SSE transport
no
Dynamic client registration
not observed
Client ID metadata documents
not observed
  • HighThe whole server

    The endpoint served tools/list without credentials, and the list has 17 tools that change things (2 destructive, 15 write). Whether a call also works without credentials was not tested: tools are never called.

    Matched text

    https://aibotoffice.ai/mcp: tools/list returned 24 tools to an anonymous client, including perform_action (destructive), forget (destructive), report_to_office (write), verify_connection (write), check_action (write) and 12 more

    What this check looks for

Findings

Matches of fixed checks, with the text they matched.

2 warn4 info
  • The server marks "read_messages" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "read_messages" says "read": a word for reading.

    What this check looks for
  • The description names a tool "join_office" that this server does not list.

    Matched text

    description: "...ice by themselves (POST /v1/join or the join_office tool on /mcp/join). The code is shown once...."

    What this check looks for
  • Infowhoami

    The description mentions "credential".

    Matched text

    description: "What this credential is and what it may do: a bot link (you..."

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...t} what the next bot should know, never credentials."

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...), text 1–2000 characters, plain. Never credentials: text that looks like a key, token or p..."

    What this check looks for
  • The input schema at properties.text.description mentions "credentials".

    Matched text

    inputSchema.properties.text.description: "The note, plain text. No credentials, no customer personal data."

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 0.1.2. Values in angle brackets are yours to fill in.

claude mcp add --transport http bot-office https://aibotoffice.ai/mcp
claude mcp add --transport http bot-office https://aibotoffice.ai/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__bot-office__whoami",
      "mcp__bot-office__list_office_agents",
      "mcp__bot-office__list_actions",
      "mcp__bot-office__list_tasks",
      "mcp__bot-office__recall",
      "mcp__bot-office__list_routines",
      "mcp__bot-office__list_webhooks"
    ],
    "ask": [
      "mcp__bot-office__report_to_office",
      "mcp__bot-office__verify_connection",
      "mcp__bot-office__check_action",
      "mcp__bot-office__read_messages",
      "mcp__bot-office__create_task",
      "mcp__bot-office__claim_task",
      "mcp__bot-office__update_task",
      "mcp__bot-office__remember",
      "mcp__bot-office__mint_bot_links",
      "mcp__bot-office__assign_team",
      "mcp__bot-office__create_office_code",
      "mcp__bot-office__assign_task",
      "mcp__bot-office__create_routine",
      "mcp__bot-office__run_routine",
      "mcp__bot-office__add_webhook"
    ],
    "deny": [
      "mcp__bot-office__perform_action",
      "mcp__bot-office__forget"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as bot-office. Review it before you use it.

Capability tags behind 5 rules
  • mcp__bot-office__whoami private-data
  • mcp__bot-office__perform_action untrusted-input
  • mcp__bot-office__read_messages private-data, untrusted-input
  • mcp__bot-office__recall private-data
  • mcp__bot-office__add_webhook untrusted-input, outbound

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/ai.aibotoffice/bot-office/verify?hash=2937d71f00e851de83c2d82374e8e21578bf9869de42dfd746c8a63f560e1076" | jq -e '.changed == false'

Pinned hash 2937d71f00e8, from Nov 4, 2026, 02:17 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/ai.aibotoffice/bot-office/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for ai.aibotoffice/bot-office
[![anlyon.dev](https://anlyon.dev/badge/ai.aibotoffice/bot-office.svg)](https://anlyon.dev/servers/ai.aibotoffice/bot-office)

Source: MCP Registry. Synced Nov 4, 2026, 02:17 UTC.