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
| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | no | Max workspaces to return (default 20, max 100). |
| offset | integer | no | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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. |
| creatorId | string | no | Narrow to a single creator's videos by id. |
| state | string | no | Narrow to one review state (in_review, changes_requested, approved); omit for all. |
| limit | integer | no | Max videos to return (default 20, max 100). |
| offset | integer | no | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| videoId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| versionId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| audience | string | no | Narrow 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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. |
| creatorId | string | no | Narrow to a single creator's deals by id. |
| limit | integer | no | Max deals to return (default 20, max 100). |
| offset | integer | no | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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. |
| limit | integer | no | Max jobs to return (default 20, max 100). |
| offset | integer | no | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| publicId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| dealId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| dealId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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. |
| actorId | string | no | Narrow to a single user's actions by their user id. |
| action | string | no | Narrow to one exact action verb, e.g. "workspace_user.removed". |
| from | string | no | Inclusive lower bound on the time (ISO-8601). |
| to | string | no | Inclusive upper bound on the time (ISO-8601). |
| cursor | string | no | Opaque pagination cursor from a previous nextCursor. |
| limit | integer | no | Max entries to return (default 50, max 200). |
| offset | integer | no | Number 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| creator | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The 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. |
| creatorId | string | no | Narrow to a single creator's thread by id. |
| q | string | no | Filter to threads whose creator's name or handle contains this text (e.g. q: "nova"). |
| limit | integer | no | Max threads to return (default 20, max 100). |
| offset | integer | no | Number of threads to skip for pagination (default 0). |
| cursor | string | no | Opaque 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| conversationId | string | no | The conversation's cnv_ public id (required). |
| limit | integer | no | Max messages to return (default 30, max 100). |
| offset | integer | no | Number of messages to skip for pagination (default 0). |
| cursor | string | no | Opaque 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| versionId | string | no | The video version's id (required). |
| body | string | no | The comment text (required). |
| startMs | integer | no | Start of the note in milliseconds, e.g. 14000 for 0:14. |
| endMs | integer | no | End of the range in milliseconds; requires startMs and must be >= it. |
| parentId | string | no | Id 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| commentId | string | no | Id of any comment in the thread to share (required). |
| share | boolean | no | true 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| notificationType | string | no | The notification type, e.g. "video_ready_to_review" (required). |
| enabled | boolean | no | true to receive the email, false to stop receiving it (required). |
| channel | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| versionId | string | no | The script version's id (required). |
| department | string | no | Your review function: marketing (brand) or compliance (required). |
| decision | string | no | The verdict: approved or changes_requested (required). |
| note | string | no | An 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| versionId | string | no | The video version's id (required). |
| department | string | no | Your review function: marketing (brand) or compliance (required). |
| decision | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| dealId | string | no | The deal's id (required). |
| toStage | string | no | The commercial stage to move to: contracted, active, complete or declined (required). |
| reason | string | no | Why 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| deliverableId | string | no | The deliverable's public id, e.g. dlv_abc (required). |
| toStage | string | no | The production stage to move to: script, video, posting or posted (required). |
| reason | string | no | Why 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The workspace's public id, e.g. wsp_abc (required). |
| userId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | no | The job's id (required). |
| creatorId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | no | The job's id (required). |
| displayName | string | no | The creator's display name, e.g. "Jane Doe" (required). |
| string | no | The creator's outreach email, e.g. jane@example.com (required). | |
| platform | string | no | The social platform: instagram or youtube (required). |
| handle | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The workspace's public id to create the job in, e.g. wsp_abc (required). |
| title | string | no | The job's title (required). |
| platform | string | no | The platform the job targets: instagram, youtube or tiktok (optional). |
| postingWindowStart | string | no | Start of the posting window, ISO date YYYY-MM-DD (optional). |
| postingWindowEnd | string | no | End of the posting window, ISO date YYYY-MM-DD; on or after the start (optional). |
| deliverables | array | no | Deliverable 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| jobId | string | no | The job's id to open or close (required). |
| status | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The workspace's public id, e.g. wsp_abc (required). |
| string | no | The invitee's email address (required). | |
| role | string | no | The role to grant: viewer, member or admin (required). |
| department | string | no | Optional 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| platform | string | no | The social platform, e.g. instagram or youtube (required). |
| handle | string | no | The creator's handle on that platform, e.g. @janedoe (required). |
| displayName | string | no | The creator's display name, e.g. "Jane Doe" (optional). |
| reenrich | boolean | no | True 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| workspaceId | string | no | The workspace's public id, e.g. wsp_abc (required). |
| requiresComplianceReview | boolean | no | true 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| conversationId | string | no | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
| conversationId | string | no | Reply to an existing thread by its cnv_ public id (provide this OR creatorId). |
| creatorId | string | no | Open-or-reuse the thread with this creator by id (provide this OR conversationId). |
| workspaceId | string | no | The workspace's public id (wsp_…), used with creatorId. Required if you belong to more than one workspace; optional if exactly one. Ignored with conversationId. |
| body | string | no | The 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)