# publish_prepare

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

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 reviewable publish packages for an episode or clip. This never publishes externally; a fresh server-bound final confirmation is required before any send and is ordinarily surfaced in the first-party workspace. App-only descriptor visibility does not itself restrict authenticated MCP transport or prove human review. Put improved YouTube/LinkedIn/X titles, descriptions, and copy here (or in publish_update) rather than mutating the saved episode with episode_update.

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": "publish_prepare",
  "title": "Prepare a publish package",
  "description": "Create reviewable publish packages for an episode or clip. This never publishes externally; a fresh server-bound final confirmation is required before any send and is ordinarily surfaced in the first-party workspace. App-only descriptor visibility does not itself restrict authenticated MCP transport or prove human review. Put improved YouTube/LinkedIn/X titles, descriptions, and copy here (or in publish_update) rather than mutating the saved episode with episode_update.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "target_type": {
        "type": "string",
        "enum": [
          "episode",
          "clip"
        ],
        "description": "Object to publish."
      },
      "target_id": {
        "type": "string",
        "description": "Rendered episode/clip public ID or ready export public ID."
      },
      "channels": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "youtube",
            "linkedin",
            "x"
          ]
        }
      },
      "title": {
        "type": "string",
        "description": "Optional publish title."
      },
      "description": {
        "type": "string",
        "description": "Optional publish description."
      },
      "copy": {
        "type": [
          "object",
          "string"
        ],
        "description": "Optional channel copy hints. Object values may be keyed by channel plus default."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for safe retry."
      }
    },
    "required": [
      "target_type",
      "target_id"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  }
}
```

## App descriptor

```json
{
  "name": "publish_prepare",
  "title": "Prepare a publish package",
  "description": "Create reviewable publish packages for an episode or clip. This never publishes externally; a fresh server-bound final confirmation is required before any send and is ordinarily surfaced in the first-party workspace. App-only descriptor visibility does not itself restrict authenticated MCP transport or prove human review. Put improved YouTube/LinkedIn/X titles, descriptions, and copy here (or in publish_update) rather than mutating the saved episode with episode_update.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "target_type": {
        "type": "string",
        "enum": [
          "episode",
          "clip"
        ],
        "description": "Object to publish."
      },
      "target_id": {
        "type": "string",
        "description": "Rendered episode/clip public ID or ready export public ID."
      },
      "channels": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "youtube",
            "linkedin",
            "x"
          ]
        }
      },
      "title": {
        "type": "string",
        "description": "Optional publish title."
      },
      "description": {
        "type": "string",
        "description": "Optional publish description."
      },
      "copy": {
        "type": [
          "object",
          "string"
        ],
        "description": "Optional channel copy hints. Object values may be keyed by channel plus default."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for safe retry."
      }
    },
    "required": [
      "target_type",
      "target_id"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "publish_package_id": {
        "type": [
          "string",
          "null"
        ]
      },
      "target_type": {
        "type": "string"
      },
      "target_id": {
        "type": "string"
      },
      "status": {
        "type": "string"
      },
      "publish_mode": {
        "type": "string",
        "enum": [
          "approval"
        ]
      },
      "channels": {
        "type": "array"
      },
      "approvals": {
        "type": "array"
      },
      "approval_ids": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "next_action": {
        "type": [
          "object",
          "null"
        ]
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Live Workspace descriptor

```json
{
  "name": "publish_prepare",
  "title": "Prepare a publish package",
  "description": "Create reviewable publish packages for an episode or clip. This never publishes externally; a fresh server-bound final confirmation is required before any send and is ordinarily surfaced in the first-party workspace. App-only descriptor visibility does not itself restrict authenticated MCP transport or prove human review. Put improved YouTube/LinkedIn/X titles, descriptions, and copy here (or in publish_update) rather than mutating the saved episode with episode_update.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "target_type": {
        "type": "string",
        "enum": [
          "episode",
          "clip"
        ],
        "description": "Object to publish."
      },
      "target_id": {
        "type": "string",
        "description": "Rendered episode/clip public ID or ready export public ID."
      },
      "channels": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "youtube",
            "linkedin",
            "x"
          ]
        }
      },
      "title": {
        "type": "string",
        "description": "Optional publish title."
      },
      "description": {
        "type": "string",
        "description": "Optional publish description."
      },
      "copy": {
        "type": [
          "object",
          "string"
        ],
        "description": "Optional channel copy hints. Object values may be keyed by channel plus default."
      },
      "idempotency_key": {
        "type": "string",
        "description": "Caller-stable key for safe retry."
      }
    },
    "required": [
      "target_type",
      "target_id"
    ],
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": true,
    "openWorldHint": false
  },
  "securitySchemes": [
    {
      "type": "noauth"
    }
  ],
  "_meta": {
    "securitySchemes": [
      {
        "type": "noauth"
      }
    ]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "publish_package_id": {
        "type": [
          "string",
          "null"
        ]
      },
      "target_type": {
        "type": "string"
      },
      "target_id": {
        "type": "string"
      },
      "status": {
        "type": "string"
      },
      "publish_mode": {
        "type": "string",
        "enum": [
          "approval"
        ]
      },
      "channels": {
        "type": "array"
      },
      "approvals": {
        "type": "array"
      },
      "approval_ids": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "next_action": {
        "type": [
          "object",
          "null"
        ]
      },
      "blockers": {
        "type": "array",
        "items": {
          "type": "object"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
}
```

## Errors

```json
[
  "export_not_found",
  "composition_not_ready",
  "composition_has_no_source",
  "publish_not_ready",
  "invalid_platforms",
  "idempotency_conflict",
  "invalid_input"
]
```

## Examples

```json
[]
```
