When a human is around
Hand them a browser link:create_upload_session returns a URL valid for 30 minutes. They open it, drop in
files of any size, and the files attach themselves to the post. Then:
get_post lists the attached assets.
When the client can make HTTP requests
1
Request an upload URL
request_asset_upload with kind: "image" and mimeType: "image/png"
returns { assetId, uploadUrl, expiresAt } — the URL is good for 10 minutes.2
PUT the bytes
3
Attach
attach_asset with the postId and assetId. This confirms the bytes
landed and enforces size and count limits.When it can’t
upload_asset_inline takes base64 bytes directly in the tool call — no HTTP
needed. It is capped at 5 MB decoded; anything larger returns
inline_too_large_use_presign. Follow it with attach_asset as above.
Limits worth knowing
Video and documents can be uploaded and attached, but publishing them isn’t
wired up yet — a post carrying one fails with
publishing_video_not_supported_yet. Detach it to publish the text and images.Removing one
detach_asset unlinks it while keeping the stored file, so it can go on a
different post later.