Default model tools

output_public_url

Create public MP4 review and download links

Creates expiring public review and direct-download URLs for one exact finished BitterClip render. The review URL is the practical human handoff; download_url remains the primitive for external services that ingest a public video URL (captioning/styling connectors like Submagic, Zapier steps, publishing tools). It takes exactly ONE target: episode_id for an Episode/derived-clip handle, OR render_id for a ready render artifact alone; never both. A derived clip's comp_... handle goes in episode_id. This tool never starts or retries rendering: render_not_ready means render_status has not yet reported the render_create lifecycle ready. Repeating the call for the same ready render is safe and does not enqueue or mutate a render; it only returns fresh expiring bearer URLs. A later render invalidates these links rather than silently showing a different cut. A UI-supplied expected_render_generation makes a stale card fail instead of sharing a newer Render. title and dictionary give a receiving service context for download_url.

Surface: Default model and app

Product release 185ad8f4adfa21ae055b5bd6f97968d9044480d1
Public contract commit d2ab41fab4088c07c0f6b924fa4f3c63481b936a
Public contract SHA-256 2365c73c2aef7b9f85e8434d8e29ea29f40824bc3a46a72a356155ea328757fc
Captured 2026-10-29T03:35:56.855Z. Review or improve this contract on GitHub.

These blocks show the complete MCP descriptors captured from serving Rails. Security schemes and resource URIs can differ by connected host.

Default model descriptor

{
  "name": "output_public_url",
  "title": "Create public MP4 review and download links",
  "description": "Creates expiring public review and direct-download URLs for one exact finished BitterClip render. The review URL is the practical human handoff; download_url remains the primitive for external services that ingest a public video URL (captioning/styling connectors like Submagic, Zapier steps, publishing tools). It takes exactly ONE target: episode_id for an Episode/derived-clip handle, OR render_id for a ready render artifact alone; never both. A derived clip's comp_... handle goes in episode_id. This tool never starts or retries rendering: render_not_ready means render_status has not yet reported the render_create lifecycle ready. Repeating the call for the same ready render is safe and does not enqueue or mutate a render; it only returns fresh expiring bearer URLs. A later render invalidates these links rather than silently showing a different cut. A UI-supplied expected_render_generation makes a stale card fail instead of sharing a newer Render. title and dictionary give a receiving service context for download_url.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "episode_id": {
        "type": "string",
        "description": "Single target for an Episode or derived-clip composition ID such as comp_...; recording handles src_... resolve to their episode-of-one. Not combined with render_id."
      },
      "render_id": {
        "type": "string",
        "description": "Single target for a ready rart_... render artifact from render_status. Not combined with episode_id."
      },
      "expires_in_days": {
        "type": "integer",
        "minimum": 1,
        "maximum": 14,
        "description": "Link lifetime in days. Default 7; minimum 1, maximum 14."
      },
      "expected_render_generation": {
        "type": "string",
        "description": "Optional opaque optimistic precondition from an Outputs result. If that exact rendered generation changed, this call fails instead of sharing a newer cut."
      }
    },
    "required": [],
    "additionalProperties": false,
    "oneOf": [
      {
        "required": [
          "episode_id"
        ],
        "not": {
          "required": [
            "render_id"
          ]
        }
      },
      {
        "required": [
          "render_id"
        ],
        "not": {
          "required": [
            "episode_id"
          ]
        }
      }
    ]
  },
  "annotations": {
    "title": "Create public MP4 review and download links",
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": true
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  }
}

App descriptor

{
  "name": "output_public_url",
  "title": "Create public MP4 review and download links",
  "description": "Creates expiring public review and direct-download URLs for one exact finished BitterClip render. The review URL is the practical human handoff; download_url remains the primitive for external services that ingest a public video URL (captioning/styling connectors like Submagic, Zapier steps, publishing tools). It takes exactly ONE target: episode_id for an Episode/derived-clip handle, OR render_id for a ready render artifact alone; never both. A derived clip's comp_... handle goes in episode_id. This tool never starts or retries rendering: render_not_ready means render_status has not yet reported the render_create lifecycle ready. Repeating the call for the same ready render is safe and does not enqueue or mutate a render; it only returns fresh expiring bearer URLs. A later render invalidates these links rather than silently showing a different cut. A UI-supplied expected_render_generation makes a stale card fail instead of sharing a newer Render. title and dictionary give a receiving service context for download_url.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "episode_id": {
        "type": "string",
        "description": "Single target for an Episode or derived-clip composition ID such as comp_...; recording handles src_... resolve to their episode-of-one. Not combined with render_id."
      },
      "render_id": {
        "type": "string",
        "description": "Single target for a ready rart_... render artifact from render_status. Not combined with episode_id."
      },
      "expires_in_days": {
        "type": "integer",
        "minimum": 1,
        "maximum": 14,
        "description": "Link lifetime in days. Default 7; minimum 1, maximum 14."
      },
      "expected_render_generation": {
        "type": "string",
        "description": "Optional opaque optimistic precondition from an Outputs result. If that exact rendered generation changed, this call fails instead of sharing a newer cut."
      }
    },
    "required": [],
    "additionalProperties": false,
    "oneOf": [
      {
        "required": [
          "episode_id"
        ],
        "not": {
          "required": [
            "render_id"
          ]
        }
      },
      {
        "required": [
          "render_id"
        ],
        "not": {
          "required": [
            "episode_id"
          ]
        }
      }
    ]
  },
  "annotations": {
    "title": "Create public MP4 review and download links",
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": true
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ],
    "ui": {
      "visibility": [
        "model",
        "app"
      ]
    },
    "openai/widgetAccessible": true
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "review_url": {
        "type": "string",
        "description": "Public, expiring review page for this exact Render."
      },
      "download_url": {
        "type": "string",
        "description": "Public, expiring direct-download MP4 URL."
      },
      "watch_url": {
        "type": "string",
        "description": "Compatibility alias for review_url."
      },
      "title": {
        "type": "string",
        "description": "Episode/clip title, for the receiving service."
      },
      "content_type": {
        "type": "string",
        "enum": [
          "video/mp4"
        ]
      },
      "duration_seconds": {
        "type": [
          "number",
          "null"
        ]
      },
      "size_bytes": {
        "type": [
          "integer",
          "null"
        ]
      },
      "render_generation": {
        "type": "string",
        "description": "Opaque identity for the exact rendered bytes and poster bound to these URLs."
      },
      "expires_at": {
        "type": "string",
        "description": "ISO8601 expiry timestamp."
      },
      "dictionary": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Account, project, speaker, and brand names a captioning service should preserve."
      }
    },
    "required": [],
    "additionalProperties": false
  }
}

