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, 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_my_videos
Lists the videos the connected user can see — a creator's own deliveries (an agency's whole roster), or a workspace member's videos — newest first. All parameters are optional. `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, dealId, jobTitle, brandName, muxStatus — preparing/ready/errored, state — in_review/changes_requested/approved/rejected, playbackId, versionCount, and createdAt), `total` (the count before pagination, so you can tell whether more pages exist), `limit`, and `offset`.
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
| 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_my_videos",
"arguments": {
"limit": 1,
"offset": 1
}
}
}Example result
{
"videos": [
{
"id": "22222222-0000-0000-0000-000000000000",
"title": "Product Launch Spot",
"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
}list_videos_awaiting_review
Lists videos whose current cut is awaiting a review decision (review state `in_review`) across the workspaces the connected user can see, newest first — a brand reviewer's queue. All parameters are optional. `workspaceId` narrows to a single workspace (e.g. workspaceId: "7f3c…"); omit it to span every workspace the caller belongs to. `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 — always in_review here, 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 | Narrow to a single workspace by id; omit to span all the caller's workspaces. |
| 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_awaiting_review",
"arguments": {
"workspaceId": "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_awaiting_review`, 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/rejected), 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
}
]
}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)