Passo Developers

MCP Tools

Every tool the Passo remote MCP server exposes, generated from the committed inventory.

Connect an MCP client to https://mcp.passo.co/v1/mcp (or https://mcp.passo.co/v1/mcp/readonly for read-only access).

whoami

Returns the profile of the Passo user the connected access token belongs to. Takes no parameters. Call this first to confirm the connection resolved to the expected account before using other tools. Returns JSON: id, displayName (may be null if the user hasn't named their profile yet), avatarUrl (may be null), and lastUsedWorkspaceSlug (the workspace they last worked in, or null). Returns an error result if the token is valid but the user has not created a profile row yet.

Input

This tool takes no parameters.

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "whoami",
    "arguments": {}
  }
}

Example result

{
  "id": "a1b2c3d4-0000-0000-0000-000000000000",
  "displayName": "Ada Lovelace",
  "avatarUrl": "https://example.com/avatar.png",
  "lastUsedWorkspaceSlug": "acme"
}

list_workspaces

Lists the Passo workspaces the connected user is a member of, ordered by name. All parameters are optional. `limit` is the max number of workspaces to return (default 20, max 100; a larger value is clamped, not rejected). `offset` skips that many workspaces for pagination (default 0; e.g. offset: 20 with limit: 20 fetches the second page). Returns JSON: `workspaces` (each with id — the workspace's public id, e.g. "wsp_abc", which create_job, invite_member and the other workspace tools take — name, slug, archivedAt — an ISO timestamp when archived, otherwise null — and domain, its company domain like "robinhood.com" or null when none is on file), `total` (the member count before pagination, so you can tell whether more pages exist), `limit`, and `offset`.

Input

ParameterTypeRequiredDescription
limitintegernoMax workspaces to return (default 20, max 100).
offsetintegernoNumber of workspaces to skip for pagination (default 0).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_workspaces",
    "arguments": {
      "limit": 1,
      "offset": 1
    }
  }
}

Example result