Live Workspace descriptor

{
  "name": "output_public_url",
  "title": "Create public MP4 review and download links",
  "description": "Creates expiring public review and direct-download URLs for one exact finished BitterClip render. The review URL is the practical human handoff; download_url remains the primitive for external services that ingest a public video URL (captioning/styling connectors like Submagic, Zapier steps, publishing tools). It takes exactly ONE target: episode_id for an Episode/derived-clip handle, OR render_id for a ready render artifact alone; never both. A derived clip's comp_... handle goes in episode_id. This tool never starts or retries rendering: render_not_ready means render_status has not yet reported the render_create lifecycle ready. Repeating the call for the same ready render is safe and does not enqueue or mutate a render; it only returns fresh expiring bearer URLs. A later render invalidates these links rather than silently showing a different cut. A UI-supplied expected_render_generation makes a stale card fail instead of sharing a newer Render. title and dictionary give a receiving service context for download_url.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "episode_id": {
        "type": "string",
        "description": "Single target for an Episode or derived-clip composition ID such as comp_...; recording handles src_... resolve to their episode-of-one. Not combined with render_id."
      },
      "render_id": {
        "type": "string",
        "description": "Single target for a ready rart_... render artifact from render_status. Not combined with episode_id."
      },
      "expires_in_days": {
        "type": "integer",
        "minimum": 1,
        "maximum": 14,
        "description": "Link lifetime in days. Default 7; minimum 1, maximum 14."
      },
      "expected_render_generation": {
        "type": "string",
        "description": "Optional opaque optimistic precondition from an Outputs result. If that exact rendered generation changed, this call fails instead of sharing a newer cut."
      }
    },
    "required": [],
    "additionalProperties": false,
    "oneOf": [
      {
        "required": [
          "episode_id"
        ],
        "not": {
          "required": [
            "render_id"
          ]
        }
      },
      {
        "required": [
          "render_id"
        ],
        "not": {
          "required": [
            "episode_id"
          ]
        }
      }
    ]
  },
  "annotations": {
    "title": "Create public MP4 review and download links",
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": true
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "review_url": {
        "type": "string",
        "description": "Public, expiring review page for this exact Render."
      },
      "download_url": {
        "type": "string",
        "description": "Public, expiring direct-download MP4 URL."
      },
      "watch_url": {
        "type": "string",
        "description": "Compatibility alias for review_url."
      },
      "title": {
        "type": "string",
        "description": "Episode/clip title, for the receiving service."
      },
      "content_type": {
        "type": "string",
        "enum": [
          "video/mp4"
        ]
      },
      "duration_seconds": {
        "type": [
          "number",
          "null"
        ]
      },
      "size_bytes": {
        "type": [
          "integer",
          "null"
        ]
      },
      "render_generation": {
        "type": "string",
        "description": "Opaque identity for the exact rendered bytes and poster bound to these URLs."
      },
      "expires_at": {
        "type": "string",
        "description": "ISO8601 expiry timestamp."
      },
      "dictionary": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Account, project, speaker, and brand names a captioning service should preserve."
      },
      "workspace_binding": {
        "type": "object",
        "properties": {
          "schema": {
            "type": "string",
            "enum": [
              "bitterclip.workspace-binding.v2"
            ]
          },
          "mode": {
            "type": "string",
            "enum": [
              "live_workspace"
            ]
          },
          "project_id": {
            "type": "string"
          },
          "target_kind": {
            "type": "string",
            "enum": [
              "episode",
              "clip"
            ]
          },
          "target_id": {
            "type": "string"
          },
          "revision": {
            "type": "integer"
          },
          "draft_revision": {
            "type": "string"
          },
          "workspace_url": {
            "type": "string"
          },
          "output_id": {
            "type": "string"
          },
          "output_status": {
            "type": "string",
            "enum": [
              "missing",
              "stale",
              "rendering",
              "ready",
              "failed"
            ]
          },
          "output_revision": {
            "type": "integer"
          },
          "parent_episode_id": {
            "type": "string"
          }
        },
        "required": [
          "schema",
          "mode",
          "target_kind",
          "target_id",
          "revision",
          "draft_revision",
          "workspace_url",
          "output_status"
        ],
        "additionalProperties": false
      }
    },
    "required": [],
    "additionalProperties": false
  }
}

Errors

[
  "render_not_ready",
  "render_output_unavailable",
  "render_changed",
  "not_found",
  "forbidden",
  "invalid_input"
]

Examples

[
  {
    "label": "Handoff a ready Episode or derived clip",
    "input": {
      "episode_id": "comp_...",
      "expires_in_days": 7
    }
  },
  {
    "label": "Handoff when only the ready render artifact is in context",
    "input": {
      "render_id": "rart_...",
      "expires_in_days": 7
    }
  }
]