upload_image
Upload an image to ComfyUI for use in img2img, ControlNet, or IP-Adapter workflows. Accepts a source URL or base64-encoded data, returns the stored filename for LoadImage nodes.
Instructions
Upload a reference image to ComfyUI for use in img2img, ControlNet, or IP-Adapter workflows. Accepts either a source URL (will be fetched) or base64-encoded image data. Returns the stored filename for use as 'image' in workflow nodes like LoadImage.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "upload_image"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| source_url | No | URL to fetch the image from. One of source_url or image_base64 is required. | |
| image_base64 | No | Base64-encoded image data (without the data:image/... prefix). One of source_url or image_base64 is required. | |
| filename | No | Filename to save as on the ComfyUI side. Defaults to a timestamped name. | |
| overwrite | No | Replace an existing file with the same name |
Implementation Reference
- src/comfyui/client.ts:132-153 (helper)ComfyUIClient.uploadImage — sends image data as multipart/form-data to ComfyUI's /upload/image endpoint.
async uploadImage( data: Buffer | Uint8Array, filename: string, options: { overwrite?: boolean; subfolder?: string } = {}, ): Promise<UploadResult> { const form = new FormData(); const blob = new Blob([new Uint8Array(data)], { type: "image/png" }); form.append("image", blob, filename); form.append("overwrite", options.overwrite ? "true" : "false"); if (options.subfolder) form.append("subfolder", options.subfolder); const res = await fetch(`${this.baseUrl}/upload/image`, { method: "POST", body: form, }); if (!res.ok) { throw new Error( `ComfyUI image upload failed: ${res.status} ${await res.text()}`, ); } return (await res.json()) as UploadResult; } - src/comfyui/client.ts:155-168 (helper)ComfyUIClient.fetchAndUploadImage — fetches an image from a URL first, then calls uploadImage.
async fetchAndUploadImage( sourceUrl: string, filename?: string, ): Promise<UploadResult> { const res = await fetch(sourceUrl); if (!res.ok) { throw new Error( `Failed to fetch source image ${sourceUrl}: ${res.status}`, ); } const buffer = Buffer.from(await res.arrayBuffer()); const name = filename ?? deriveFilename(sourceUrl); return this.uploadImage(buffer, name); } - src/comfyui/client.ts:219-228 (helper)deriveFilename — extracts a filename from a URL or falls back to a timestamped name.
function deriveFilename(sourceUrl: string): string { try { const url = new URL(sourceUrl); const last = url.pathname.split("/").pop() ?? ""; if (last && /\.(png|jpg|jpeg|webp)$/i.test(last)) return last; } catch { // fall through } return `upload-${Date.now()}.png`; } - src/comfyui/types.ts:42-46 (helper)UploadResult interface: name, subfolder, type fields returned by the upload.
export interface UploadResult { name: string; subfolder: string; type: string; }