# Uploads

> Upload your own images, audio and video to Nodaro from any MCP client with an in-chat picker, a browser upload link, or a presigned URL from a shell.

Source: https://nodaro.ai/docs/mcp/tools/uploads

The **upload tools** bring your own files into Nodaro, so an assistant can use a photo, a voice recording or a clip in the next generation. There are three ways to upload: an in-chat picker, a link you open in the browser, and a presigned URL for clients that can run shell commands. Every upload tool needs the `assets:write` permission, and uploading costs no credits.

## Which method to use

| Method | Tools | Works in | How it works |
| --- | --- | --- | --- |
| In-chat picker | `upload_image_widget`, `upload_audio_widget`, `upload_video_widget` | Clients that display MCP Apps, such as Claude on the web | A file picker opens inside the chat. The public URL goes back to the chat on its own. |
| Browser link | `request_image_upload`, `request_audio_upload`, `request_video_upload` | Every client | You open a Nodaro link in your browser and drop the file there. |
| Presigned URL | `prepare_image_upload`, `prepare_audio_upload`, `prepare_video_upload` | Clients with shell access, such as Cursor, Cline, Claude Desktop and Claude Code | The assistant sends the file itself with one `curl` command. |

When a file already has a public URL, for example a result of an earlier job, pass that URL directly and skip the upload.

## `upload_image_widget`

Opens a file picker for images inside the chat. On a phone, the picker opens the camera or the photo library. The widget uploads the files and announces their public URLs back to the chat, so you only tap the picker once. `upload_audio_widget` and `upload_video_widget` work the same way for audio and video.

**Permission:** `assets:write`. **Credits:** free.

| Parameter | Type | Notes |
| --- | --- | --- |
| `max_files` | integer | How many files the picker accepts, from 1 to 10. Default `1`. Use more for flows such as several reference photos of one person. |
| `purpose` | string | A short label shown on the upload card, up to 120 characters, for example `product image for the catalog app`. It also reminds the assistant what the file is for. |

**Returns:** `uploads`, a list of `{ upload_url, public_url }` pairs, plus `upload_url` and `public_url` for the first file. A client that does not show the picker can still show these as plain links.

## `request_image_upload`

Returns a short Nodaro link that you open in any browser to drop an image. It works in every client and at any file size, because the file travels through your own browser. `request_audio_upload` and `request_video_upload` do the same for audio and video.

**Permission:** `assets:write`. **Credits:** free.

This tool has no parameters.

**Returns:** `upload_page_url`, the page to open, and `public_url`, the address the file will have. The public URL is known in advance, so the assistant can use it in the next call once you confirm that the upload finished.

## `prepare_image_upload`

Returns a presigned upload URL that the assistant sends the file to with `curl`. The file never passes through the conversation, so its size does not matter. `prepare_audio_upload` and `prepare_video_upload` do the same for audio and video.

**Permission:** `assets:write`. **Credits:** free.

| Parameter | Type | Notes |
| --- | --- | --- |
| `mime_type` | string | **Required.** The type of the file you will send. |

| Tool | Accepted `mime_type` values |
| --- | --- |
| `prepare_image_upload` | `image/png`, `image/jpeg`, `image/webp`, `image/avif`, `image/heic`, `image/heif` |
| `prepare_audio_upload` | `audio/mpeg`, `audio/mp4`, `audio/wav`, `audio/x-wav`, `audio/webm`, `audio/ogg`, `audio/flac`, `audio/x-flac`, `audio/aac`, `audio/x-m4a` |
| `prepare_video_upload` | `video/mp4`, `video/webm`, `video/quicktime`, `video/x-matroska` |

**Returns:** `upload_url`, valid for 1 hour, and `public_url`. The assistant uploads the file with:

```bash
curl -X PUT --data-binary @path/to/file -H 'Content-Type: image/png' '<upload_url>'
```

Then it passes `public_url` to the next tool, for example as `image_url`.

**Not for Claude on the web:** 
The presigned upload fails in Claude on the web and in the Claude Android app, because they cannot reach the storage host. Use the in-chat picker or the browser link there.

## After the upload

- **Pass the public URL** to any tool that takes media, such as `modify_image`, `animate_image`, `lip_sync` or `add_captions`.
- **Find earlier uploads** with [`browse_uploads`](https://nodaro.ai/docs/mcp/tools/gallery-and-assets#browse_uploads), which lists the files you uploaded, separate from the results Nodaro generated.
- **Show a logo in a narrated video.** The brand logo of the [Video Director](https://nodaro.ai/docs/mcp/video-director) must be an image uploaded to Nodaro, so upload it with one of these tools first.

## Frequently asked questions

### Which upload tool works in every MCP client?

The request upload tools. request_image_upload, request_audio_upload and request_video_upload return a link that you open in your own browser to drop the file, so they work in every client at any file size.

### Why does prepare_image_upload fail in Claude on the web?

The presigned upload needs a client that can send the file itself with a shell command. Claude on the web and the Claude Android app cannot reach the storage host, so use the upload picker or the request upload link there.

### Can I upload several reference photos at once?

Yes. Pass max_files, from 1 to 10, to upload_image_widget. The picker then accepts that many files and returns one public URL for each.

### How do I reuse a file I uploaded earlier?

Ask the assistant to call browse_uploads. It lists your uploads with their URLs, which you can pass to any generation tool.
