> This page is for Tools.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.moveworks.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.moveworks.com/_mcp/server.

# File Slots

The `File` slot type enables plugins to receive file attachments from users. It is resolved only when the user interacts with the dedicated "Upload file" button in the assistant interface.

# Where You Can Use File Slots

Pass a resolved `File` object to one of two action types:

| Action type                                                             | What you can do with the file                                                                                                                                                |
| :---------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **[HTTP actions](/tool-studio/actions/http-actions/http-action-files)** | Send the uploaded file over the API to an external system — for example, attaching it to a ticket. The file is passed as a dedicated file argument, not in the request body. |
| **[LLM actions](/tool-studio/actions/llm-actions)**                     | Pass the file to the model as an `image` or `file` input so it can parse the contents — for example, extracting fields from a receipt or answering a question about a PDF.   |

> **Warning**
>
> You cannot use a `File` slot in a [Python action](/tool-studio/actions/script-actions/apithon-a-special-kind-of-python). To work with an uploaded file, use an HTTP action to send it to an API or an LLM action to read its contents.

# File Object Structure

When a an attachment is added to the File slot, it generates this object structure:

```json
{
  "file_name": string, // Name used when uploading to the external system's API
  "location": string,  // File location
	"content": string, // base-64 encoded
}
```

# Supported file extensions (case-insensitive)

(case-insensitive)

`.png`, `.jpg`, `.jpeg`, `.pdf`, `.txt`, `.csv`, `.docx`, `.xlsx`, `.xlsm`, `.xls`, `.xltx`, `.xltm`

> **Info**
>
> **Callout**: Only these extensions are allowed as ticket attachments. Attempts to upload unsupported types will fail validation.

# Upload Interface

![](https://files.readme.io/18aff6906d8fb8ac7cc9e8cd4ec4a8b335c309c22d38d1fa5b93cc0d2db71c7a-CleanShot_2025-11-12_at_17.50.422x.png)

> *Users must use the **"Upload file"** button.*

# Single vs. Multiple Files

A `File` slot resolves to exactly one file. To accept several files in a single slot, set the slot's data type to a list by checking **"Data type is expected to be a list"** when you create or edit the slot. This makes the slot a `List[File]`.

| Slot data type | Behavior                                                                                                                    |
| :------------- | :-------------------------------------------------------------------------------------------------------------------------- |
| `File`         | Resolves to a single file. If multiple files are selected, only the first is assigned to the slot and the rest are ignored. |
| `List[File]`   | Resolves to the full array of uploaded files. Use this when your plugin needs to accept more than one file.                 |

> **Info**
>
> The **"Upload file"** pop-up blocks attaching more than one file when the slot type is `File`. Set the slot to `List[File]` to enable multi-file selection.

# Limitations

| Limitation                           | Details                                                                                                                                                                                                                                                                               |
| :----------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **File size limit**                  | Maximum file size is **5MB**. Files exceeding this limit will fail to upload.                                                                                                                                                                                                         |
| **No file delivery to users**        | Files cannot be sent back to end users in chat responses.                                                                                                                                                                                                                             |
| **No content manipulation**          | Plugin logic cannot read or modify file contents beyond base64 encoding. Only an [LLM action](/tool-studio/actions/llm-actions) can parse what is inside a file; [Python actions](/tool-studio/actions/script-actions/apithon-a-special-kind-of-python) cannot accept `File` objects. |
| **Upload only via dedicated button** | Uploading files directly in chat (e.g., Slack drag-and-drop) will not populate the `File` slot — it triggers BriefMe instead. Use only the **"Upload file" pop-up** that appears when the `File` slot is requested.                                                                   |

---

# Workarounds

## Use Case: Avoid Local File Download

**Problem:**

You do not want users to download files to their machine. Instead, you want users to paste a link (e.g., from Google Drive, OneDrive, or internal file server) directly into the assistant.

**Limitation:**

The platform **cannot download** files from external URLs on behalf of the user.

**Solution:**

Use a string slot named `file_link` instead of `File`.

#### Customer API responsibility:

Your API will **need** to handle the file download from the link passed by the user.

* Download file from `file_url`
* Validate content/type
* Process as needed

> **Info**
>
> *This bypasses local upload entirely. No file is stored or transmitted through the assistant.*