Skip to main content
Glama

Create Upload Tool

create_upload

Create an upload for a video, audio file, or image the user wants to process. Returns an opaque video id and a presigned PUT upload_url, NOT a completed upload. Upload the actual bytes with one HTTP PUT before calling another tool. In a client with authorized local file access, use e.g. curl -X PUT --upload-file ./source.mp4 "<upload_url>". Never invent file bytes or download URLs, or claim an upload succeeded without a successful PUT. Clients without file-transfer capability must use an existing OpenClip file or ask the user to upload through the matching tool at openclip.app.

After uploading: use caption_video for a whole video up to 3 minutes; complete_upload ONLY for the paid video clipping pipeline; transcribe for video/audio; edit_video, convert_media, or extract_thumbnails for video; edit_image for an image (pass the returned video id as its file). Media utilities and caption_video do NOT need complete_upload. Uploading alone does not start processing or spend credits. Single PUT limit: 5 GB; each processing tool also enforces its own account and file limits.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sizeNoOptional file size in bytes, up to 5 GB.
filenameYesSource filename including extension.
content_typeYesSource MIME type, e.g. video/mp4, audio/mpeg, or image/png. Generic MIME types such as application/octet-stream are resolved from the filename.
audio_languageNoOptional spoken-language code, e.g. en.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
nextYes
videoYes
methodYes
uploadedYes
max_bytesYes
upload_urlYes
expires_in_secondsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • changedInput schema / properties / audio_language / description
      Previous value: -"Optional spoken-language code of the video, e.g. \"en\"."New value: +"Optional spoken-language code, e.g. en."
    • changedInput schema / properties / content_type / description
      Previous value: -"Video MIME type, e.g. \"video/mp4\". Required unless file.mime_type is present."New value: +"Source MIME type, e.g. video/mp4, audio/mpeg, or image/png. Generic MIME types such as application/octet-stream are resolved from the filename."
    • removedInput schema / properties / file
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "The attached video to import. Use its ChatGPT file-reference string; the host supplies download metadata automatically.",
      -  "properties": {
      -    "download_url": {
      -      "type": "string"
      -    },
      -    "file_id": {
      -      "type": "string"
      -    },
      -    "file_name": {
      -      "type": "string"
      -    },
      -    "mime_type": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "download_url",
      -    "file_id"
      -  ],
      -  "type": "object"
      -}
    • changedInput schema / properties / filename / description
      Previous value: -"Video filename, e.g. \"interview.mp4\". Required unless file.file_name is present."New value: +"Source filename including extension."
    • changedInput schema / properties / size / description
      Previous value: -"Optional file size in bytes. Rejected if over the 5 GB single-upload limit."New value: +"Optional file size in bytes, up to 5 GB."
    • addedInput schema / required
      Added value: +[
      +  "filename",
      +  "content_type"
      +]
    • removedOutput schema / properties / size
      Removed value: -{
      -  "type": "integer"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "video",
      -  "uploaded",
      -  "max_bytes",
      -  "next"
      -]New value: +[
      +  "video",
      +  "uploaded",
      +  "upload_url",
      +  "method",
      +  "expires_in_seconds",
      +  "max_bytes",
      +  "next"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / file / description
      Previous value: -"ChatGPT attachment to import directly. Use the file object supplied by ChatGPT."New value: +"The attached video to import. Use its ChatGPT file-reference string; the host supplies download metadata automatically."
  3. Changed5 schema fields changed
    • changedInput schema / properties / content_type / description
      Previous value: -"The file MIME type, e.g. \"video/mp4\"."New value: +"Video MIME type, e.g. \"video/mp4\". Required unless file.mime_type is present."
    • addedInput schema / properties / file
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "ChatGPT attachment to import directly. Use the file object supplied by ChatGPT.",
      +  "properties": {
      +    "download_url": {
      +      "type": "string"
      +    },
      +    "file_id": {
      +      "type": "string"
      +    },
      +    "file_name": {
      +      "type": "string"
      +    },
      +    "mime_type": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "download_url",
      +    "file_id"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / filename / description
      Previous value: -"The file name, e.g. \"interview.mp4\" (used for the title and extension)."New value: +"Video filename, e.g. \"interview.mp4\". Required unless file.file_name is present."
    • removedInput schema / required
      Removed value: -[
      -  "filename",
      -  "content_type"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "expires_in_seconds": {
      +      "type": "integer"
      +    },
      +    "max_bytes": {
      +      "type": "integer"
      +    },
      +    "method": {
      +      "type": "string"
      +    },
      +    "next": {
      +      "type": "string"
      +    },
      +    "size": {
      +      "type": "integer"
      +    },
      +    "upload_url": {
      +      "type": "string"
      +    },
      +    "uploaded": {
      +      "type": "boolean"
      +    },
      +    "video": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "video",
      +    "uploaded",
      +    "max_bytes",
      +    "next"
      +  ],
      +  "type": "object"
      +}
  4. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, openWorldHint=true, destructiveHint=false); the description supplies the operationally critical facts beyond that: the return is not a completed upload, a separate HTTP PUT is required, the 5 GB PUT limit, that uploading alone spends no credits or starts no processing, and an explicit anti-fabrication warning. That is substantial context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the single most important fact (this returns an id and upload URL, not a completed upload), and most sentences carry actionable information. It is dense and runs long, with some safety boilerplate ('Never invent file bytes') that could be tightened, but nothing is truly wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description goes further by explaining the two-step PUT workflow and the downstream tool routing, which an output schema alone could not express. Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the four parameters (size, filename, content_type, audio_language) are already fully documented in the schema. The description adds essentially no per-parameter detail beyond restating the 5 GB limit and referring to the returned `video` id being passed as another tool's `file` argument. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create an upload for a video, audio file, or image') and immediately disambiguates from the sibling complete_upload by clarifying it does not produce a finished upload. An agent can tell exactly what this produces (an opaque `video` id plus a presigned PUT URL) without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: which follow-up tool to call per media type (caption_video, complete_upload, transcribe, edit_video, convert_media, extract_thumbnails, edit_image), an explicit when-not ('complete_upload ONLY for the paid video clipping pipeline', 'Media utilities and caption_video do NOT need complete_upload'), and a fallback path for clients without file transfer. This is a model of alternative selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources