@instavar/mcp-server
Advanced tools
+69
-1
@@ -116,2 +116,3 @@ #!/usr/bin/env node | ||
| "customer_story", | ||
| "directions", | ||
| "other" | ||
@@ -167,2 +168,40 @@ ]; | ||
| }); | ||
| var directionsBriefSchema = z.object({ | ||
| subtitle: z.string().optional(), | ||
| unitLabel: z.string().optional(), | ||
| distanceTimeChip: z.string().optional(), | ||
| clips: z.array( | ||
| z.object({ | ||
| src: z.string(), | ||
| trimStartSeconds: z.number().optional(), | ||
| trimEndSeconds: z.number(), | ||
| speed: z.number().optional(), | ||
| mirrorFlip: z.boolean().optional() | ||
| }) | ||
| ).min(1), | ||
| cues: z.array( | ||
| z.object({ | ||
| atSeconds: z.number(), | ||
| text: z.string(), | ||
| arrow: z.enum(["left", "right", "forward"]).optional(), | ||
| step: z.number().optional() | ||
| }) | ||
| ), | ||
| outro: z.object({ | ||
| heading: z.string().optional(), | ||
| body: z.array(z.string()).optional(), | ||
| seconds: z.number().optional() | ||
| }).optional(), | ||
| music: z.object({ | ||
| perSegment: z.array( | ||
| z.object({ | ||
| src: z.string(), | ||
| clipIndexStart: z.number().optional(), | ||
| hotOffsetSeconds: z.number().optional(), | ||
| volume: z.number().optional() | ||
| }) | ||
| ).optional(), | ||
| crossfadeSeconds: z.number().optional() | ||
| }).optional() | ||
| }); | ||
| var createBriefShape = { | ||
@@ -178,3 +217,6 @@ title: z.string().min(1).max(120).describe("Short title (max 120 chars)"), | ||
| aspectRatio: z.enum(ASPECT_RATIOS).default("9:16").describe("Aspect ratio (default 9:16)"), | ||
| compositionId: z.string().optional().describe("Remotion composition ID override (advanced)") | ||
| compositionId: z.string().optional().describe("Remotion composition ID override (advanced)"), | ||
| directions: directionsBriefSchema.optional().describe( | ||
| "DirectionsWalkthrough 'find-us' payload: source clips (legs), decision-point cues on the realtime walk timeline, outro, and optional music. Set compositionId 'DirectionsWalkthrough' (or objective 'directions')." | ||
| ) | ||
| }; | ||
@@ -303,2 +345,28 @@ var editBriefShape = { | ||
| ); | ||
| server.tool( | ||
| "connect_account", | ||
| "Start connecting a social account headlessly (no local browser needed). Returns an approve URL + a short confirm code: open the URL in a browser signed in to Instavar, check the code matches THIS terminal, and approve. Then poll connect_account_status with the returned pairingId until it reports 'connected'.", | ||
| { | ||
| provider: z2.enum([ | ||
| "youtube", | ||
| "x", | ||
| "tiktok", | ||
| "linkedin", | ||
| "facebook", | ||
| "instagram", | ||
| "threads" | ||
| ]).describe("The social platform to connect") | ||
| }, | ||
| async ({ provider }) => runTool(() => apiPost(`/api/v1/connect/start`, { provider })) | ||
| ); | ||
| server.tool( | ||
| "connect_account_status", | ||
| "Poll a pending account connection started by connect_account. Returns status 'pending' | 'connected' | 'expired', plus the connected account label once connected.", | ||
| { pairingId: uuid("The pairingId returned by connect_account") }, | ||
| async ({ pairingId }) => runTool( | ||
| () => apiGet( | ||
| `/api/v1/connect/poll?pairingId=${encodeURIComponent(pairingId)}` | ||
| ) | ||
| ) | ||
| ); | ||
| } | ||
@@ -305,0 +373,0 @@ |
+2
-1
| { | ||
| "name": "@instavar/mcp-server", | ||
| "version": "0.1.1", | ||
| "version": "0.1.2", | ||
| "mcpName": "com.instavar/mcp-server", | ||
| "description": "Instavar Studio MCP server — drive the full video create→render→approve→publish→metrics workflow from Claude Code or Codex with an API key.", | ||
@@ -5,0 +6,0 @@ "type": "module", |
+22
-11
@@ -40,16 +40,27 @@ # @instavar/mcp-server | ||
| | Tool | What it does | | ||
| | -------------------- | --------------------------------------------------------------- | | ||
| | `list_jobs` | List recent jobs (newest first). | | ||
| | `get_job_status` | Runs, artifacts, verifications, current video + thumbnail URLs. | | ||
| | `get_video_state` | Materialized composition state for a job. | | ||
| | `get_job_metrics` | Platform engagement snapshots for a published job. | | ||
| | `get_cost_summary` | Infra cost summary (Lambda / RunPod / R2 / WaveSpeed / PoYo). | | ||
| | `create_video_brief` | Create a job from a structured brief and start rendering. | | ||
| | `edit_video_brief` | Patch a brief and re-render. | | ||
| | `approve_job` | Approve a rendered job so it can be published. | | ||
| | `publish_job` | Publish an approved job to its connected social destination. | | ||
| | Tool | What it does | | ||
| | ------------------------ | --------------------------------------------------------------- | | ||
| | `list_jobs` | List recent jobs (newest first). | | ||
| | `get_job_status` | Runs, artifacts, verifications, current video + thumbnail URLs. | | ||
| | `get_video_state` | Materialized composition state for a job. | | ||
| | `get_job_metrics` | Platform engagement snapshots for a published job. | | ||
| | `get_cost_summary` | Infra cost summary (Lambda / RunPod / R2 / WaveSpeed / PoYo). | | ||
| | `create_video_brief` | Create a job from a structured brief and start rendering. | | ||
| | `edit_video_brief` | Patch a brief and re-render. | | ||
| | `approve_job` | Approve a rendered job so it can be published. | | ||
| | `publish_job` | Publish an approved job to its connected social destination. | | ||
| | `connect_account` | Start connecting a social account (headless OAuth pairing). | | ||
| | `connect_account_status` | Poll a pending account connection until it is connected. | | ||
| Writes require a key with the `write` scope; `publish_job` requires `publish`. | ||
| ### Connecting a social account from the terminal | ||
| `connect_account` returns an **approve URL** and a short **confirm code**. Open | ||
| the URL in a browser where you are signed in to Instavar, check the code matches | ||
| the one in your terminal, and approve — you go through the platform's normal | ||
| sign-in, then return to Instavar. Poll `connect_account_status` with the returned | ||
| `pairingId` until it reports `connected`. Pairings expire after 10 minutes and | ||
| can only be approved by an owner/admin of the workspace. | ||
| ## CLI | ||
@@ -56,0 +67,0 @@ |
18818
20.69%404
20.6%75
17.19%