{
  "workspaces": [
    {
      "id": "11111111-0000-0000-0000-000000000000",
      "name": "Acme",
      "slug": "acme",
      "archivedAt": null
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

list_videos

Lists the videos in a workspace, newest first — the full set regardless of review state (still processing, awaiting review, approved, or changes requested). `workspaceId` is the workspace's public id (e.g. workspaceId: "wsp_abc"). Required if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically, so you can omit it. `creatorId` (optional) narrows to one creator's videos. `state` narrows to one review state — one of "in_review" (awaiting a review decision — a reviewer's queue), "changes_requested", or "approved"; omit it for every state. `limit` is the max to return (default 20, max 100; a larger value is clamped, not rejected). `offset` skips that many for pagination (default 0; e.g. offset: 20 with limit: 20 fetches the second page). Returns JSON: `videos` (each with id, title, workspaceId, creatorId, dealId, jobTitle, brandName, muxStatus — preparing/ready/errored, state — the current cut's review state, playbackId, versionCount, and createdAt), `total` (the count before pagination, so you can tell whether more pages exist), `limit`, and `offset`. Use `get_video_review` with a video's id to see its full version history before deciding.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id (wsp_…). Required if you belong to more than one workspace (find it with list_workspaces); optional if you belong to exactly one.
creatorIdstringnoNarrow to a single creator's videos by id.
statestringnoNarrow to one review state (in_review, changes_requested, approved); omit for all.
limitintegernoMax videos to return (default 20, max 100).
offsetintegernoNumber of videos to skip for pagination (default 0).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_videos",
    "arguments": {
      "workspaceId": "example",
      "creatorId": "example",
      "state": "example",
      "limit": 1,
      "offset": 1
    }
  }
}

Example result

{
  "videos": [
    {
      "id": "22222222-0000-0000-0000-000000000000",
      "title": "Product Launch Spot",
      "workspaceId": "11111111-0000-0000-0000-000000000000",
      "creatorId": "a1b2c3d4-0000-0000-0000-000000000000",
      "dealId": "33333333-0000-0000-0000-000000000000",
      "jobTitle": "Spring Campaign",
      "brandName": "Acme",
      "muxStatus": "ready",
      "state": "in_review",
      "playbackId": "abc123def456",
      "versionCount": 2,
      "createdAt": "2026-08-15T12:00:00Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

get_video_review

Fetches a single video and its full version history so an agent can review it — pair it with `list_videos` (filter `state: "in_review"` for a reviewer's queue), which returns the ids. Required: `videoId` (the video's id, e.g. videoId: "vid_4qk9mz2rx7bt"). Returns JSON: the video (id, title, workspaceId, creatorId, dealId, jobTitle, brandName, currentVersionId, createdAt, updatedAt) and `versions`, oldest first, each with id, versionNo, muxStatus (preparing/ready/errored), state (in_review/changes_requested/approved), playbackId, durationSeconds, originalFilename, fileSizeBytes, uploadedByUserId, supersededAt, createdAt, and isCurrent (true for the version under review). If `videoId` is omitted the result is `{error: "invalid"}`; if the video does not exist or you cannot see it, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
videoIdstringnoThe id of the video to fetch for review (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "get_video_review",
    "arguments": {
      "videoId": "example"
    }
  }
}

Example result

{
  "video": {
    "id": "22222222-0000-0000-0000-000000000000",
    "title": "Product Launch Spot",
    "workspaceId": "11111111-0000-0000-0000-000000000000",
    "creatorId": "a1b2c3d4-0000-0000-0000-000000000000",
    "dealId": "33333333-0000-0000-0000-000000000000",
    "jobTitle": "Spring Campaign",
    "brandName": "Acme",
    "currentVersionId": "44444444-0000-0000-0000-000000000000",
    "createdAt": "2026-08-15T12:00:00Z",
    "updatedAt": "2026-08-20T09:00:00Z"
  },
  "versions": [
    {
      "id": "55555555-0000-0000-0000-000000000000",
      "versionNo": 1,
      "muxStatus": "ready",
      "state": "changes_requested",
      "playbackId": "old789ghi012",
      "durationSeconds": 32,
      "originalFilename": "launch-v1.mp4",
      "fileSizeBytes": 48000000,
      "uploadedByUserId": "a1b2c3d4-0000-0000-0000-000000000000",
      "supersededAt": "2026-08-18T14:00:00Z",
      "createdAt": "2026-08-15T12:00:00Z",
      "isCurrent": false
    },
    {
      "id": "44444444-0000-0000-0000-000000000000",
      "versionNo": 2,
      "muxStatus": "ready",
      "state": "in_review",
      "playbackId": "abc123def456",
      "durationSeconds": 30,
      "originalFilename": "launch-v2.mp4",
      "fileSizeBytes": 45000000,
      "uploadedByUserId": "a1b2c3d4-0000-0000-0000-000000000000",
      "supersededAt": null,
      "createdAt": "2026-08-18T14:00:00Z",
      "isCurrent": true
    }
  ]
}

get_video_analysis

Returns the newest AI analysis run for a video version — the advisory read to pair with get_video_review (its versions carry the version ids). The analysis is advisory: it never gates the human review state or a sign-off. Required: `versionId` (the video version's id, e.g. versionId: "550e8400-e29b-41d4-a716-446655440000"). Returns JSON: id, versionId, status (pending/processing/completed/failed/skipped), overallResult (pass/fail/null — the advisory verdict, independent of status), the four quality scores 0–10 (qualityScoreOverall/Audio/Visual/Engagement, null until the vision step runs), modelProvider, error (on the failed path), createdAt, completedAt, `issues` — timestamped observations, errors first then by timeline position, each with category (quality/content), severity (error/warning/info), startMs/endMs (both null = whole video, startMs alone = a point, start+end = a range), title, description, suggestedFix, confidence (0–1), dismissedAt, dismissedByUserId, convertedCommentId, createdAt — and `transcript` — the cleaned transcript as whole sentences with ms anchors on the same timeline as the issues (each: id, text, startMs, endMs), or null until the transcript has been cleaned (a pending, transcript-only, or skipped run has none). If `versionId` is missing the result is `{error: "invalid"}`; if the version has no analysis or you cannot see it, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
versionIdstringnoThe id of the video version to fetch the analysis for (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "get_video_analysis",
    "arguments": {
      "versionId": "example"
    }
  }
}

Example result

(no example yet)

get_notification_preferences

Lists your email notification preferences — one entry per notification type, each with its label, description, audience (brand or creator) and whether you currently receive it (`enabled`). Preferences are per-user and apply across every workspace you belong to. Optional: `audience` ("brand" or "creator") narrows the list to one app's types; omit it to get all. Default on: a type you have never changed comes back enabled. Returns JSON: `preferences` (each with type, audience, channel, label, description, enabled) and `total` (the number of types).

Input

ParameterTypeRequiredDescription
audiencestringnoNarrow to one app's notification types: "brand" or "creator". Optional — omit for all types.

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "get_notification_preferences",
    "arguments": {
      "audience": "example"
    }
  }
}

Example result

(no example yet)

list_deals

Lists the deals in a workspace — each pairing a creator with a job (brief) — newest first. `workspaceId` is the workspace's public id (e.g. workspaceId: "wsp_abc"). Required if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically, so you can omit it. `creatorId` (optional) narrows the list to a single creator's deals (e.g. creatorId: "a1b2…"); omit it for every creator. `limit` is the max to return (default 20, max 100; a larger value is clamped, not rejected). `offset` skips that many for pagination (default 0). Returns JSON: `deals` (each with id, jobId, creatorId, creatorName, jobTitle, jobStatus — open or closed, brandName, and createdAt), `total` (the count before pagination), `limit`, and `offset`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id (wsp_…). Required if you belong to more than one workspace (find it with list_workspaces); optional if you belong to exactly one.
creatorIdstringnoNarrow to a single creator's deals by id.
limitintegernoMax deals to return (default 20, max 100).
offsetintegernoNumber of deals to skip for pagination (default 0).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_deals",
    "arguments": {
      "workspaceId": "example",
      "creatorId": "example",
      "limit": 1,
      "offset": 1
    }
  }
}

Example result

