# `online.webarm24/webarm24` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/online.webarm24/webarm24
- JSON: https://anlyon.dev/api/v1/servers/online.webarm24/webarm24
- Version: 1.0.0 (active)
- Publisher: online.webarm24 (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-11-02T18:18:14.331Z

Title and description, as the publisher wrote them:

```untrusted-server-text
WebArm24
AI automation platform (n8n/Zapier alternative): build, schedule and run workflows from your agent.
```

Scanned 2026-11-02T18:18:20.066Z over streamable-http.

**61 tools: 6 can delete or cancel things, 1 do something that can't be undone, 37 change things and 17 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 6 | deny |
| Can't be undone | irreversible | 1 | ask |
| Changes things | write | 37 | ask |
| Only reads | read | 17 | allow |

## Exfil surface

30 private-data -> untrusted-input -> outbound paths in this server alone. Denying 2 private-data tools breaks every one: `mcp__webarm24__storage_file_get`, `mcp__webarm24__storage_files_list`.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | `mcp__webarm24__storage_file_get` `mcp__webarm24__storage_files_list` |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | `mcp__webarm24__browser_get_html` `mcp__webarm24__browser_navigate` `mcp__webarm24__browser_screenshot` `mcp__webarm24__browser_session_get` `mcp__webarm24__browser_session_list` |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | `mcp__webarm24__agent_job_submit` `mcp__webarm24__browser_navigate` `mcp__webarm24__send_email` |

| Private data | Untrusted input | Outbound |
| --- | --- | --- |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_file_get` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_get_html` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_navigate` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_screenshot` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_get` | `mcp__webarm24__send_email` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__agent_job_submit` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__browser_navigate` |
| `mcp__webarm24__storage_files_list` | `mcp__webarm24__browser_session_list` | `mcp__webarm24__send_email` |

## Findings

No check matched anything in these tool definitions.


## Deletes or cancels (6)

Removes, cancels or revokes something. Claude Code: deny.

### `browser_session_delete`

- The name "browser_session_delete" says "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete a saved login.
```

### `pipeline_delete`

- The name "pipeline_delete" says "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete a pipeline and its schedule (restorable later via pipeline_deleted_restore).
```

### `pipeline_group_delete`

- The name "pipeline_group_delete" says "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete a group. Its pipelines are kept, just ungrouped.
```

### `schedule_delete`

- The name "schedule_delete" says "schedule": a word for a change.
- The description's first verb is "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete an automation.
```

### `storage_delete`

- The name "storage_delete" says "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete a store.
```

### `storage_file_delete`

- The name "storage_file_delete" says "delete": a word for removing or ending something.

Description, as the server wrote it:

```untrusted-server-text
Delete a stored file.
```

## Can't be undone (1)

Sends, pays, publishes or merges: once done, it cannot be taken back. Claude Code: ask.

### `send_email`

- The name "send_email" says "send": a word for sending, and what is sent cannot be taken back.
- The input addresses people (input.to): what it sends cannot be taken back.
- Tag outbound: The name "send_email" says "send": it sends or publishes something to other people. The input takes a destination (input.to): what the tool writes goes there.

Description, as the server wrote it:

```untrusted-server-text
Send an email through the server SMTP (subject to server allowlists/limits). Costs 1 mcp_call.
```

## Changes things (37)

Creates or changes something that can be changed back. Claude Code: ask.

### `account_me`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Your account incl. credit balance.
```

### `agent_job_submit`

- The name "agent_job_submit" says "submit": a word for a change.
- Tag outbound: The input takes a URL (input.target_url): a request to a URL can carry data to whoever runs it.

Description, as the server wrote it:

```untrusted-server-text
Run the browsing agent on a task (async; costs agent_job credits). Jobs are in-memory (lost on restart).
```

### `browser_click`

- The name "browser_click" says "click": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Click an element by visible text, label or CSS selector. Costs 1 mcp_call.
```

### `browser_click_at`

- The name "browser_click_at" says "click": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Click at pixel coordinates of the (resized) viewport. Costs 1 mcp_call.
```

### `browser_close_session`

- The name "browser_close_session" says "close": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Close your browser session (free). Idle sessions are closed after 30 minutes.
```

### `browser_extract_text`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Extract text from a described area of the page. Costs 1 mcp_call.
```

### `browser_fill`

- The name "browser_fill" says "fill": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Type a value into an input identified by label/placeholder/selector. Costs 1 mcp_call.
```

### `browser_navigate`

- The name "browser_navigate" says "navigate": a word for a change.
- Tag untrusted-input: The name "browser_navigate" says "navigate" and "browser": it reads web pages, which anyone can write. The description's first sentence says "open" and "url": it reads web pages, which anyone can write. The input takes a URL (input.url), and the tool reads it: it reads web pages, which anyone can write.
- Tag outbound: The input takes a URL (input.url): a request to a URL can carry data to whoever runs it.

Description, as the server wrote it:

```untrusted-server-text
Open a URL in your private server-side browser session. `browser_session_label` loads a saved login
    (see browser_session_put) when the session is first created. Costs 1 mcp_call.
```

### `browser_scroll`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Scroll 'up' or 'down'. Costs 1 mcp_call.
```

### `browser_session_put`

- The name "browser_session_put" says "put": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Save a Playwright storageState (stored encrypted).
```

### `credit_packs`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Purchasable credit packs.
```

### `credits_checkout_url`

- The name "credits_checkout_url" says "checkout": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Create a Stripe Checkout URL for a pack; a human must open it to pay.
```

### `credits_history`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Balance and last 100 ledger entries.
```

### `pipeline_builder_chat`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Ask the built-in AI pipeline builder (costs builder_call credits). `messages`=[{role,content}],
    `pipeline`=current draft. Returns {text, pipeline}; the draft is NOT saved — pass it to pipeline_create/update.
```

### `pipeline_create`

- The name "pipeline_create" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Create a pipeline. See resource webarm://docs/pipeline-steps for the step schema.
    `extra` may carry webhook_url, webhook_secret, webhook_structured_data_only, inbound_trigger_only.
```

### `pipeline_debug_chat`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Ask the AI to analyse a finished run (costs builder_call credits).
```

### `pipeline_deleted_restore`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Re-create a deleted pipeline from its last snapshot (same id, starts disabled, new inbound trigger URL).
```

### `pipeline_group_assign`

- The name "pipeline_group_assign" says "assign": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Move a pipeline into a group; omit group_id (or pass null) to remove it from its group.
```

### `pipeline_group_create`

- The name "pipeline_group_create" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Create a sidebar group, optionally moving the given pipelines into it.
```

### `pipeline_group_update`

- The name "pipeline_group_update" says "update": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Rename a group and/or set whether it is collapsed in the sidebar.
```

### `pipeline_history_restore`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Restore a pipeline to the state of a revision (recorded as a new `restore` revision). Returns the pipeline.
```

### `pipeline_run`

- The name "pipeline_run" says "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Start a run (async; returns run_id). Costs the usual pipeline_run credits. Follow with
    pipeline_run_wait or pipeline_run_get.
```

### `pipeline_run_cancel`

- The name "pipeline_run_cancel" says "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Request cancellation of an active run (takes effect between steps).
```

### `pipeline_run_get`

- The name "pipeline_run_get" says "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Run status (running|cancelling|ok|error|cancelled), current_step_index, per-step results, answer_preview.
```

### `pipeline_run_wait`

- The name "pipeline_run_wait" says "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Block until the run finishes or timeout_sec (max 600) elapses; returns the latest run state
    (check `status` — still 'running' means timed out).
```

### `pipeline_runs_list`

- The name "pipeline_runs_list" says "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Recent runs of a pipeline (max 50).
```

### `pipeline_test_step`

- The description's first verb is "run": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Run a single step in isolation. `previous_outputs[i]` feeds {{step_{i+1}_output}}.
```

### `pipeline_update`

- The name "pipeline_update" says "update": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Patch a pipeline. `fields` may contain any of: name, enabled, cron_expr, run_at (null clears), steps,
    task_variables, webhook_url, webhook_secret, clear_webhook_secret, webhook_structured_data_only,
    inbound_trigger_only, regenerate_trigger_token. `steps` replaces the whole step list.
```

### `schedule_create`

- The name "schedule_create" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Create an automation. `schedule` follows ScheduleCreate: mode (agent|replay), task_text, target_url,
    webhook_url, cron_expr, run_at, lang, output_json_schema, task_variables, ...
```

### `schedule_export`

- The name "schedule_export" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Export an automation as portable JSON.
```

### `schedule_get`

- The name "schedule_get" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Automation details plus recent runs.
```

### `schedule_import`

- The name "schedule_import" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Import an exported automation.
```

### `schedule_list`

- The name "schedule_list" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
List automations (single-task schedules).
```

### `schedule_run`

- The name "schedule_run" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Run an automation now (synchronous; costs schedule_run credits).
```

### `schedule_update`

- The name "schedule_update" says "schedule": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Patch an automation (ScheduleUpdate fields).
```

### `storage_file_put`

- The name "storage_file_put" says "put": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Upload a file (base64 content). Size caps: USER_FILES_FILE_MAX_BYTES / per-user total.
```

### `storage_write`

- The name "storage_write" says "write": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Write a store (mode 'auto' keeps JSON, 'text' stores a string).
```

## Only reads (17)

Looks things up and changes nothing. Claude Code: allow.

### `agent_job_get`

- The name "agent_job_get" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Job status/result (queued|running|completed|failed).
```

### `agent_job_list`

- The name "agent_job_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Recent agent jobs.
```

### `analyze_json`

- The name "analyze_json" says "analyze": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Inspect large JSON: mode summary|schema|value|preview, optional dotted path. Costs 1 mcp_call.
```

### `browser_get_html`

- The name "browser_get_html" says "get": a word for reading.
- Tag untrusted-input: The name "browser_get_html" says "get" and "browser": it reads web pages, which anyone can write. The description's first sentence says "return" and "html": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Return the current page HTML. Costs 1 mcp_call.
```

### `browser_screenshot`

- The name "browser_screenshot" says "screenshot": a word for reading.
- Tag untrusted-input: The name "browser_screenshot" says "screenshot" and "browser": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Screenshot of the current page (JPEG). Costs 1 mcp_call.
```

### `browser_session_get`

- The name "browser_session_get" says "get": a word for reading.
- Tag untrusted-input: The name "browser_session_get" says "get" and "browser": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Get a saved storageState.
```

### `browser_session_list`

- The name "browser_session_list" says "list": a word for reading.
- Tag untrusted-input: The name "browser_session_list" says "list" and "browser": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
List saved logins (Playwright storageState slots).
```

### `pipeline_deleted_list`

- The name "pipeline_deleted_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Deleted pipelines that can be restored: [{pipeline_id, name, steps_count, deleted_at, source}].
```

### `pipeline_get`

- The name "pipeline_get" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get one pipeline incl. steps, schedule and inbound trigger URL.
```

### `pipeline_group_list`

- The name "pipeline_group_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List your sidebar pipeline groups, each with its pipeline_ids. Ungrouped pipelines are in no group.
```

### `pipeline_history_get`

- The name "pipeline_history_get" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
One revision: {revision, snapshot (full pipeline state after that change), diff (vs previous revision)}.
```

### `pipeline_history_list`

- The name "pipeline_history_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Change history of a pipeline, newest first: [{id, seq, action (create|update|delete|restore),
    source (manual|assistant|mcp|api), source_detail, changed_fields, created_at, updated_at}].
    Consecutive manual UI edits within a few minutes are merged into one revision. Page with `before_seq`.
```

### `pipeline_list`

- The name "pipeline_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List your pipelines.
```

### `storage_file_get`

- The name "storage_file_get" says "get": a word for reading.
- Tag private-data: The name "storage_file_get" says "get" and "file": it reads files. The description's first sentence says "file": it reads files.

Description, as the server wrote it:

```untrusted-server-text
Download a file as base64 (limited to 8 MiB of base64).
```

### `storage_files_list`

- The name "storage_files_list" says "list": a word for reading.
- Tag private-data: The name "storage_files_list" says "list" and "file": it reads files. The description's first sentence says "list" and "file": it reads files.

Description, as the server wrote it:

```untrusted-server-text
List stored files.
```

### `storage_list`

- The name "storage_list" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List your JSON/text stores.
```

### `storage_read`

- The name "storage_read" says "read": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Read a store.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `webarm24`:

```json
{
  "permissions": {
    "allow": [
      "mcp__webarm24__browser_screenshot",
      "mcp__webarm24__browser_get_html",
      "mcp__webarm24__analyze_json",
      "mcp__webarm24__pipeline_list",
      "mcp__webarm24__pipeline_get",
      "mcp__webarm24__pipeline_history_list",
      "mcp__webarm24__pipeline_history_get",
      "mcp__webarm24__pipeline_deleted_list",
      "mcp__webarm24__pipeline_group_list",
      "mcp__webarm24__agent_job_get",
      "mcp__webarm24__agent_job_list",
      "mcp__webarm24__storage_list",
      "mcp__webarm24__storage_read",
      "mcp__webarm24__storage_files_list",
      "mcp__webarm24__storage_file_get",
      "mcp__webarm24__browser_session_list",
      "mcp__webarm24__browser_session_get"
    ],
    "ask": [
      "mcp__webarm24__browser_navigate",
      "mcp__webarm24__browser_click",
      "mcp__webarm24__browser_click_at",
      "mcp__webarm24__browser_fill",
      "mcp__webarm24__browser_extract_text",
      "mcp__webarm24__browser_scroll",
      "mcp__webarm24__browser_close_session",
      "mcp__webarm24__send_email",
      "mcp__webarm24__pipeline_create",
      "mcp__webarm24__pipeline_update",
      "mcp__webarm24__pipeline_history_restore",
      "mcp__webarm24__pipeline_deleted_restore",
      "mcp__webarm24__pipeline_group_create",
      "mcp__webarm24__pipeline_group_update",
      "mcp__webarm24__pipeline_group_assign",
      "mcp__webarm24__pipeline_test_step",
      "mcp__webarm24__pipeline_run",
      "mcp__webarm24__pipeline_run_get",
      "mcp__webarm24__pipeline_run_wait",
      "mcp__webarm24__pipeline_runs_list",
      "mcp__webarm24__pipeline_run_cancel",
      "mcp__webarm24__pipeline_builder_chat",
      "mcp__webarm24__pipeline_debug_chat",
      "mcp__webarm24__agent_job_submit",
      "mcp__webarm24__schedule_list",
      "mcp__webarm24__schedule_get",
      "mcp__webarm24__schedule_create",
      "mcp__webarm24__schedule_update",
      "mcp__webarm24__schedule_run",
      "mcp__webarm24__schedule_export",
      "mcp__webarm24__schedule_import",
      "mcp__webarm24__storage_write",
      "mcp__webarm24__storage_file_put",
      "mcp__webarm24__browser_session_put",
      "mcp__webarm24__account_me",
      "mcp__webarm24__credits_history",
      "mcp__webarm24__credit_packs",
      "mcp__webarm24__credits_checkout_url"
    ],
    "deny": [
      "mcp__webarm24__pipeline_delete",
      "mcp__webarm24__pipeline_group_delete",
      "mcp__webarm24__schedule_delete",
      "mcp__webarm24__storage_delete",
      "mcp__webarm24__storage_file_delete",
      "mcp__webarm24__browser_session_delete"
    ]
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__webarm24__browser_navigate`: untrusted-input, outbound
- `mcp__webarm24__browser_screenshot`: untrusted-input
- `mcp__webarm24__browser_get_html`: untrusted-input
- `mcp__webarm24__send_email`: outbound
- `mcp__webarm24__agent_job_submit`: outbound
- `mcp__webarm24__storage_files_list`: private-data
- `mcp__webarm24__storage_file_get`: private-data
- `mcp__webarm24__browser_session_list`: untrusted-input
- `mcp__webarm24__browser_session_get`: untrusted-input
