# Artifacts and the Asset Library





An [artifact](/concepts#artifact) is the lasting result of an agent run:
something a human can open, review, edit and ship. A draft or an image is an
artifact; a chat answer is not.

<Frame caption="Agent output, each row carrying the state it is waiting in.">
    <img alt="The artifacts list" src="__img0" />
</Frame>

## The List [#the-list]

Four columns: **Artifact Name**, **Agent**, **Status**, **Updated**.

* **Agent** names the agent that produced the row, so you can trace a piece back
  to the run behind it.
* Under the title sits the finding that prompted it: the
  [competitor agent's](/platform/campaign-agents/competitor-agent) tag
  (`pricing_change`, `positioning_shift`, `product_movement`, `customer_signal`,
  `mentions_you`) and the one-line reason it mattered.
* **Status** is the review state: draft, in review, changes requested, approved,
  published. See
  [Review and publish](/platform/campaign-agents/review-and-publish).

## The Asset Library [#the-asset-library]

Images and files live in the environment's asset library, not on the entry that
first used them. An entry's image field points at an `assetId`, so the same
image can be used by several entries without being uploaded again.

Uploading takes three parts: ask for a presigned URL, `PUT` the bytes, then
confirm. A large file never round-trips through the API. The first and last
parts are [MCP tools](/mcp-server/tools#cms): `cms_create_asset_upload_url`
(`filename`, `mimeType`, `sizeBytes`) then `cms_confirm_asset_upload`.

<Tip>
  Set `alt&#x60; when you attach an image. It is far easier than going back for it
  later. From Slack: &#x2A;"upload this to the CMS asset library with alt text and set
  it on the post"*.
</Tip>

## Finding Them Later [#finding-them-later]

* **Filter over MCP.** `list_blogs` takes a `state` filter and a `search` term,
  which is the quickest way to answer "what is sitting in review".
* **Cluster them.** `assign_blog_cluster` assigns or clears a strategy cluster
  on a piece, so "which campaign was this for" is recorded on the artifact
  rather than in someone's memory.
* **Archive rather than delete.** `archive_blog` is reversible and also
  unarchives; `cms_delete_entry` takes the revision history with it.

[Traffic analytics](/platform/traffic/analytics) shows what the artifact
produced once it was live.
