Skip to main content
Two tools give Concord a file. The bytes go straight to storage and never through the MCP transport, so a large video does not pass through your model’s context.

The three steps

1

prepareUpload

Pass filename, contentType, and the exact size in bytes.
You get an upload handle, an uploadUrl, the headers to send, and an expiresAt.
2

PUT the bytes

Send the raw file to uploadUrl with an HTTP PUT, passing the returned headers verbatim. Do not base64-encode. This request goes to storage, not to Concord.
3

attachUpload

Pass the upload handle from step 1. Add a chatId to attach the file to that conversation, so a following askConcord can work on it.
You get back the fileId, name, and type of the new Concord file.
Once attached, the file behaves like any upload in the web app: Concord reads briefs, works spreadsheets sheet by sheet, and previews creatives.

Constraints

If something fails

  • The PUT is refused. Almost always a size that does not match the bytes sent. Recompute the size and start again from prepareUpload.
  • attachUpload says the bytes never arrived or differ in size. The PUT failed or was truncated. Run prepareUpload again and re-upload.
  • attachUpload says storage could not be reached. The bytes may well be there. Call attachUpload again rather than re-uploading.
  • attachUpload called twice for the same upload returns the same file rather than creating a duplicate.
Ask Concord · Files in Concord