{
  "deals": [
    {
      "id": "33333333-0000-0000-0000-000000000000",
      "jobId": "44444444-0000-0000-0000-000000000000",
      "creatorId": "a1b2c3d4-0000-0000-0000-000000000000",
      "creatorName": "Ada Lovelace",
      "jobTitle": "Spring Campaign",
      "jobStatus": "open",
      "brandName": "Acme",
      "createdAt": "2026-08-15T12:00:00Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

list_jobs

Lists the jobs (briefs) in a workspace, newest first. `workspaceId` is the workspace's public id (wsp_…). Required if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically, so you can omit it. `limit` is the max to return (default 20, max 100; a larger value is clamped, not rejected). `offset` skips that many for pagination (default 0). Returns JSON: `jobs` (each with id, workspaceId, title, status — open or closed, platform — instagram, youtube, tiktok or null, postingWindowStart, postingWindowEnd, and createdAt), `total` (the count before pagination), `limit`, and `offset`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id (wsp_…). Required if you belong to more than one workspace (find it with list_workspaces); optional if you belong to exactly one.
limitintegernoMax jobs to return (default 20, max 100).
offsetintegernoNumber of jobs to skip for pagination (default 0).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_jobs",
    "arguments": {
      "workspaceId": "example",
      "limit": 1,
      "offset": 1
    }
  }
}

Example result

{
  "jobs": [
    {
      "id": "44444444-0000-0000-0000-000000000000",
      "workspaceId": "11111111-0000-0000-0000-000000000000",
      "title": "Spring Campaign",
      "status": "open",
      "createdAt": "2026-08-15T12:00:00Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

list_workspace_members

Lists the members of a workspace — the read companion to remove_workspace_member. Required: `workspaceId` (the workspace's public id, e.g. workspaceId: "wsp_abc"). Returns JSON: `members` (each with userId, displayName, email, role — viewer/member/admin, department — marketing/compliance, and joinedAt) and `total`. If `workspaceId` is missing or not a wsp_ id, `{error: "invalid"}`; a workspace you aren't a member of returns `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id, e.g. wsp_abc (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_workspace_members",
    "arguments": {
      "workspaceId": "example"
    }
  }
}

Example result

{
  "members": [
    {
      "userId": "a1b2c3d4-0000-0000-0000-000000000000",
      "displayName": "Ada Lovelace",
      "email": "ada@acme.com",
      "role": "admin",
      "department": "marketing",
      "joinedAt": "2026-08-01T09:00:00Z"
    }
  ],
  "total": 1
}

get_script

Returns a script and its versions (newest first) — the read to do before sign_off_script. Required: `publicId` (the script's public id, e.g. publicId: "scr_123"). Returns JSON: id, title, requiresCompliance, currentVersionId, dealId, deliverableId and deliverablePublicId (the deliverable this script satisfies, e.g. deliverablePublicId: `dlv_abc` — both null when it names none), and `versions` (each with id, versionNo, body, state — in_review/changes_requested/approved, submittedByUserId, supersededAt, createdAt). If `publicId` is missing the result is `{error: "invalid"}`; if the script isn't visible, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
publicIdstringnoThe script's public id (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "get_script",
    "arguments": {
      "publicId": "example"
    }
  }
}

Example result

{
  "id": "scr_abc123",
  "title": "Launch Script",
  "requiresCompliance": true,
  "currentVersionId": "66666666-0000-0000-0000-000000000000",
  "dealId": "33333333-0000-0000-0000-000000000000",
  "versions": [
    {
      "id": "66666666-0000-0000-0000-000000000000",
      "versionNo": 1,
      "body": "Open on the product hero shot…",
      "state": "in_review",
      "submittedByUserId": "a1b2c3d4-0000-0000-0000-000000000000",
      "supersededAt": null,
      "createdAt": "2026-08-15T12:00:00Z"
    }
  ]
}

list_deliverables

Lists the deliverables on a deal, in authoring order — the read to do before move_deliverable_production_stage. Required: `dealId` (the deal's id, e.g. dealId: "3a1f…"). Returns JSON: `deliverables` (each with id — the deliverable's public id dlv_…, dealId, type, quantity, position, description, productionStage — script/video/posting/posted, waitingOn — creator/workspace/null, waitingOnDepartments, createdAt, updatedAt) and `total`. If `dealId` is missing the result is `{error: "invalid"}`; a deal you can't see returns an empty list.

Input

ParameterTypeRequiredDescription
dealIdstringnoThe deal's id whose deliverables to list (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_deliverables",
    "arguments": {
      "dealId": "example"
    }
  }
}

Example result

(no example yet)

get_deal_activity

Returns a deal's activity timeline — its commercial stage moves (scope `deal`) unioned with all its deliverables' production stage moves (scope `deliverable`), oldest first. Required: `dealId` (the deal's id, e.g. dealId: "3a1f…"). Returns JSON: `activity` (each with id, scope — deal or deliverable, dealId, deliverableId — set for deliverable rows, fromStage — null for a seed event, toStage — a commercial stage for deal rows or a production stage for deliverable rows, reason, actorUserId — null for a workflow move, createdAt) and `total`. If `dealId` is missing the result is `{error: "invalid"}`; a deal you can't see returns an empty timeline.

Input

ParameterTypeRequiredDescription
dealIdstringnoThe deal's id whose activity to read (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "get_deal_activity",
    "arguments": {
      "dealId": "example"
    }
  }
}

Example result

(no example yet)

list_audit_log

Lists a workspace's security audit log, newest first — who performed each action, through which surface, and whether it succeeded. Only workspace admins see entries; a non-admin gets an empty page. `workspaceId` is the workspace's public id (e.g. workspaceId: "wsp_abc"). Required if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically, so you can omit it. Optional filters: `actorId` (one user's actions), `action` (one exact namespaced verb, e.g. "workspace_user.removed"), `from`/`to` (inclusive ISO-8601 timestamps bounding the time). `limit` is the max to return (default 50, max 200; a larger value is clamped, not rejected). Page with `offset` (default 0) or the opaque `cursor` from a previous call's `nextCursor`. Returns JSON: `entries` (each with id, createdAt, actorType — customer/vendor/system, actorUserId, actorDisplayName — resolved where known, including former members, supportGrantReason — for a vendor/staff row, action, objectType, objectId, success, channel, and redacted metadata), `total` (the count before pagination), `limit`, `offset`, and `nextCursor` (null on the last page).

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id (wsp_…). Required if you belong to more than one workspace (find it with list_workspaces); optional if you belong to exactly one.
actorIdstringnoNarrow to a single user's actions by their user id.
actionstringnoNarrow to one exact action verb, e.g. "workspace_user.removed".
fromstringnoInclusive lower bound on the time (ISO-8601).
tostringnoInclusive upper bound on the time (ISO-8601).
cursorstringnoOpaque pagination cursor from a previous nextCursor.
limitintegernoMax entries to return (default 50, max 200).
offsetintegernoNumber of entries to skip for pagination (default 0).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_audit_log",
    "arguments": {
      "workspaceId": "example",
      "actorId": "example",
      "action": "example",
      "from": "example",
      "to": "example",
      "cursor": "example",
      "limit": 1,
      "offset": 1
    }
  }
}

Example result

(no example yet)

creator_enrichment_status

Returns how far a creator's enrichment has progressed. Required: `creator` (the creator's public id, e.g. creator: "cre_abc123" — returned by add_creator). Returns JSON: `sourceRunId` and `runKind` (the creator's current enrichment run; both null if nothing has started yet) and `layers`, each with `layer`, `status`, `lastRunAt`, `attempts` and `error` (null unless that layer failed). Layers not yet reached are omitted. If `creator` is missing, `{error: "invalid"}`; if no such creator is visible to you, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
creatorstringnoThe creator's public id, e.g. cre_abc123 (required).

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "creator_enrichment_status",
    "arguments": {
      "creator": "example"
    }
  }
}

Example result

(no example yet)

list_conversations

Lists the message threads in a workspace, newest activity first. `workspaceId` is the workspace's public id (e.g. workspaceId: "wsp_abc"). Required if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically, so you can omit it. `creatorId` (optional) narrows to a single creator's thread. `q` (optional) filters to threads whose creator's name or handle contains that text, case-insensitive (e.g. q: "nova"). `limit` is the max to return (default 20, max 100; a larger value is clamped, not rejected). Page with `offset` (default 0) or the opaque `cursor` from a previous call's `nextCursor`. Returns JSON: `conversations` (each with id — the thread's cnv_ id, createdAt, lastMessageAt, counterparty — the creator's { id, displayName, avatarUrl } or null, lastMessage — { body, authorUserId, createdAt } or null for an empty thread, and unread — your unread count), `total` (the count before pagination), `limit`, `offset`, and `nextCursor` (null on the last page). Use `list_messages` with a conversation's id to read it.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id (wsp_…). Required if you belong to more than one workspace (find it with list_workspaces); optional if you belong to exactly one.
creatorIdstringnoNarrow to a single creator's thread by id.
qstringnoFilter to threads whose creator's name or handle contains this text (e.g. q: "nova").
limitintegernoMax threads to return (default 20, max 100).
offsetintegernoNumber of threads to skip for pagination (default 0).
cursorstringnoOpaque pagination cursor from a previous nextCursor.

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_conversations",
    "arguments": {
      "workspaceId": "example",
      "creatorId": "example",
      "q": "example",
      "limit": 1,
      "offset": 1,
      "cursor": "example"
    }
  }
}

Example result

(no example yet)

list_messages

Lists a conversation's messages, most recent first (the newest `limit`, returned oldest to newest within that window). Required: `conversationId` (the thread's cnv_ public id, e.g. conversationId: "cnv_abc") — get it from `list_conversations`. `limit` is the max to return (default 30, max 100; a larger value is clamped, not rejected). Page with `offset` (default 0) or the opaque `cursor` from a previous call's `nextCursor` (it pages toward older messages, so offset is ignored when a cursor is given). Returns JSON: `messages` (each with id, body, authorUserId, authorDisplayName and authorAvatarUrl — null when the author account is gone, and createdAt), `total` (the count before pagination), `limit`, `offset`, and `nextCursor` (null when no older messages remain). If `conversationId` is missing the result is `{error: "invalid"}` describing what to supply.

Input

ParameterTypeRequiredDescription
conversationIdstringnoThe conversation's cnv_ public id (required).
limitintegernoMax messages to return (default 30, max 100).
offsetintegernoNumber of messages to skip for pagination (default 0).
cursorstringnoOpaque pagination cursor from a previous nextCursor.

Annotations

  • readOnlyHint: true
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "list_messages",
    "arguments": {
      "conversationId": "example",
      "limit": 1,
      "offset": 1,
      "cursor": "example"
    }
  }
}

Example result

(no example yet)

comment_on_video

Leaves a timestamped comment on a video version (the review thread), or a one-level reply. Required: `versionId` (the version's id, e.g. versionId: "7f3c…") and `body` (the note text). Optional: `startMs` to pin the note to a moment in milliseconds (e.g. startMs: 14000 for 0:14), `endMs` (>= startMs) to mark a range, and `parentId` to reply to an existing comment. Only workspace members may comment; comments are internal (not visible to the creator). Returns the created comment as JSON (id, versionId, parentId, authorUserId, body, startMs, endMs, visibility, createdAt). If `versionId` or `body` is missing, or a range is backwards, the result is `{error: "invalid"}` describing what to fix; if you cannot comment on that version, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
versionIdstringnoThe video version's id (required).
bodystringnoThe comment text (required).
startMsintegernoStart of the note in milliseconds, e.g. 14000 for 0:14.
endMsintegernoEnd of the range in milliseconds; requires startMs and must be >= it.
parentIdstringnoId of the comment to reply to (one level of nesting only).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "comment_on_video",
    "arguments": {
      "versionId": "example",
      "body": "example",
      "startMs": 1,
      "endMs": 1,
      "parentId": "example"
    }
  }
}

Example result

(no example yet)

share_thread

Shares a video comment thread with the creator, or unshares it. Internal review notes are hidden from the creator by default; sharing promotes the whole thread to creator-visible, and unsharing hides it again. Required: `commentId` (any comment in the thread, e.g. commentId: "7f3c…" — a reply resolves to its root and the whole thread moves together) and `share` (true to share, false to unshare). Only the person who authored the thread may share it. Returns the updated root comment as JSON (id, versionId, parentId, authorUserId, body, startMs, endMs, visibility, createdAt). If `commentId` or `share` is missing, the result is `{error: "invalid"}` describing what to fix; `{error: "not_found"}` if the comment does not exist or you cannot see it; `{error: "forbidden"}` if you did not author the thread.

Input

ParameterTypeRequiredDescription
commentIdstringnoId of any comment in the thread to share (required).
sharebooleannotrue to share with the creator, false to unshare (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "share_thread",
    "arguments": {
      "commentId": "example",
      "share": false
    }
  }
}

Example result

(no example yet)

set_notification_preference

Turns one email notification type on or off for you. Required: `notificationType` (e.g. "video_ready_to_review") and `enabled` (true to receive the email, false to stop). Optional: `channel` (email only today). Preferences are per-user and apply across every workspace you belong to. Turning a type off drops you from that notification's recipients; on (the default) adds you back. Returns your full updated preference list as JSON (`preferences`, `total`). If a required field is missing or the type is unknown the result is `{error: "invalid"}` describing what to fix.

Input

ParameterTypeRequiredDescription
notificationTypestringnoThe notification type, e.g. "video_ready_to_review" (required).
enabledbooleannotrue to receive the email, false to stop receiving it (required).
channelstringnoThe delivery channel. Only "email" today (optional).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "set_notification_preference",
    "arguments": {
      "notificationType": "example",
      "enabled": false,
      "channel": "example"
    }
  }
}

Example result

(no example yet)

sign_off_script

Records your review verdict on a script version. Required: `versionId` (the version's id, e.g. versionId: "7f3c…"), `department` — your review function, `marketing` for a brand sign-off or `compliance` for a compliance one (you may only sign off for your own function), and `decision` — one of `approved`, `changes_requested`. Optional: `note` explaining the verdict. Sign-offs are append-only — recording a new verdict supersedes your earlier one, and both stay in the history. Approving a script that requires compliance needs both a brand and a compliance approval before it is fully approved. Returns the recorded sign-off as JSON (id, versionId, department, decision, note, userId, createdAt). If a required field is missing the result is `{error: "invalid"}` describing what to fix; if the department is not yours or you cannot act on that version, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
versionIdstringnoThe script version's id (required).
departmentstringnoYour review function: marketing (brand) or compliance (required).
decisionstringnoThe verdict: approved or changes_requested (required).
notestringnoAn optional note explaining the verdict.

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "sign_off_script",
    "arguments": {
      "versionId": "example",
      "department": "example",
      "decision": "example",
      "note": "example"
    }
  }
}

Example result

(no example yet)

sign_off_video

Records your review verdict on a video version. Required: `versionId` (the version's id, e.g. versionId: "7f3c…"), `department` — your review function, `marketing` for a brand sign-off or `compliance` for a compliance one (you may only sign off for your own function), and `decision` — one of `approved`, `changes_requested`. A verdict carries no note — review feedback for the creator lives in video comments (use the comment tool to leave guidance before requesting changes). Sign-offs are append-only — recording a new verdict supersedes your earlier one, and both stay in the history. Approving a video that requires compliance needs both a brand and a compliance approval before it is fully approved. Returns the recorded sign-off as JSON (id, versionId, department, decision, userId, createdAt). If a required field is missing the result is `{error: "invalid"}` describing what to fix; if the department is not yours or you cannot act on that version, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
versionIdstringnoThe video version's id (required).
departmentstringnoYour review function: marketing (brand) or compliance (required).
decisionstringnoThe verdict: approved or changes_requested (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "sign_off_video",
    "arguments": {
      "versionId": "example",
      "department": "example",
      "decision": "example"
    }
  }
}

Example result

(no example yet)

move_deal_stage

Moves a deal to a new commercial stage and records the move. Required: `dealId` (the deal's id, e.g. dealId: "3a1f…") and `toStage` — one of `contracted`, `active`, `complete`, `declined`. These are the deal's COMMERCIAL stages; production (script/video/posting) is tracked per deliverable, not here. Forward moves, including skips (e.g. `contracted` straight to `complete`), are allowed and need no reason. A backward move — including reopening a `complete` or `declined` deal — requires `reason`. `declined` is reachable from any stage. Optional: `reason` (required for backward moves) explaining the move. Returns the recorded move as JSON (id, dealId, fromStage, toStage, reason, actorUserId, createdAt). If a required field is missing, the move is illegal, or a backward move omits a reason, the result is `{error: "invalid"}` describing what to fix; if the deal isn't visible, `{error: "not_found"}`; if you cannot move it, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
dealIdstringnoThe deal's id (required).
toStagestringnoThe commercial stage to move to: contracted, active, complete or declined (required).
reasonstringnoWhy the deal is moving — required for a backward move (e.g. sending a posting deal back to video).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "move_deal_stage",
    "arguments": {
      "dealId": "example",
      "toStage": "example",
      "reason": "example"
    }
  }
}

Example result

(no example yet)

move_deliverable_production_stage

Moves a single deliverable to a new production stage and records the move. Required: `deliverableId` (the deliverable's public id, e.g. deliverableId: "dlv_abc") and `toStage` — one of `script`, `video`, `posting`, `posted`. These are the deliverable's PRODUCTION stages, tracked per deliverable; the deal's COMMERCIAL stage is moved separately with move_deal_stage. Forward moves, including skips (e.g. `script` straight to `posting`), are allowed and need no reason. A backward move (e.g. sending a `posting` deliverable back to `video`) requires `reason`. There is no `declined` — a deliverable is never declined (the deal is). Optional: `reason` (required for backward moves) explaining the move. Returns the recorded move as JSON (id, deliverableId, fromStage, toStage, reason, actorUserId, createdAt). If a required field is missing, the move is illegal, or a backward move omits a reason, the result is `{error: "invalid"}` describing what to fix; if the deliverable isn't visible, `{error: "not_found"}`; if you cannot move it, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
deliverableIdstringnoThe deliverable's public id, e.g. dlv_abc (required).
toStagestringnoThe production stage to move to: script, video, posting or posted (required).
reasonstringnoWhy the deliverable is moving — required for a backward move (e.g. sending a posting deliverable back to video).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "move_deliverable_production_stage",
    "arguments": {
      "deliverableId": "example",
      "toStage": "example",
      "reason": "example"
    }
  }
}

Example result

(no example yet)

remove_workspace_member

Removes a member from a workspace, revoking their access to that workspace's data on their next request. Required: `workspaceId` (the workspace's public id, e.g. workspaceId: "wsp_abc") and `userId` (the member's user id). Only a workspace admin may remove members. Returns `{success: true}` on removal. If `workspaceId` or `userId` is missing the result is `{error: "invalid"}` describing what to fix; if the target isn't a member or you aren't an admin, `{error: "not_found"}`; if the target is the workspace's last admin, `{error: "last_admin"}` (promote another member to admin first).

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id, e.g. wsp_abc (required).
userIdstringnoThe member's user id (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "remove_workspace_member",
    "arguments": {
      "workspaceId": "example",
      "userId": "example"
    }
  }
}

Example result

(no example yet)

create_deal

Assigns a creator to a job (brief), creating a deal. Required: `jobId` (the job's id) and `creatorId` (the creator's id). You must be a member of the job's workspace. Returns the created deal as JSON (id, jobId, creatorId, createdAt). If a required field is missing, `{error: "invalid"}`; if the creator is already assigned to the job, `{error: "conflict"}`; if you cannot assign in that workspace, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
jobIdstringnoThe job's id (required).
creatorIdstringnoThe creator's id (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "create_deal",
    "arguments": {
      "jobId": "example",
      "creatorId": "example"
    }
  }
}

Example result

{
  "id": "33333333-0000-0000-0000-000000000000",
  "jobId": "44444444-0000-0000-0000-000000000000",
  "creatorId": "a1b2c3d4-0000-0000-0000-000000000000",
  "createdAt": "2026-08-15T12:00:00Z"
}

add_creator_to_job

Adds a creator to a job (brief) and returns `{ creatorId, dealId, claimed }`. Unlike create_deal, this does not need an existing creator id — it finds the creator by their social handle, or mints a new one if none is known, then creates the deal. Required: `jobId` (the job's id), `displayName` (e.g. "Jane Doe"), `email` (an outreach address, e.g. jane@example.com), `platform` (instagram or youtube) and `handle` (e.g. @janedoe — a leading @ and casing are ignored). You must be a member of the job's workspace. Re-adding the same creator to the same job is safe and returns the existing deal. `claimed` is whether that creator already has an owner account. If a required field is missing or invalid, `{error: "invalid"}`; if you cannot add to that job because you are only a viewer, `{error: "forbidden"}`; if the job does not exist or is in another workspace, `{error: "not_found"}`; if the job has no deliverables yet (adding a creator would be a dead end — brief its deliverables first), `{error: "no_deliverables"}`.

Input

ParameterTypeRequiredDescription
jobIdstringnoThe job's id (required).
displayNamestringnoThe creator's display name, e.g. "Jane Doe" (required).
emailstringnoThe creator's outreach email, e.g. jane@example.com (required).
platformstringnoThe social platform: instagram or youtube (required).
handlestringnoThe creator's handle on that platform, e.g. @janedoe (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "add_creator_to_job",
    "arguments": {
      "jobId": "example",
      "displayName": "example",
      "email": "example",
      "platform": "example",
      "handle": "example"
    }
  }
}

Example result

(no example yet)

create_job

Creates a job (a workspace's brief). Required: `workspaceId` (the workspace's public id, e.g. wsp_abc — use list_workspaces to find it) and `title`. Optional: `platform` (instagram, youtube or tiktok — the platform the job targets), `postingWindowStart` and `postingWindowEnd` (ISO dates, YYYY-MM-DD, e.g. 2026-02-01; end must be on or after start — the window creators are expected to post within). Optional: `deliverables` — the lines of content the job asks for, each `{type, quantity, description}`: `type` is a deliverable type (e.g. instagram_reel), `quantity` is a required integer 1-100 (no default), `description` is free text that defaults to the type's label. When the job's `platform` is set, every deliverable must match that platform. You must be a member of that workspace. Returns the created job as JSON (id, workspaceId, title, status, platform, postingWindowStart, postingWindowEnd, createdAt, deliverables — the created lines, each id, type, quantity, position, description). If a required or malformed field is invalid, `{error: "invalid"}`; if you cannot create in that workspace, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id to create the job in, e.g. wsp_abc (required).
titlestringnoThe job's title (required).
platformstringnoThe platform the job targets: instagram, youtube or tiktok (optional).
postingWindowStartstringnoStart of the posting window, ISO date YYYY-MM-DD (optional).
postingWindowEndstringnoEnd of the posting window, ISO date YYYY-MM-DD; on or after the start (optional).
deliverablesarraynoDeliverable lines the job asks for (optional): [{type, quantity (required integer 1-100), description}]. When `platform` is set, every deliverable must match it.

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "create_job",
    "arguments": {
      "workspaceId": "example",
      "title": "example",
      "platform": "example",
      "postingWindowStart": "example",
      "postingWindowEnd": "example",
      "deliverables": "example"
    }
  }
}

Example result

{
  "id": "44444444-0000-0000-0000-000000000000",
  "workspaceId": "11111111-0000-0000-0000-000000000000",
  "title": "Spring Campaign",
  "status": "open",
  "createdAt": "2026-08-15T12:00:00Z"
}

close_job

Closes a job (a workspace's brief), hiding it from creators' pickers, or reopens it. Required: `jobId` (the job to update — use list_jobs to find it). Optional: `status` (closed or open — defaults to closed). You must be a member of the job's workspace. Returns the updated job as JSON (id, workspaceId, title, status, platform, postingWindowStart, postingWindowEnd, createdAt). If `jobId` is missing, `{error: "invalid"}`; if you are only a viewer, `{error: "forbidden"}`; if no such job exists in your workspace, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
jobIdstringnoThe job's id to open or close (required).
statusstringnoThe new status: closed (default) or open.

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "close_job",
    "arguments": {
      "jobId": "example",
      "status": "example"
    }
  }
}

Example result

(no example yet)

invite_member

Invites a teammate to a workspace by email. The invite email is sent by Passo; this returns the pending invite's details (never the invite token). Required: `workspaceId` (the workspace's public id, e.g. wsp_abc), `email`, and `role` — one of `viewer`, `member`, `admin`. Optional: `department` — `marketing` or `compliance` (defaults to marketing; only an admin may set a non-default department). Returns JSON: id, email, role, department, expiresAt. If a required field is missing, `{error: "invalid"}`; if a pending invite already exists for that email, `{error: "duplicate"}`; if the role exceeds your own or the department is not allowed, `{error: "escalation"}` / `{error: "department_forbidden"}` / `{error: "domain_not_allowed"}`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id, e.g. wsp_abc (required).
emailstringnoThe invitee's email address (required).
rolestringnoThe role to grant: viewer, member or admin (required).
departmentstringnoOptional department (defaults to marketing).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "invite_member",
    "arguments": {
      "workspaceId": "example",
      "email": "example",
      "role": "example",
      "department": "example"
    }
  }
}

Example result

{
  "id": "77777777-0000-0000-0000-000000000000",
  "email": "new.teammate@acme.com",
  "role": "member",
  "department": "marketing",
  "expiresAt": "2026-08-22T12:00:00Z"
}

add_creator

Adds a creator discovered by social handle and queues its enrichment (profile and content analysis run in the background). Returns `{ creatorId, created }`: `creatorId` is the public creator id (e.g. cre_abc123) to use with other tools, and `created` is whether this call created the creator (false if the handle already belonged to a known creator). Required: `platform` (e.g. instagram or youtube) and `handle` (e.g. @janedoe — a leading @ and casing are ignored). Optional: `displayName` (e.g. "Jane Doe") and `reenrich` (true to re-run enrichment for an already-known creator). Safe to repeat for the same handle. Check progress afterwards with `creator_enrichment_status`. If a required field is missing or invalid, `{error: "invalid"}`; if you are not allowed to add creators, `{error: "forbidden"}`.

Input

ParameterTypeRequiredDescription
platformstringnoThe social platform, e.g. instagram or youtube (required).
handlestringnoThe creator's handle on that platform, e.g. @janedoe (required).
displayNamestringnoThe creator's display name, e.g. "Jane Doe" (optional).
reenrichbooleannoTrue to re-run enrichment for an already-known creator (optional).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "add_creator",
    "arguments": {
      "platform": "example",
      "handle": "example",
      "displayName": "example",
      "reenrich": false
    }
  }
}

Example result

(no example yet)

update_workspace_compliance

Turns the workspace's compliance sign-off requirement on or off. When on, videos need an approved compliance review (as well as marketing) before they count as approved. Required: `workspaceId` (the workspace's public id, e.g. wsp_abc) and `requiresComplianceReview` (true to require compliance review, false to stop requiring it). Affects new videos and videos currently in review (they are re-evaluated immediately); videos that are already approved are not changed. Only workspace admins may change it. Returns JSON: workspaceId, requiresComplianceReview (the new value). If a required field is missing, `{error: "invalid"}`; if the workspace does not exist or you are not allowed to change it, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
workspaceIdstringnoThe workspace's public id, e.g. wsp_abc (required).
requiresComplianceReviewbooleannotrue to require compliance review, false to stop requiring it (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "update_workspace_compliance",
    "arguments": {
      "workspaceId": "example",
      "requiresComplianceReview": false
    }
  }
}

Example result

(no example yet)

mark_conversation_read

Marks your unread message notifications for a conversation as read, clearing its unread badge. Required: `conversationId` (the thread's cnv_ public id, e.g. conversationId: "cnv_abc"). Returns JSON `{ marked }` — how many of your notification rows were newly marked read (0 if already read or the thread isn't visible). If `conversationId` is missing the result is `{error: "invalid"}` describing what to supply.

Input

ParameterTypeRequiredDescription
conversationIdstringnoThe conversation's cnv_ public id (required).

Annotations

  • readOnlyHint: false
  • idempotentHint: true
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "mark_conversation_read",
    "arguments": {
      "conversationId": "example"
    }
  }
}

Example result

(no example yet)

send_message

Sends a message in a conversation. Required: `body` (the message text) and EITHER `conversationId` (reply to an existing thread by its cnv_ id, e.g. conversationId: "cnv_abc" — from `list_conversations`) OR `creatorId` (open-or-reuse the thread with that creator and send the first message). When using `creatorId`, also pass `workspaceId` (the workspace's public id, e.g. "wsp_abc") if you belong to more than one workspace — find it with `list_workspaces`; if you belong to exactly one it is filled in automatically. `workspaceId` is ignored when replying by `conversationId` (the thread already names its workspace). Returns JSON: `conversationId` (the cnv_ id the message landed in — the one that existed or was just opened) and `message` ({ id, body, authorUserId, createdAt }). If neither `conversationId` nor `creatorId` is given, or `body` is empty, the result is `{error: "invalid"}`; if the referenced thread doesn't exist or you can't see it, `{error: "not_found"}`.

Input

ParameterTypeRequiredDescription
conversationIdstringnoReply to an existing thread by its cnv_ public id (provide this OR creatorId).
creatorIdstringnoOpen-or-reuse the thread with this creator by id (provide this OR conversationId).
workspaceIdstringnoThe workspace's public id (wsp_…), used with creatorId. Required if you belong to more than one workspace; optional if exactly one. Ignored with conversationId.
bodystringnoThe message text (required, non-empty).

Annotations

  • readOnlyHint: false
  • idempotentHint: false
  • openWorldHint: false

Example call

{
  "method": "tools/call",
  "params": {
    "name": "send_message",
    "arguments": {
      "conversationId": "example",
      "creatorId": "example",
      "workspaceId": "example",
      "body": "example"
    }
  }
}

Example result

(no example yet)