# upload_link_create

Canonical HTML page: https://bitterclip.com/docs/assistants/tools/upload_link_create

Surface: default model and app

Product release: 1dce717408a55fac1047e7d779177fa3ef8ede51
Public contract commit: 1ce47f7857ae3d9b6933fe83d5c33de3ae5efc64
Public contract SHA-256: 241d47d25e4b4c1dae9d2263793874d06fc4ba7bc3c78d4cf2bc63fbb32ed7dc
Descriptor SHA-256: 885d46f3ca3939dec2ace0cd6e93611c8b3f741f2d8f7a82e0adfe1452cc9a9e
Captured: 2026-09-24T16:39:30.100Z
Source: https://app.bitterclip.com/api/v1/mcp_descriptors.json

Create a hosted BitterClip upload link for local audio or video files. Prefer this when the user wants a link or another camera operator will contribute later. Pass capture_session_id to add multiple files or a whole device folder to one footage-session chronology. A link cannot add files directly to an existing episode: create a footage session for that episode and pass its capture_session_id.

The JSON blocks below are the exact MCP descriptor projections served by Rails for the named profiles at capture time. Security schemes and resource URIs may vary by connected host.

## Default model descriptor

```json
{
  "name": "upload_link_create",
  "title": "Create an upload link",
  "description": "Create a hosted BitterClip upload link for local audio or video files. Prefer this when the user wants a link or another camera operator will contribute later. Pass capture_session_id to add multiple files or a whole device folder to one footage-session chronology. A link cannot add files directly to an existing episode: create a footage session for that episode and pass its capture_session_id.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "project_id": {
        "type": "string",
        "description": "Optional project public ID, slug, or name to attach uploads to. Omit for the default uploads project."
      },
      "project": {
        "type": "string",
        "description": "Backward-compatible project name/slug/public ID alias."
      },
      "capture_session_id": {
        "type": "string",
        "description": "Optional footage-session public ID. Every uploaded file joins that session and triggers incremental chronology analysis."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  }
}
```

## App descriptor

```json
{
  "name": "upload_link_create",
  "title": "Create an upload link",
  "description": "Create a hosted BitterClip upload link for local audio or video files. Prefer this when the user wants a link or another camera operator will contribute later. Pass capture_session_id to add multiple files or a whole device folder to one footage-session chronology. A link cannot add files directly to an existing episode: create a footage session for that episode and pass its capture_session_id.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "project_id": {
        "type": "string",
        "description": "Optional project public ID, slug, or name to attach uploads to. Omit for the default uploads project."
      },
      "project": {
        "type": "string",
        "description": "Backward-compatible project name/slug/public ID alias."
      },
      "capture_session_id": {
        "type": "string",
        "description": "Optional footage-session public ID. Every uploaded file joins that session and triggers incremental chronology analysis."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "mode": {
        "type": "string",
        "description": "\"upload_link\" when a shareable upload link is returned."
      },
      "upload_url": {
        "type": "string",
        "description": "The token-gated drop-zone page URL to give the user."
      },
      "project": {
        "type": "object",
        "description": "The resolved project the uploads land in, or null for the default project."
      },
      "capture_session": {
        "type": "object",
        "description": "Present for footage-session links: {id, title}."
      },
      "expires_at": {
        "type": "string",
        "description": "ISO8601 link expiry."
      },
      "accepted_content_types": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "max_bytes": {
        "type": "integer"
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Live Workspace descriptor

```json
{
  "name": "upload_link_create",
  "title": "Create an upload link",
  "description": "Create a hosted BitterClip upload link for local audio or video files. Prefer this when the user wants a link or another camera operator will contribute later. Pass capture_session_id to add multiple files or a whole device folder to one footage-session chronology. A link cannot add files directly to an existing episode: create a footage session for that episode and pass its capture_session_id.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "project_id": {
        "type": "string",
        "description": "Optional project public ID, slug, or name to attach uploads to. Omit for the default uploads project."
      },
      "project": {
        "type": "string",
        "description": "Backward-compatible project name/slug/public ID alias."
      },
      "capture_session_id": {
        "type": "string",
        "description": "Optional footage-session public ID. Every uploaded file joins that session and triggers incremental chronology analysis."
      }
    },
    "required": [],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "mode": {
        "type": "string",
        "description": "\"upload_link\" when a shareable upload link is returned."
      },
      "upload_url": {
        "type": "string",
        "description": "The token-gated drop-zone page URL to give the user."
      },
      "project": {
        "type": "object",
        "description": "The resolved project the uploads land in, or null for the default project."
      },
      "capture_session": {
        "type": "object",
        "description": "Present for footage-session links: {id, title}."
      },
      "expires_at": {
        "type": "string",
        "description": "ISO8601 link expiry."
      },
      "accepted_content_types": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "max_bytes": {
        "type": "integer"
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Errors

```json
[
  "invalid_input"
]
```

## Examples

```json
[]
```
