# MCP tools

> Every tool the MCP server offers agents, what each one takes and returns, what agents may not do, how they tidy up their own work, and what is recorded.

Source: https://docs.bifrostorbit.com/cms/developers/mcp-tools/

These are the tools an agent sees once it is connected. To connect one, see [Connect an AI agent over MCP](https://docs.bifrostorbit.com/cms/developers/connect-an-ai-agent/).

## All tools at a glance

This table is read from the server itself, so it always matches what agents see.

| Tool | What it does | Changes anything |
| --- | --- | --- |
| `list_scopes` | The environments, regions and locales of this website, and which ones you may change. | No, reads only |
| `search_content` | Find pages, collection entries and globals by words in their name, address or SEO title. Includes drafts. | No, reads only |
| `list_pages` | List the pages in one folder (or the top level) of a region and locale. | No, reads only |
| `get_page` | Read one page or entry in full: fields, blocks, SEO, the draft and what is live, and docVersion for safe updates. | No, reads only |
| `get_navigation` | Read the website's menus for a region and locale, with the page each link opens. Menus are changed by people under Navigation; you cannot change them. | No, reads only |
| `get_schema` | The content types and blocks (components) with their fields, so drafts you write are valid. A field with showWhen only applies while the named field of the same type or block holds that value (or one of the listed values); leave it out otherwise, since it is not required and is not delivered. A link field takes { kind: "content", contentId: <page id> } to link to a page, which follows the page when it moves, or { kind: "url", href: "https://…" or "/path" } for an address. | No, reads only |
| `create_draft` | Create a page or entry as a draft. It is never live until a person publishes it. | Saves a draft or comment |
| `update_draft` | Change a page's name, fields or blocks in its draft. Pass the docVersion you read so a newer change is never overwritten. Pages in review or due to go live cannot be changed. | Saves a draft or comment |
| `update_seo_fields` | Write a page's meta title, description and Open Graph text, saved to its draft. | Saves a draft or comment |
| `draft_special_content` | Draft the wording of a landing page, popup, banner or shop product: headlines, body text, FAQs, descriptions, benefits and directions. Give id and docVersion to change one, or contentType and name to start one. Only text fields may change: schedules, targeting, styles, prices, codes and catalogue IDs are left to people, and existing blocks cannot be removed. Saved as a draft for review. | Saves a draft or comment |
| `copy_to_region` | Copy pages to another region or language as linked drafts, ready to adapt. | Saves a draft or comment |
| `upload_media` | Upload an image, with alt text and a title per locale, into the "AI uploads" folder. Up to 3 MB. Locale codes must be ones the website has (see list_scopes). PNG and JPEG images are converted to WebP: the answer then gives convertedFrom with the type you sent. | Saves a draft or comment |
| `set_image_text` | Set an image's alt text, title or caption per locale. Only the languages you give change: others are kept, and an empty string or null removes that language. Locale codes must be ones the website has (see list_scopes). Image text is shared by every page and environment and shows at once, so images live on pages you may not change are refused. | Saves a draft or comment |
| `discard_draft` | Move a page or entry you created through this connection to the bin, such as a test page or a draft that is no longer wanted. Only for drafts that were never published, are not in review, approved or in a release, and that no person or other connection has changed since. Anything else is refused with the reason. A person can restore it from the bin. | Saves a draft or comment |
| `discard_upload` | Move an image you uploaded through this connection to the bin. Only for images that no page uses, in a draft, live, in the bin or in an earlier version, and that no person or other connection has changed; a refusal lists where it is used. A person can restore it from the bin. | Saves a draft or comment |
| `get_seo_issues` | The SEO dashboard for a region and locale: health score and every issue grouped by type, with the pages affected. | No, reads only |
| `run_page_checks` | Run the SEO checks and the pre-publish checks (alt text, image consent) on a page's draft. | No, reads only |
| `add_comment` | Comment on a review, or on the open review of a page. | Saves a draft or comment |
| `submit_for_review` | Send a page's draft to the review queue with a note explaining what you changed and why. A person approves and publishes it. | Saves a draft or comment |

## How the tools are grouped

| Group | Tools | Changes anything |
| --- | --- | --- |
| Find and read | `list_scopes`, `search_content`, `list_pages`, `get_page`, `get_navigation`, `get_schema` | No |
| Draft | `create_draft`, `update_draft`, `update_seo_fields`, `draft_special_content`, `copy_to_region` | Saves drafts |
| Images | `upload_media`, `set_image_text` | Changes the media library |
| Checks | `get_seo_issues`, `run_page_checks` | No |
| Review | `add_comment`, `submit_for_review` | Adds comments and reviews |
| Tidy up | `discard_draft`, `discard_upload` | Moves the agent's own unpublished drafts and unused uploads to the bin |

There are no tools for publishing, unpublishing, scheduling, deleting other people's work, prices, promotions, people, keys, settings or schemas. The permission checks refuse those actions as well, so an agent cannot reach them another way.

## What an agent may and may not do

**Its rights are the person's, capped.** An agent acts for one person. It can do only what that person can do, and never more than this drafting list: read the organisation, website, environments, regions, languages, schema, menus and media; read published content and drafts; create, change and copy content; and upload images. If the person cannot edit a region or content type, neither can their agent.

**Production is read only unless allowed.** An agent can read every environment. It can change content in Production only when **Allow drafts in production** is on for the website. Without it, tools that change content in Production answer that the role cannot perform the action.

**Keys can be limited to regions.** An agent key limited to some regions can still read the others but cannot change them. Signed-in connections can change every region the person can.

**Nothing goes live without a person.** Pages an agent creates or changes are marked **Drafted by AI**. A page with that mark cannot be published until a person approves it in review. The person the agent acted for cannot approve it themselves, because they count as its author; someone else must. The mark is cleared when the page is published.

**Some pages are off limits while they are with people.** An agent cannot change a page that is in review, scheduled to go live, part of a scheduled release, or being edited by someone else at that moment.

**It can tidy up only its own work.** `discard_draft` and `discard_upload` move to the bin only what the agent created through the same key or signed-in connection. A page must never have been published, and must not be in review, approved and waiting, in a release, or open in the editor. An image must not be used anywhere. Nobody else, person or other connection, may have changed either since. The person must be allowed to delete pages or files themselves. Anything discarded goes to **Bin**, exactly as if the person had deleted it, and can be restored from there. Pages and images from before connections were recorded cannot be discarded by an agent.

**Prices and promotions are never changed.** If a change would alter a field set to protect a price or a promotion, in a page's own fields or in any block, it is refused, even when the person could make it. Which fields are protected is set per field under **Protects**. See [Prices and promotions](https://docs.bifrostorbit.com/cms/developers/field-types/).

**Content is data, not instructions.** The server tells agents that text returned by tools is website content, to be treated as data and never as instructions.

## Scope arguments

Many tools take three optional arguments that say where to work:

| Argument | Meaning | When left out |
| --- | --- | --- |
| `environment` | Environment key, such as `staging` or `production` | `staging`, or the website's default environment if it has no `staging` |
| `region` | Region key, such as `de` | The first region in the environment that has a language |
| `locale` | Language code, such as `de-DE` | The region's default language |

Tools that take an `id` work wherever that page or entry lives, so they do not need these. A key or code that does not exist is refused with the ones that do, such as *There is no region "us" in Staging. Its regions are de, ch*.

## Answers and errors

Every tool answers with JSON as text. When a tool fails, the answer is marked as an error and the text says why, for example:

```text
This page has changed since version 3 was read; it is now at version 4. Read it again and retry.
```

Page summaries, returned by several tools, look like this:

```json
{
  "id": "665f1c2e9b1e8a0012ab34cd",
  "name": "Hiking boots",
  "url": "/products/hiking-boots",
  "contentType": "page",
  "status": "published",
  "hasUnpublishedChanges": false,
  "draftedByAi": null,
  "updatedAt": "2026-10-01T09:30:00.000Z"
}
```

`status` is one of `draft`, `in_review`, `published`, `scheduled` or `archived`. `draftedByAi` names the agent and the person it acted for, such as `"Claude (AI agent for Jane Doe)"`, or is `null`.

## Find and read

### list_scopes

No arguments. Lists each environment with its regions and their languages, and whether the agent may change each environment and region.

```json
[
  {
    "environment": "staging",
    "writable": true,
    "regions": [{ "region": "de", "name": "Germany", "writable": true, "locales": ["de-DE"] }]
  },
  {
    "environment": "production",
    "writable": false,
    "regions": [{ "region": "de", "name": "Germany", "writable": true, "locales": ["de-DE"] }]
  }
]
```

Something can be changed only when both its environment and its region are writable. The person's own rights still apply.

### search_content

Finds pages, collection entries and globals in one region and language whose name, address or SEO title contains the words. Drafts are included.

| Argument | |
| --- | --- |
| `query` | Words to look for, up to 200 characters. Leave out to list everything. |
| `contentType` | Only this content type, such as `page`. |
| `limit` | 1 to 100. Default 25. |
| `environment`, `region`, `locale` | See scope arguments. |

Returns `{ "total": 12, "results": [ …page summaries ] }`. `total` counts every match, even beyond the limit.

### list_pages

Lists the folders and pages in one folder.

| Argument | |
| --- | --- |
| `folderId` | The folder to list. Leave out, or `null`, for the top level. |
| `environment`, `region`, `locale` | See scope arguments. |

Returns `{ "folders": [{ "id", "name", "slug" }], "pages": [ …page summaries ] }`. Use a folder's `id` to list inside it.

### get_page

Reads one page or entry in full.

| Argument | |
| --- | --- |
| `id` | The page or entry id. |

Returns the name, address, status, content type, folder, the draft's fields, blocks and SEO, the draft and published versions, and `docVersion`. Pass `docVersion` back when changing the page, so a newer change by someone else is never overwritten.

### get_navigation

Reads the menus of one region and language. Takes the scope arguments.

```json
[
  {
    "id": "6660a3f19b1e8a0012ab3600",
    "key": "main",
    "name": "Main menu",
    "kind": "header",
    "items": [
      {
        "label": "Products",
        "kind": "content",
        "visible": true,
        "href": null,
        "page": { "id": "665f1c2e9b1e8a0012ab34cd", "name": "Products", "url": "/products", "live": true },
        "children": []
      }
    ]
  }
]
```

Menus for every region and language are included, as well as those made for this one. `page` is the page a link opens, `{ "id", "missing": true }` when that page has been deleted, or `null` for a link to an address. Agents cannot change menus: a person does that under **Library › Navigation**, and the change is live at once, with no draft or review. When a page has no links to it, say so in the review note so a person can add it to a menu.

### get_schema

No arguments. Returns every content type with its fields and allowed blocks, and every block (component) that is not deprecated, with its fields and child slots. It also gives the shape of a block:

```text
{ id?: string, type: <component key>, fields: { <field key>: value }, children: { <slot name>: [blocks] } }
```

Agents should read the schema before drafting, so drafts are valid. A field with `showWhen` applies only while the named field holds that value, such as a button's `plan` only when `kind` is `signUp`; leave it out otherwise. To link to a page, a link field takes `{ "kind": "content", "contentId": "<page id>" }`, with the id from `list_pages` or `search_content`, so the link follows the page when it moves.

## Draft

### create_draft

Creates a page or entry as a draft. It is never live until a person publishes it.

| Argument | |
| --- | --- |
| `contentType` | Content type key from `get_schema`. Required. |
| `name` | 1 to 200 characters. Required. |
| `slug` | The last part of the address. |
| `folderId` | Folder to create it in. Default: the top level. |
| `fields` | Field values by field key. |
| `components` | The blocks, in the shape `get_schema` gives. |
| `seo` | `title` (up to 200 characters), `description` (400), `ogTitle` (200), `ogDescription` (400). |
| `environment`, `region`, `locale` | See scope arguments. |

Returns the page summary. Landing pages, popups, banners and shop products are refused here; use `draft_special_content`.

The address is made from the folder and the slug, so a page named Home at the top level gets `/home`. Only a person can give a page another address, such as `/` for the home page, with **URL override** in the editor. To find the home page, look for the page whose `url` is `/`. See [Edit a page](https://docs.bifrostorbit.com/cms/editors/edit-a-page/).

### update_draft

Changes a page's name, fields or blocks in its draft.

| Argument | |
| --- | --- |
| `id` | Required. |
| `docVersion` | The `docVersion` from `get_page`. Required. |
| `name` | 1 to 200 characters. |
| `fields` | The page's fields. Replaces all of the draft's fields, so send every field, not only the ones that change. |
| `components` | The whole block list. Replaces the draft's blocks. |

Returns the page summary and the new `docVersion`. If someone changed the page since it was read, nothing is saved and the answer gives the version it is now at, such as *This page has changed since version 3 was read; it is now at version 4*. Read the page again to see the other change, then redo yours with that version.

Field values are checked when the draft is saved, in the page's own fields and in every block: fields the type or block does not have, choices that are not on the list, and text or numbers outside their limits or pattern. Every problem is returned in one answer, such as *Some fields are invalid: components[a1b2].fields.heading …*, each with its path, so they can all be fixed at once. Values that were saved before and have not changed are left alone. Blocks of a type the website does not have are all named in one answer, with the types it does have. Required fields may be left empty in a draft, but the page cannot be published until they are filled.

### update_seo_fields

Writes a page's meta title, description and Open Graph text to its draft. Only the SEO fields given change; give `null` to clear one.

| Argument | |
| --- | --- |
| `id` | Required. |
| `seo` | `title` (up to 200 characters), `description` (400), `ogTitle` (200), `ogDescription` (400). Required. |
| `docVersion` | Optional, but recommended. |

Returns the page summary, the new `docVersion` and the draft's SEO. Entries with no website address have no SEO and are refused.

### draft_special_content

Drafts the wording of landing pages (`landingPage`), popups (`popup`), banners (`banner`) and shop products (`shopProduct`): headlines, body text, FAQs, descriptions, benefits and directions.

| Argument | |
| --- | --- |
| `id` and `docVersion` | To change an existing one. |
| `contentType` and `name` | To start a new one. |
| `fields` | Only the text fields to change. Others are kept. |
| `components` | The whole block list, with existing blocks kept by their `id`. |
| `environment`, `region`, `locale` | Where to start a new one. |

Only wording may change. Schedules, targeting, tracking, styles, prices, codes, addresses and catalogue IDs are left to people, and existing blocks cannot be removed or turned into other blocks. A change that touches any of these is refused with a list of what was not allowed, such as *Only wording can be drafted here. Background is a set-up field, not wording, so an agent cannot change it.*

Returns the summary and the new `docVersion`.

### copy_to_region

Copies pages to another region or language as linked drafts, ready to adapt.

| Argument | |
| --- | --- |
| `ids` | 1 to 50 page ids, all from the same region and language. |
| `target` | `{ "environment", "region", "locale" }` to copy to. |
| `includeMedia` | Default `true`. |

Returns how many folders and pages were copied, and the target. The folders the pages sit in are created in the target if needed. Copies are unpublished drafts marked **Drafted by AI**, so they need a person's approval like any other agent draft. Adapt them with `update_draft`, then send them for review. The target must be writable for the agent, and must be a different region or language from the source. There is no tool for copying a page within the same language; a person does that with **Duplicate** in the content list.

## Images

### upload_media

Uploads an image into the **AI uploads** folder of the media library, which is created if it does not exist.

| Argument | |
| --- | --- |
| `filename` | Required. |
| `mimeType` | `image/jpeg`, `image/png`, `image/webp`, `image/avif` or `image/gif`. |
| `dataBase64` | The image, base64 encoded. At most 3 MB. |
| `alt` | Alt text by language, such as `{ "de-DE": "A shop floor" }`. Required. |
| `title` | Title by language. |

Language codes must be ones the website has, in any environment or region; `list_scopes` lists them. Others are refused with the codes the website has, and nothing is uploaded.

Returns the image's details, including its id to use in fields and blocks. JPEG and PNG images are converted to WebP for the website. The answer then shows the new `mimeType` with `convertedFrom`, the type that was sent, and a short `note`:

```json
{ "id": "6660a3f19b1e8a0012ab3700", "filename": "hiking-boots.webp", "mimeType": "image/webp", "convertedFrom": "image/png", "note": "Converted from image/png to image/webp for the website." }
```

If the same image is already in the library, that one is returned instead of a copy. When it is live on pages the agent may not change, its text is left as it was and the answer says so in `textNotChanged`.

### set_image_text

Sets an image's alt text, title or caption by language. Nothing else about the image changes.

| Argument | |
| --- | --- |
| `mediaId` | Required. |
| `alt`, `title`, `caption` | Text by language, up to 500 characters each, such as `{ "de-DE": "A shop floor" }`. |

Only the languages given change; the others are kept. An empty string or `null` removes that language. Language codes must be ones the website has, in any environment or region; others are refused with the codes the website has, such as *"nb-NO" is not a language of this site. Use de-CH*.

Images belong to the media library, not to a page's draft, and are shared by every environment: new image text is not reviewed and is used at once wherever the image appears, including published pages. So when an image is live on a page in Production and the website does not allow agent drafts there, or live in a region the agent's key may not change, the change is refused and a person makes it under **Library › Media**.

## Checks

### get_seo_issues

The SEO dashboard for one region and language: the health score and every issue grouped by type, with the pages affected. Takes the scope arguments.

### run_page_checks

Runs the SEO checks and the pre-publish checks, such as missing alt text and image consent, on a page's draft. Takes `id`.

```json
{
  "seoScore": 82,
  "seoIssues": [ … ],
  "publishBlockers": [
    { "kind": "required", "path": "components[a1b2].fields.heading", "message": "…" },
    { "kind": "missing_alt", "mediaId": "6660a3f19b1e8a0012ab3700", "filename": "hiking-boots.webp", "message": "…" }
  ]
}
```

`publishBlockers` lists what stops the page being published: `required` for an empty required field, on the page or in a block; `invalid` for a saved value the schema no longer accepts; and `missing_alt`, `missing_subtitles` or `consent` for images and videos. Agents should fix what they can before sending a page for review: fields with `update_draft`, alt text with `set_image_text`.

## Review

### add_comment

Comments on a review.

| Argument | |
| --- | --- |
| `reviewId` | The review to comment on. |
| `pageId` | Instead of `reviewId`: comments on the page's most recent review. |
| `body` | 1 to 4,000 characters. Required. |

### submit_for_review

Sends a page's draft to the review queue with a note.

| Argument | |
| --- | --- |
| `id` | Required. |
| `message` | What changed and why, 1 to 2,000 characters. Required. |
| `reviewerIds` | Up to 20 people on the website to ask. Optional. |

```json
{ "reviewId": "6660a3f19b1e8a0012ab3511", "status": "pending", "steps": ["Review"] }
```

`steps` names the sign-offs the page needs, which depend on the content type and region, such as **Review**, and **Brand** when a brand block changes. A newer submission replaces an open review of the same page. While the review is open, agents cannot change the page. When the last step is approved, the page is published if the approver can publish; otherwise it waits for someone who can. A page with no unpublished changes is refused with *There are no changes to review*.

## Tidy up

### discard_draft

Moves a page or entry that the agent created through this connection to the bin, such as a test page or a draft that is no longer wanted. Landing pages, popups and banners count too.

| Argument | |
| --- | --- |
| `id` | Required. |

```json
{ "id": "665f1c2e9b1e8a0012ab34cd", "name": "Test page", "inTrash": true, "note": "Moved to the bin, exactly as if a person had deleted it. A person can restore it from the bin." }
```

It is refused, with the reason, when:

- another key or connection, or a person, created it
- it has ever been published, in this or any earlier state, or is scheduled to go live
- it is in review, or approved and waiting to be published
- it is in a release
- someone has it open in the editor
- a person or another connection has changed it since it was created
- the person cannot delete pages, or this type of entry, themselves
- the agent may only read where the page lives, such as Production without **Allow drafts in production**

A copy the agent makes with `copy_to_region` counts as created by it. A copy a person makes of an agent's draft does not.

### discard_upload

Moves an image that the agent uploaded through this connection to the bin.

| Argument | |
| --- | --- |
| `mediaId` | Required. |

Returns the same shape as `discard_draft`. It is refused when the image is used anywhere: in a page's draft or live version, in a page in the bin, in an earlier published version of a page, or in the website's settings. The answer lists where, such as *"hiking-boots.webp" is in use, so it cannot be discarded. It is used in: Hiking boots (staging, de)*. Remove it from those drafts first, or leave it for a person. It is also refused when someone else uploaded it, when a person or another connection has changed it, and when the person cannot delete files themselves. If `upload_media` returned an image that was already in the library, that image is not the agent's and cannot be discarded.

## Typical workflows

### Draft a new page

1. `get_schema` to learn the content types and blocks.
2. `list_pages` to find the folder, such as **Services**.
3. `create_draft` with the content type, name, fields, blocks and SEO.
4. `run_page_checks` and fix what it finds with `get_page` and `update_draft`.
5. `submit_for_review` with a note.

### Update an existing page and send it for review

1. `search_content` with `query: "hiking boots"` to find `/products/hiking-boots`.
2. `get_page` for its fields, blocks and `docVersion`.
3. `update_draft` with the changed fields and blocks and that `docVersion`.
4. `update_seo_fields` if the title or description should change.
5. `submit_for_review` with what changed and why.

### Find pages that need work

1. `get_seo_issues` for the region and language.
2. For each page affected, `get_page`, then `update_seo_fields` or `update_draft`.
3. `submit_for_review` for each page changed.

### Copy and translate

1. `list_scopes` to find the target region and language.
2. `copy_to_region` with the page ids and the target.
3. `search_content` in the target to find the copies.
4. `get_page` and `update_draft` to translate or adapt each copy.
5. `submit_for_review` for each copy.

### Change the wording of a banner or popup

1. `search_content` with `contentType: "banner"` or `"popup"`.
2. `get_page` for its fields and `docVersion`.
3. `draft_special_content` with `id`, `docVersion` and only the text fields that change.
4. `submit_for_review`.

### Clean up after a test

1. `create_draft` and `upload_media` as usual, for example a page named *Test page* and an image.
2. If the page uses the image, take it out of the page with `update_draft` before you discard anything: an image on a page in the bin still counts as in use.
3. `discard_draft` with the page id. Do not send test pages for review: a page in review cannot be discarded.
4. `discard_upload` with the image id.

Both go to **Bin**, where a person can restore them.

## Limits

| Limit | Value |
| --- | --- |
| Requests | 60 a minute for each key or signed-in connection. Every MCP request counts, including listing tools. Over the limit, requests get `429` with `Retry-After`. |
| Request size | 5 MB |
| Image upload | 3 MB, JPEG, PNG, WebP, AVIF or GIF |
| Search results | Up to 100 a call |
| Pages copied | Up to 50 a call |
| Names | 200 characters |
| Review note | 2,000 characters |
| Comment | 4,000 characters |
| Connections | Set by the CMS Orbit plan, counting active keys and signed-in connections across the organisation: 2 on Starter, 10 on Growth, no limit on Enterprise. |

## Errors tools return

| Answer | What to do |
| --- | --- |
| *This page has changed since version … was read; it is now at version …* | Read the page again with `get_page` and redo the change with the version given. |
| *This page is in review, so an agent cannot change it until the review is decided* | Wait for the review, or comment on it with `add_comment`. |
| *This page is scheduled to go live* or *is in a scheduled release* | People have planned this change; agents cannot change it. |
| *Someone else is editing this page* | Try again when they have finished. |
| *Your role (…) cannot perform "…"* | The scope is read only for the agent, or the person cannot do this. Check `list_scopes`. |
| *Agents cannot change prices, promotions or quotas* | The change touched a field set to protect a price or a promotion. Leave those fields as they are. |
| *Use draft_special_content for … entries* | The entry is a landing page, popup, banner or shop product. |
| *Only wording can be drafted here. …* | Change only the text fields named in the schema. |
| *… is not a language of this site* | Use one of the language codes the answer lists. |
| *This image is live on pages you may not change* | Ask a person to change the image's text under **Library › Media**. |
| *A copy must go to another region or language* | Copy to a different region or language. A person can duplicate pages within one language. |
| *… not found* | The id or key does not exist on this website, or the item is in the bin. |
| *Some fields are invalid: …* or *Invalid input: …* | The answer names each field, by a path such as `fields.title` or `components[a1b2].fields.heading`, and what is wrong with it. Fix them all and save again. |
| *Unknown component type: …* | Use the block types the answer lists, which are the ones in `get_schema`. |
| *There are no changes to review* | The draft is the same as what is live. |
| *Images may be at most 3 MB* | Send a smaller image. |
| *… was not created through this agent connection* or *was not uploaded through this agent connection* | A person, an older connection or a copy made by a person created it. Leave it, or ask a person to delete it. |
| *… was created through another agent connection* | Only that key or connection, or a person, can discard it. |
| *… has been published* | It has been live, so a person decides whether to take it down. |
| *… is in review* or *has been approved in review* | Comment on the review with `add_comment` to suggest discarding it. |
| *… is in the release …* | People have planned it; leave it to them. |
| *… has been changed by … since you created it* | A person worked on it, so their work is never discarded by an agent. |
| *… is in use, so it cannot be discarded* | The answer lists where. Remove the image from those drafts, or leave it. |
| *… cannot move this to the bin themselves* | The person the agent acts for may not delete pages or files. |

Connection errors, such as `401`, `403` and `429`, are explained in [Connect an AI agent over MCP](https://docs.bifrostorbit.com/cms/developers/connect-an-ai-agent/).

## What is recorded

- **On the page and the image:** the **Drafted by AI** mark, with the agent's name and the person it acted for, and which key or connection created a page or uploaded an image.
- **In review:** each review an agent sends names the agent and the person.
- **In the audit log:** every change an agent makes is recorded under the organisation's **Audit log**, with the agent shown as, for example, *Claude (AI agent for Jane Doe)*, or *Claude (AI agent for Jane Doe, signed in)* for a signed-in connection, and the time, IP address and client. This covers pages created, changed, copied and discarded, images uploaded, changed and discarded, folders created, reviews sent and comments.
- **Keys and settings:** creating and revoking agent keys, signing in, and changing the AI agent switches are recorded too.
- **On the key:** **Last used** on **Configuration › AI agents**.

Reading content is not recorded.
