Skip to main content
Writes an artifact and, alongside it, the card that makes it findable — see Artifacts for how the two connect. Always writes to the org’s shared memory; there is no agent-scoped, private artifact. Three behaviours, selected by which arguments are present.

Inline: content given

One call. For text up to 64KB — the only write path available to clients that speak MCP but cannot make an arbitrary HTTP request, such as ChatGPT connectors and Claude.ai custom connectors.

Presigned upload: content omitted, mime_type and size_bytes given

For larger or binary content. Returns an upload URL rather than storing anything yet.
upload_url is signed for exactly the size_bytes you declared — an upload of any other size is rejected at the storage layer, so declare the real size. Upload the bytes with an HTTP PUT, then confirm.

Confirm: artifact_id given

Call again with the artifact_id from the presigned response, no other arguments needed.
The server measures the uploaded object itself at confirm time — size and checksum both — and enforces the plan’s limits against that measured value, not the size_bytes you declared when requesting the URL. Confirm is what activates the artifact; nothing is discoverable through recall until it succeeds.

Parameters

string
required
Short name for the artifact. Up to 200 characters.
string
required
One line describing what this is. Other agents find the artifact by this text, via the card — write it as the search phrase you would want to match. Up to 500 characters.
'document' | 'record' | 'file'
required
document for prose, record for JSON, file for binary content.
string
Inline text, up to 64KB. Omit to use the presigned upload path instead.
string
MIME type of the upload. Required when content is omitted.
integer
Byte size of the upload. Required when content is omitted — the upload URL is signed for exactly this many bytes.
string
Optional space slug. Omit to file to the org’s default store.
string
Optional project identifier. See Scope for how project resolution works.
string
Id of an artifact this one replaces. The superseded version is retired and its card hidden, the same way a superseded memory stops surfacing in recall.
string
Confirms an upload started earlier. Pass only this (and no other argument) to confirm.

Limits

content over 64KB is rejected outright, with a message pointing at the presigned path — it does not silently truncate or fall back.
Both the inline and presigned paths are checked against the plan’s per-file limit and the org’s remaining pool before anything is stored. See storage limits.
A presigned upload is one HTTP PUT, so size_bytes above 100MB is rejected with too_large_for_single_upload. Multipart upload is not available yet, so an artifact larger than that cannot be stored in this release.This only affects plans whose per-file limit is above 100MB — on every other plan the plan limit is reached first and the error is file_too_large. Nothing is reserved when a request is refused.
A full pool rejects further artifact_put calls. It does not affect artifact_get or recall — existing artifacts stay readable.