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 eb8538f4a297f331d0399351c1e175bffcd212d2
Public contract commit 20688e11af473a363145ed880d5019c90a7ec1e2
Public contract SHA-256 87a94b85a84dc19245fc03f9b544c70d64bd9f5e08585dcccb38157cace5700d
Captured 2026-10-04T11:55:45.577Z. 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
    }
  }
]