Koskamo

Clipform MCP

An MCP server that enables AI assistants to create, edit, publish, and manage interactive video forms, including nodes, media, theming, and analytics, through natural language conversation.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Clipform MCP logo, by ClipformCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Clipform
You need:Generate an API key in your dashboard under Developers > API keys
MCP endpoint (Streamable HTTP)
https://mcp.clipform.io
Vendor documentation

What you can do with it

  • Create new forms with nodes, theming, and tags
  • View form responses and analytics results
  • Update form settings and node configurations
  • Generate and manage media for forms

Source and maintenance

Community listingRegistry 4.11.0
Maintenance checked

Protocol and capabilities

Server
io.github.Clipform/mcp-server 4.10.6
MCP protocol
2025-06-18
Tools
33 advertised
Resources
13 advertised
Resource templates
0 advertised
Prompts
10 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Clipform builds interactive video-style forms that other people fill in, with their answers (video, audio, or text) stored for the owner to read back: quiz, survey, interview, testimonial, application, booking, client intake, and lead capture. Drafting questions as text to review or paste is a chat task, not a Clipform build. When this is the start of a new conversation and the user has not yet said what they want to build, offer to build their first form together and give them two ways to start, as plain text: "Already have a Clipform account? Say 'sign in'." (when they say it, call clipform_whoami - it starts sign-in), or pick a starting point: quiz, survey, interview, testimonial, application, booking, client intake, lead capture, or something else - ask which one fits, or invite them to describe what they need instead. If the user's first message already states what they want to build, even loosely, skip that offer entirely and go straight into the brief-driven flow below. When the brief is clear, build the form directly; when it's vague, ask one or two short questions first. Prefer rich media: video over images over plain text. Before building, derive a register from the topic and audience (e.g. hype, playful, warm, considered, elegant, sombre); if the user states a mood explicitly, that wins. State the register once, then apply it to every rendering choice - narration tone, motion preset, music, pacing. Never mix registers in one form. At the start of a build, call clipform_get_workflow to load the recipe for the form type, and clipform_get_guide for craft detail. Every *_id argument is a UUID returned by the tools - not the short share_id from a form URL. Use clipform_whoami when the request is about the account itself (the active workspace, plan, or limits); building a form does not need it first. Deleting a form moves it to the trash (restorable from the dashboard); deleting a node cannot be undone (a node deleted on a live form stays on the live form until you publish); removing media from a node only unlinks it, and the media asset stays in the library. Those tools ask the user to confirm before running.

Tools

33 advertised

clipform_create_form — Create Clipform
Advertised by the server during the last successful anonymous check.
Open-world

Create a new Clipform (interactive video-style form). Returns a viewer URL and form ID. When connected via an authenticated MCP client (e.g. claude.ai), the form lands directly in the user's workspace. Anonymous sessions build into a temporary account of their own: guests connected through a chat app (ChatGPT, Claude) get a form that goes live, takes up to 3 responses and goes offline after 7 days unless the user signs up, with steps that need an account (such as payments and uploads) switched off until sign-up; other anonymous channels stay private previews. Some results also include a one-time claim URL that signs the user into that account; relay it when present. If the user hasn't said what to build yet, offer to build their first form and suggest starting points: quiz, survey, interview, testimonial, application, booking, client intake, lead capture, or something else. Node types (omit config to use defaults where shown): - choice: Single or multiple choice node with predefined options (supports options array). Config: choice ({enable_branching, show_answer_feedback, record_scores}), selection_mode ("single"|"multiple", default: "single"), allow_text_response (boolean, default: false), randomise_options (boolean, default: false), show_option_count (boolean, default: false), option_display ("list"|"letters", default: "list"). Defaults: {"selection_mode":"single","choice":{"enable_branching":false},"randomise_options":false,"show_option_count":false,"option_display":"list"} - open: Free-form text responses from users. Config: formats (array of {format, order}), max_recording_seconds (number, default: 120). Defaults: {"formats":[{"order":0,"format":"text"},{"order":1,"format":"audio"},{"order":2,"format":"video"}]} - details: Collect several fields on one screen - name, email, phone, address, date, and more. Config: title (string), fields (array of {id, type, label, order, required, is_custom}), description (string), consent_items (array of {id, name, label, order, type, document, require_scroll_to_accept}), Available field IDs: first_name, last_name, email, phone. Defaults: {"fields":[{"id":"first_name","type":"first_name","label":"First Name","enabled":true,"required":true},{"id":"email","type":"email","label":"Email","enabled":true,"required":true}],"consent_items":[]} - draw: Drawing canvas; respondents draw and it is saved as a PNG image. Config: title (string), description (string), paper_color (string, default: "#FAF9F6"), diagram ({opacity, scale, preset}). Defaults: {"paper_color":"#FAF9F6","stroke_colors":["#1F2937","#EF4444","#3B82F6","#22C55E","#FACC15"],"stroke_widths":[3,6,12],"diagram":{"opacity":1,"scale":1}} - camera: Capture a photo or video from the device camera. Config: title (string), description (string), camera_facing ("user"|"environment", default: "user"), allowed_capture (array of "photo"|"video"), camera_capture (array of "photo"|"video"), allow_library_upload (boolean, default: true), capture_order (array of "photo"|"video"|"library"), max_files (number, default: 1), min_files (number, default: 1) - payment: Collect a payment from respondents inline, charged to a connected Stripe account. Config: amount (number), currency ("usd"|"eur"|"gbp"|"cad"|"aud", default: "usd"), provider ("stripe"|"paddle", default: "stripe"), workspace_integration_id (string), title (string), description (string). Defaults: {"amount":null,"currency":"usd","provider":"stripe"} - button: Simple button for acknowledgment or navigation (supports options array). Config: button_text (string, default: "Continue"), button_style ("primary"|"secondary"|"outline", default: "primary") - redirect: Redirect users to an external URL. Config: url (string), auto_redirect (boolean, default: true). Defaults: {"url":"","auto_redirect":true} - file_download: Provide a file for respondents to download. Config: files (array of {file_name, display_name, file_path, file_size, mime_type}), button_text (string, default: "Continue"), description (string) - end_screen: Final screen shown when form is completed. Config: title (string, default: "Thank you!"), message (string, default: "Your response has been submitted."), icon ("tick"|"trophy"|"star"|"crown"|"party"|"none", default: "tick"), show_share_button (boolean, default: false), cta_type ("none"|"restart"|"external_link", default: "none"), cta_text (string, default: "Continue"), cta_url (string). Defaults: {"title":"Thank you!","message":"Your response has been submitted."} All type definitions and config schemas are derived from @vid-master/config (node-types). Refer to the config descriptions above for the correct keys and shapes. AI-PROTECTED parameters have restrictions noted in their descriptions. Example: A form that asks a question, collects contact info, then finishes: { title: "Quick Survey", nodes: [ { type: "open", prompt: "What's your biggest challenge?" }, { type: "details", prompt: "Leave your details", config: { fields: [{ id: "first_name", required: true }, { id: "email", required: true }] } }, { type: "end_screen", prompt: "Thanks for your response!" } ] }

clipform_create_form input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "nodes",
    "context"
  ],
  "properties": {
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tags for indexing (e.g. ['quiz', 'trivia', 'arsenal']). Include format, genre, and topics."
    },
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type",
          "prompt"
        ],
        "properties": {
          "type": {
            "enum": [
              "choice",
              "open",
              "details",
              "draw",
              "camera",
              "payment",
              "button",
              "redirect",
              "file_download",
              "end_screen"
            ],
            "type": "string"
          },
          "label": {
            "type": "string",
            "description": "Short label for the node (used in logic builder). Defaults to the prompt text."
          },
          "config": {
            "type": "object",
            "description": "Type-specific configuration keyed by node type. Omit to use defaults. Per-type keys, shapes, and defaults are listed in the clipform_create_form description; craft guidance via clipform_get_guide.",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "prompt": {
            "type": "string",
            "description": "The text shown to the respondent"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "content"
              ],
              "properties": {
                "score": {
                  "type": "number",
                  "description": "Score value for this option (for scored quizzes). Use 1 for correct, 0 for wrong. Scored options automatically enable correct-answer marking (record_scores) and correct/incorrect answer feedback on the node; set config.choice.show_answer_feedback: false to hide the feedback."
                },
                "content": {
                  "type": "string",
                  "description": "Option text"
                },
                "is_correct": {
                  "type": "boolean",
                  "description": "Mark this as the correct answer for a quiz (maps to score 1; other options score 0). Use this OR score, not both."
                }
              }
            },
            "description": "Answer options. choice: required, min 1, max 12, max 6 when option_display is \"letters\", content max 36 chars button: required, min 1, max 1, content max 28 chars"
          },
          "required": {
            "type": "boolean",
            "default": true
          }
        }
      },
      "minItems": 1,
      "description": "Ordered list of nodes/steps for the form"
    },
    "title": {
      "type": "string",
      "description": "Form title"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "font_family": {
      "type": "string",
      "description": "AI-PROTECTED: Only set when the user explicitly requests a specific font."
    },
    "workspace_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Workspace to act in (id from clipform_whoami workspaces). Omit to use the connection's default workspace."
    },
    "primary_color": {
      "type": "string",
      "pattern": "^#[0-9A-Fa-f]{6}$",
      "description": "Primary/brand color as 6-digit hex (e.g. '#FF5500'). Used for buttons and accents."
    },
    "background_color": {
      "type": "string",
      "pattern": "^#[0-9A-Fa-f]{6}$",
      "description": "Background color as 6-digit hex (e.g. '#1A1A2E')."
    },
    "show_step_counter": {
      "type": "boolean",
      "description": "Show step counter (e.g. '1/5'). Set true for quizzes."
    },
    "disable_back_navigation": {
      "type": "boolean",
      "description": "Prevent going back. Set true for quizzes."
    }
  }
}
clipform_create_form output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "viewer_url",
    "nodes"
  ],
  "properties": {
    "plan": {
      "type": "object",
      "required": [
        "name",
        "auth_mode"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "auth_mode": {
          "type": "string"
        }
      },
      "description": "Plan and auth context for this session",
      "additionalProperties": false
    },
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "type",
          "prompt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Created nodes in order - IDs for attach_node_media / update_node"
    },
    "form_id": {
      "type": "string",
      "description": "Form UUID - pass to follow-up tools"
    },
    "claim_url": {
      "type": "string",
      "description": "Anonymous builds only. One-time link to sign up, keep this form and switch on its locked steps."
    },
    "is_preview": {
      "type": "boolean",
      "description": "True when viewer_url is a private preview (answers are not saved), false when it is the live URL."
    },
    "viewer_url": {
      "type": "string",
      "description": "Form URL for respondents - the live public URL. For a guest build held back from going live this is a private preview link instead: answers are not saved, do not share it with respondents."
    },
    "preview_url": {
      "type": "string",
      "description": "Anonymous builds only. Private preview of the form. Answers are not saved, so do not share it with respondents."
    },
    "dashboard_url": {
      "type": "string",
      "description": "Builder URL (sign in to edit). For an anonymous build this is a one-time sign-up link, not an editor."
    },
    "workspace_name": {
      "type": "string",
      "description": "Name of the workspace the form was created in"
    }
  },
  "additionalProperties": false
}
clipform_create_form annotations
{
  "title": "Create Clipform",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_import_form — Import Form
Advertised by the server during the last successful anonymous check.
Open-world

Copies the questions from a public Google Form, Typeform, or Tally form into a new Clipform draft. The source form and its responses stay where they are. Supported URLs: Google Forms (docs.google.com or forms.gle - must be shared as "Anyone with the link"), Typeform (form.typeform.com/to/...), and Tally (tally.so - must be public). The source form must be publicly accessible; a private form's questions cannot be read. The new Clipform is created as a DRAFT - review it, then republish with clipform_update_form (is_live: true) once it's ready. Some question types don't map cleanly to a Clipform node and are skipped rather than guessed at; the result always reports exactly what was imported vs skipped, and why.

clipform_import_form input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "url",
    "context"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Public URL of the Google Form, Typeform, or Tally form to import"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "workspace_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Workspace to act in (id from clipform_whoami workspaces). Omit to use the connection's default workspace."
    }
  }
}
clipform_import_form output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "viewer_url",
    "import_summary"
  ],
  "properties": {
    "form_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "New form's UUID - pass to follow-up tools. Null when no importable questions were found (nothing was created)."
    },
    "viewer_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The address this form WILL be live at once published (clipform_update_form with is_live: true) - it is a draft and is NOT viewable by anyone yet; opening it now shows a maintenance screen, not the form. Null when no importable questions were found."
    },
    "import_summary": {
      "type": "object",
      "required": [
        "title",
        "total_questions",
        "imported",
        "skipped",
        "skipped_details",
        "warnings"
      ],
      "properties": {
        "title": {
          "type": "string",
          "description": "Title of the source form"
        },
        "skipped": {
          "type": "number",
          "description": "Questions that could not be converted"
        },
        "imported": {
          "type": "number",
          "description": "Questions successfully converted into Clipform nodes"
        },
        "warnings": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Non-fatal issues surfaced during the import"
        },
        "skipped_details": {
          "type": "array",
          "items": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "description": "Per-skipped-question title, reason, and source question type"
        },
        "total_questions": {
          "type": "number",
          "description": "Total questions found in the source form"
        }
      },
      "additionalProperties": false
    },
    "workspace_name": {
      "type": "string",
      "description": "Name of the workspace the form was created in"
    }
  },
  "additionalProperties": false
}
clipform_import_form annotations
{
  "title": "Import Form",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_list_forms — List Clipforms
Advertised by the server during the last successful anonymous check.
Advertised read-only

List forms in your workspace with optional filtering. Returns paginated results (cursor-based). next_cursor is included when more results exist. To find or open a form by name, pass search with part of its title instead of paging through results. Needs a signed-in Clipform account (an anonymous session is asked to sign in).

clipform_list_forms input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "tag": {
      "type": "string",
      "description": "Filter by tag name(s), comma-separated. AND logic: only forms with ALL tags are returned."
    },
    "sort": {
      "enum": [
        "created_at",
        "updated_at"
      ],
      "type": "string",
      "description": "Sort field (default: created_at)"
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Number of forms to return (default 25, max 100)"
    },
    "order": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "description": "Sort order (default: desc, newest first)"
    },
    "cursor": {
      "type": "string",
      "description": "Pagination cursor from previous response's next_cursor"
    },
    "search": {
      "type": "string",
      "description": "Filter to forms whose title contains this text (case-insensitive substring). Use this to resolve a form by name in one call instead of paginating."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "published": {
      "enum": [
        "true",
        "false"
      ],
      "type": "string",
      "description": "Filter by publish status"
    },
    "workspace_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Workspace to act in (id from clipform_whoami workspaces). Omit to use the connection's default workspace."
    }
  }
}
clipform_list_forms output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "forms",
    "next_cursor"
  ],
  "properties": {
    "forms": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "share_id",
          "is_live",
          "has_unpublished_changes",
          "tags"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name",
                "color"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "color": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            }
          },
          "title": {
            "type": "string"
          },
          "is_live": {
            "type": "boolean"
          },
          "share_id": {
            "type": "string"
          },
          "viewer_url": {
            "type": "string",
            "description": "Live respondent link. Only present for a published (is_live) form, and not for an anonymous caller."
          },
          "builder_url": {
            "type": "string",
            "description": "Dashboard Build tab for this form. Not present for an anonymous caller."
          },
          "has_unpublished_changes": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "description": "Matching forms (empty if none)"
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Pass as cursor to fetch the next page, or null when no more"
    }
  },
  "additionalProperties": false
}
clipform_list_forms annotations
{
  "title": "List Clipforms",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_whoami — Who Am I
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show the current identity: auth mode (api key, oauth, session, or anonymous), active workspace, and plan limits. Needs a signed-in Clipform account (an anonymous session is asked to sign in).

clipform_whoami input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    }
  }
}
clipform_whoami output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "auth_mode",
    "is_authenticated",
    "workspace",
    "plan"
  ],
  "properties": {
    "plan": {
      "type": "object",
      "required": [
        "name",
        "tier",
        "node_limit",
        "form_limit"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "tier": {
          "type": "number"
        },
        "form_limit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "description": "Max forms in the workspace, or null if unlimited"
        },
        "node_limit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "description": "Max nodes per form, or null if unlimited"
        }
      },
      "description": "Plan limits for the active workspace",
      "additionalProperties": false
    },
    "links": {
      "type": "object",
      "required": [
        "dashboard",
        "forms"
      ],
      "properties": {
        "forms": {
          "type": "string",
          "description": "Forms list for the active workspace."
        },
        "dashboard": {
          "type": "string",
          "description": "Dashboard home for the active workspace."
        }
      },
      "description": "Workspace-level dashboard links - only present for a non-anonymous caller.",
      "additionalProperties": false
    },
    "notice": {
      "type": "string",
      "description": "Anonymous sessions only: the account is a temporary preview until claimed."
    },
    "auth_mode": {
      "enum": [
        "api_key",
        "oauth",
        "session",
        "anonymous"
      ],
      "type": "string",
      "description": "How this session is authenticated"
    },
    "workspace": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "id",
            "name"
          ],
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Active workspace, or null when anonymous"
    },
    "workspaces": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Workspaces the caller can target with workspace_id - present for session (dashboard) auth and the OAuth connector"
    },
    "is_authenticated": {
      "type": "boolean",
      "description": "True for api_key, oauth, or session auth; false for anonymous"
    },
    "default_workspace_id": {
      "type": "string",
      "description": "OAuth connector only: the workspace used when a tool call omits workspace_id"
    }
  },
  "additionalProperties": false
}
clipform_whoami annotations
{
  "title": "Who Am I",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_get_form — Get Clipform
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a form's details including all nodes in sequential order and their routing. Returns title, settings, and every node with its options, config, media status, and next node (from clipform_set_logic).

clipform_get_form input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    }
  }
}
clipform_get_form output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "title",
    "is_live",
    "has_unpublished_changes",
    "nodes"
  ],
  "properties": {
    "urls": {
      "type": "object",
      "properties": {
        "embed": {
          "type": "string",
          "description": "Embed setup for websites. Not present for an anonymous caller."
        },
        "share": {
          "type": "string",
          "description": "Share tab - link, QR, social. Not present for an anonymous caller."
        },
        "viewer": {
          "type": "string",
          "description": "Live respondent link, or - for an anonymous caller's draft - a private preview link where answers are not saved (do not share it with respondents). Omitted for a non-anonymous caller's unpublished draft."
        },
        "builder": {
          "type": "string",
          "description": "Build tab - the node/canvas editor. Not present for an anonymous caller."
        },
        "summary": {
          "type": "string",
          "description": "Summary tab - form overview and key stats. Not present for an anonymous caller."
        },
        "analytics": {
          "type": "string",
          "description": "Analytics tab - views, starts, completion rate, drop-off per node. Not present for an anonymous caller."
        },
        "responses": {
          "type": "string",
          "description": "Responses tab - individual submissions. Not present for an anonymous caller."
        },
        "dynamic_link": {
          "type": "string",
          "description": "Dynamic/personalized link setup. Not present for an anonymous caller."
        }
      },
      "description": "Dashboard/viewer deeplinks for this form. An anonymous caller gets only 'viewer'.",
      "additionalProperties": false
    },
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "type",
          "prompt",
          "required"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "next": {
            "type": "object",
            "required": [
              "target_id",
              "target_type"
            ],
            "properties": {
              "target_id": {
                "type": "string",
                "description": "The node/screen ID this node routes to"
              },
              "target_type": {
                "enum": [
                  "node",
                  "end_screen",
                  "redirect",
                  "link_list"
                ],
                "type": "string",
                "description": "What kind of target target_id is"
              }
            },
            "description": "This node's outgoing edge, set via clipform_set_logic. Omitted for a chain tail or terminal node.",
            "additionalProperties": false
          },
          "type": {
            "type": "string"
          },
          "config": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "prompt": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "content"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "content": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "required": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "description": "Nodes in sequential order - IDs for update_node / attach_node_media"
    },
    "title": {
      "type": "string",
      "description": "Form title"
    },
    "form_id": {
      "type": "string",
      "description": "Form UUID"
    },
    "is_live": {
      "type": "boolean",
      "description": "Whether the form is published"
    },
    "has_unpublished_changes": {
      "type": "boolean",
      "description": "Live form has edits not yet republished"
    }
  },
  "additionalProperties": false
}
clipform_get_form annotations
{
  "title": "Get Clipform",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_update_form — Update Clipform
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update a form's title, publish status, settings, or tags. Only sends fields that are provided - omitted fields remain unchanged. AI-PROTECTED parameters have restrictions noted in their descriptions.

clipform_update_form input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "context"
  ],
  "properties": {
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Replace all tags on this form. Pass the full desired set (e.g. ['quiz', 'trivia', 'slug:elephants']). Omit to leave tags unchanged."
    },
    "title": {
      "type": "string",
      "description": "New form title"
    },
    "author": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "AI-PROTECTED: Only set when the user explicitly provides an author name. Set null to clear."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "is_live": {
      "type": "boolean",
      "description": "Setting true publishes/republishes the snapshot respondents see. Forms are live from creation, but edits and media attached AFTER creation are not visible until you re-send true - republishing is the expected final step of a build, never skip it after attaching media. Setting false takes the form offline (keeps the last published snapshot) - AI-PROTECTED: only take a form offline when the user explicitly asks."
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "AI-PROTECTED: Only set when the user explicitly provides a logo URL. Set null to clear."
    },
    "brand_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "AI-PROTECTED: Custom brand name shown in footer. Only set when user explicitly provides."
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "SEO description (meta description, og:description). Set null to clear."
    },
    "font_family": {
      "type": "string",
      "description": "AI-PROTECTED: Only set when the user explicitly requests a specific font."
    },
    "total_steps": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Override the total step count shown in the step counter. Set null to auto-calculate."
    },
    "primary_color": {
      "type": "string",
      "pattern": "^#[0-9A-Fa-f]{6}$",
      "description": "Primary/brand color as 6-digit hex (e.g. '#FF5500'). Used for buttons and accents."
    },
    "show_branding": {
      "type": "boolean",
      "description": "Show Clipform branding. Set false to remove (Pro plan)."
    },
    "background_color": {
      "type": "string",
      "pattern": "^#[0-9A-Fa-f]{6}$",
      "description": "Background color as 6-digit hex (e.g. '#1A1A2E')."
    },
    "show_step_counter": {
      "type": "boolean",
      "description": "Show step counter (e.g. '1/5'). Recommended for quizzes."
    },
    "cover_media_asset_id": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        {
          "type": "null"
        }
      ],
      "description": "Cover image: the picture shown in emails, link previews and on the embed button, cropped to the form's 9:16 frame. A media_asset_id of a ready still image in this form's workspace. Set null to clear and fall back to the first step's media. Goes live on the next publish (is_live: true), which can be in the same call."
    },
    "disable_back_navigation": {
      "type": "boolean",
      "description": "Prevent respondents from going back. Recommended for quizzes."
    }
  }
}
clipform_update_form output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "updated_fields"
  ],
  "properties": {
    "form_id": {
      "type": "string",
      "description": "Form UUID"
    },
    "updated_fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Names of the fields that were changed by this call"
    }
  },
  "additionalProperties": false
}
clipform_update_form annotations
{
  "title": "Update Clipform",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_delete_form — Delete Clipform
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Move a form and all its nodes to the trash. It stops accepting responses immediately and can be restored later. Requires user confirmation before it runs. Needs a signed-in Clipform account (an anonymous session is asked to sign in).

clipform_delete_form input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "context"
  ],
  "properties": {
    "confirm": {
      "type": "boolean",
      "description": "Set to true ONLY after the user has explicitly confirmed this destructive action. Leave unset otherwise - hosts that support confirmation dialogs will prompt the user automatically."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID to delete (returned by clipform_create_form, not the short share_id from the URL)"
    }
  }
}
clipform_delete_form annotations
{
  "title": "Delete Clipform",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_get_results — Get Clipform Results
Advertised by the server during the last successful anonymous check.
Advertised read-only

View response counts, choice/action answer breakdowns, and recent open-text answers for a form. Answers to booking, contact details, file upload, drawing, camera, and payment nodes are counts only - use the dashboard for per-response detail. Needs a signed-in Clipform account (an anonymous session is asked to sign in).

clipform_get_results input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    }
  }
}
clipform_get_results output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "total_responses",
    "nodes"
  ],
  "properties": {
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "node_type",
          "prompt",
          "total_responses",
          "total_views"
        ],
        "properties": {
          "prompt": {
            "type": "string"
          },
          "node_id": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "label",
                "count",
                "percentage"
              ],
              "properties": {
                "count": {
                  "type": "number"
                },
                "label": {
                  "type": "string"
                },
                "percentage": {
                  "type": "number"
                }
              },
              "additionalProperties": false
            },
            "description": "Answer breakdown - choice and action-category (file_download/shopping) nodes only"
          },
          "node_type": {
            "type": "string"
          },
          "total_views": {
            "type": "number"
          },
          "recent_answers": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "text",
                "submitted_at"
              ],
              "properties": {
                "text": {
                  "type": "string"
                },
                "submitted_at": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "description": "Most recent open-text answers, capped at 20 - open questions only"
          },
          "selection_mode": {
            "enum": [
              "single",
              "multiple"
            ],
            "type": "string",
            "description": "Choice questions only. `multiple` = people could pick several options, so option counts add up past total_responses and the option percentages can sum past 100."
          },
          "total_responses": {
            "type": "number"
          }
        },
        "additionalProperties": false
      },
      "description": "Nodes in form order. The booking, contact details, file upload, drawing, camera, and payment nodes carry only total_responses/total_views - no per-response detail."
    },
    "results_url": {
      "type": "string",
      "description": "Dashboard Responses tab for this form. Not present for an anonymous caller."
    },
    "total_responses": {
      "type": "number",
      "description": "Total unique respondents to the form"
    }
  },
  "additionalProperties": false
}
clipform_get_results annotations
{
  "title": "Get Clipform Results",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_get_responses — List form responses
Advertised by the server during the last successful anonymous check.
Advertised read-only

List a Clipform form's individual responses (submissions) with time filtering - complements clipform_get_results (aggregates). Answers questions like 'what came in during the last 24 hours', 'what's the longest answer', 'what did people say'. Text answers plus a non-PII payment summary (amount and status); booking, contact details, file upload, drawing, and camera answers and audio/video recordings are redacted to placeholders and the customer's payment details stay in the dashboard (the responses URL from clipform_get_form). Responses are sorted newest first unless sort: 'oldest'. Needs a signed-in Clipform account (an anonymous session is asked to sign in).

clipform_get_responses input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "context"
  ],
  "properties": {
    "sort": {
      "enum": [
        "newest",
        "oldest"
      ],
      "type": "string",
      "description": "Order by submission time. Default: newest"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Max responses to return (default 20, max 50)"
    },
    "query": {
      "type": "string",
      "description": "Only responses whose text answers contain this string (case-insensitive)"
    },
    "since": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "Only responses submitted at or after this ISO 8601 time (e.g. '2026-08-29T00:00:00Z')"
    },
    "until": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
      "description": "Only responses submitted at or before this ISO 8601 time"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "description": "Form UUID (from clipform_list_forms / clipform_create_form)"
    }
  }
}
clipform_get_responses output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "total_matching",
    "returned",
    "locked_over_plan_limit",
    "responses"
  ],
  "properties": {
    "returned": {
      "type": "number",
      "description": "Responses in this result"
    },
    "responses": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "submitted_at",
          "status",
          "answers"
        ],
        "properties": {
          "status": {
            "type": "string"
          },
          "answers": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "question",
                "type",
                "answer"
              ],
              "properties": {
                "type": {
                  "type": "string"
                },
                "answer": {
                  "type": "string",
                  "description": "Text answer, or a redaction placeholder"
                },
                "question": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "submitted_at": {
            "type": "string",
            "description": "ISO 8601 submission time"
          }
        },
        "additionalProperties": false
      },
      "description": "Matching responses, filtered/sorted/capped per the inputs"
    },
    "total_matching": {
      "type": "number",
      "description": "Responses matching the filters (before the limit cap)"
    },
    "locked_over_plan_limit": {
      "type": "number",
      "description": "Matching responses hidden by the plan's response limit"
    }
  },
  "additionalProperties": false
}
clipform_get_responses annotations
{
  "title": "List form responses",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_add_node — Add Node
Advertised by the server during the last successful anonymous check.

Add a new node to an existing form. Inserted before the end screen by default; after_node_id controls insertion position. Inserting into a linear flow automatically re-links the chain (the node before the insertion point points to the new node, which points to what followed) - you do not need clipform_set_logic for a simple insert. Branching still needs an explicit logic write. Node types and config schemas match clipform_create_form.

clipform_add_node input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "node",
    "context"
  ],
  "properties": {
    "node": {
      "type": "object",
      "required": [
        "type",
        "prompt"
      ],
      "properties": {
        "type": {
          "enum": [
            "choice",
            "open",
            "details",
            "draw",
            "camera",
            "payment",
            "button",
            "redirect",
            "file_download",
            "end_screen"
          ],
          "type": "string"
        },
        "label": {
          "type": "string",
          "description": "Short label for the node (used in logic builder). Defaults to the prompt text."
        },
        "config": {
          "type": "object",
          "description": "Type-specific configuration keyed by node type. Omit to use defaults. Per-type keys, shapes, and defaults are listed in the clipform_create_form description; craft guidance via clipform_get_guide.",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        "prompt": {
          "type": "string",
          "description": "The text shown to the respondent"
        },
        "options": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "content"
            ],
            "properties": {
              "score": {
                "type": "number",
                "description": "Score value for this option (for scored quizzes). Use 1 for correct, 0 for wrong. Scored options automatically enable correct-answer marking (record_scores) and correct/incorrect answer feedback on the node; set config.choice.show_answer_feedback: false to hide the feedback."
              },
              "content": {
                "type": "string",
                "description": "Option text"
              },
              "is_correct": {
                "type": "boolean",
                "description": "Mark this as the correct answer for a quiz (maps to score 1; other options score 0). Use this OR score, not both."
              }
            }
          },
          "description": "Answer options. choice: required, min 1, max 12, max 6 when option_display is \"letters\", content max 36 chars button: required, min 1, max 1, content max 28 chars"
        },
        "required": {
          "type": "boolean",
          "default": true
        }
      },
      "description": "The node to add"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "after_node_id": {
      "type": "string",
      "description": "Insert after this node ID. Omit to append before the end screen."
    }
  }
}
clipform_add_node output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "node_id",
    "type"
  ],
  "properties": {
    "type": {
      "type": "string",
      "description": "Node type that was added"
    },
    "node_id": {
      "type": "string",
      "description": "ID of the created node - pass to update_node / attach_node_media"
    }
  },
  "additionalProperties": false
}
clipform_add_node annotations
{
  "title": "Add Node",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_update_node — Update Node
Advertised by the server during the last successful anonymous check.
Advertised destructive

Update one or more existing nodes' text, type, config, or options. Pass multiple updates in one call instead of separate tool calls. Requires node IDs (returned by clipform_create_form, clipform_add_node, or clipform_get_form). Does not change node positions in the flow. All type definitions and config schemas are derived from @vid-master/config (node-types).

clipform_update_node input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "updates",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "updates": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id"
        ],
        "properties": {
          "type": {
            "enum": [
              "choice",
              "open",
              "details",
              "draw",
              "camera",
              "payment",
              "button",
              "redirect",
              "file_download",
              "end_screen"
            ],
            "type": "string",
            "description": "Change the node type"
          },
          "label": {
            "type": "string",
            "description": "Short label for the node (used in logic builder)"
          },
          "config": {
            "type": "object",
            "description": "Type-specific configuration keyed by node type. Omit to use defaults. Per-type keys, shapes, and defaults are listed in the clipform_create_form description; craft guidance via clipform_get_guide. Merged shallowly into the stored config - only the keys you pass are changed. Set a key to null to delete it; nested objects are replaced wholesale. When type is changed in the same call, config replaces the stored configuration instead of merging.",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "prompt": {
            "type": "string",
            "description": "New node prompt text"
          },
          "node_id": {
            "type": "string",
            "description": "The node ID to update"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "content"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                  "description": "The option's id from clipform_get_form. Include it to keep this option with its routes, answer key and results; omit it to add a new option."
                },
                "score": {
                  "type": "number",
                  "description": "Score value for this option (for scored quizzes). Use 1 for correct, 0 for wrong. Scored options automatically enable correct-answer marking (record_scores) and correct/incorrect answer feedback on the node; set config.choice.show_answer_feedback: false to hide the feedback."
                },
                "content": {
                  "type": "string",
                  "description": "Option text"
                },
                "is_correct": {
                  "type": "boolean",
                  "description": "Mark this as the correct answer for a quiz (maps to score 1; other options score 0). Use this OR score, not both."
                }
              }
            },
            "description": "The full option list (for choice nodes). Include each option's id from clipform_get_form to keep that option and its routes, answer key and results. Options without an id are added as new. Options left out are removed together with their routes. Omit to keep existing options."
          },
          "required": {
            "type": "boolean",
            "description": "Whether an answer is required"
          }
        }
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "One or more node updates to apply"
    }
  }
}
clipform_update_node output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "node_id": {
            "type": "string"
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      },
      "description": "One result per requested update, in order"
    }
  },
  "additionalProperties": false
}
clipform_update_node annotations
{
  "title": "Update Node",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_delete_node — Delete Node
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a node from a form. The logic chain is automatically re-linked (the previous node will point to the next one). Cannot delete the start node or the last end screen. On a live form the node stays on the live form until the form is published. Requires user confirmation before it runs.

clipform_delete_node input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "node_id",
    "context"
  ],
  "properties": {
    "confirm": {
      "type": "boolean",
      "description": "Set to true ONLY after the user has explicitly confirmed this destructive action. Leave unset otherwise - hosts that support confirmation dialogs will prompt the user automatically."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "node_id": {
      "type": "string",
      "description": "The node ID to delete"
    }
  }
}
clipform_delete_node annotations
{
  "title": "Delete Node",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_upload_media_asset — Upload Media Asset
Advertised by the server during the last successful anonymous check.
Open-world

Put one or more media files into your workspace media library (max 10, uploaded sequentially). This is step one of attaching media to a node - follow up with clipform_attach_node_media to place the returned media_asset_id on a node. When a public URL is provided, the media is fetched and stored automatically. The API picks where each asset is stored based on its size and type. Word-level captions from clipform_generate_tts enable per-word highlighting in the viewer once attached - pass the caption_ref it returned instead of hand-copying the captions array. PDFs (media_type document) are for consent agreements: they return a document descriptor, not a media_asset_id. Provide media via `items` (explicit type + URL), `files` (files attached by the host client), or both. At least one is required.

clipform_upload_media_asset input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "object",
            "required": [
              "download_url"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "size": {
                "type": "number"
              },
              "file_id": {
                "type": "string",
                "description": "Host-assigned identifier for the attached file"
              },
              "file_name": {
                "type": "string"
              },
              "mime_type": {
                "type": "string",
                "description": "Declared MIME type - determines whether the file becomes a video or still asset"
              },
              "download_url": {
                "type": "string",
                "description": "Short-lived URL the server downloads the file's bytes from"
              }
            },
            "additionalProperties": {}
          }
        ]
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "Files attached by the host client. Each becomes a video or still library asset (or a consent-agreement document for application/pdf) based on its declared mime_type."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "media_type"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public URL that links directly to the media file itself. When provided, the server fetches and stores it directly."
          },
          "captions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "start",
                "end",
                "text",
                "words"
              ],
              "properties": {
                "end": {
                  "type": "number",
                  "description": "Segment end time in seconds"
                },
                "text": {
                  "type": "string",
                  "description": "Full segment text"
                },
                "start": {
                  "type": "number",
                  "description": "Segment start time in seconds"
                },
                "words": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "word",
                      "start",
                      "end"
                    ],
                    "properties": {
                      "end": {
                        "type": "number"
                      },
                      "word": {
                        "type": "string"
                      },
                      "start": {
                        "type": "number"
                      }
                    }
                  },
                  "minItems": 1,
                  "description": "Per-word timestamps within the segment. Required - copy the full array from clipform_generate_tts verbatim."
                }
              }
            },
            "description": "Word-level captions from clipform_generate_tts. `words` is a required field on each caption (schema-enforced) - pass the full objects returned by clipform_generate_tts unmodified."
          },
          "filename": {
            "type": "string",
            "maxLength": 200,
            "description": "Display filename for a document (media_type document). Defaults to the URL's file name."
          },
          "media_type": {
            "enum": [
              "video",
              "still",
              "document"
            ],
            "type": "string",
            "description": "Type of media. Use document for a consent-agreement PDF (url required, PDF only)."
          },
          "caption_ref": {
            "type": "string",
            "description": "caption_ref from clipform_generate_tts - an opaque handle that attaches that TTS run's word-level captions to this asset, resolved server-side. Preferred over captions."
          },
          "ai_generated": {
            "type": "boolean",
            "description": "Whether this media was AI-generated. Drives the viewer's disclosure chip - set true for AI-rendered/synthesized media."
          },
          "media_source": {
            "enum": [
              "uploaded",
              "recorded"
            ],
            "type": "string",
            "default": "uploaded",
            "description": "How the media was created"
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "One or more media items to create as workspace library assets"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form this is for (from clipform_create_form) - a routing hint only, to pick the right workspace. The result still lands in the workspace library, not on a node. Required on an anonymous session, or this lands in a different workspace and clipform_attach_node_media will not find it."
    },
    "workspace_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Workspace to act in (id from clipform_whoami workspaces). Omit to use the connection's default workspace."
    }
  }
}
clipform_upload_media_asset output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "media_type",
          "stored",
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "stored": {
            "type": "boolean",
            "description": "Bytes already stored (URL-based); false when an upload_url is pending"
          },
          "document": {
            "type": "object",
            "required": [
              "storage_path",
              "filename",
              "url",
              "version"
            ],
            "properties": {
              "url": {
                "type": "string"
              },
              "version": {
                "type": "string"
              },
              "filename": {
                "type": "string"
              },
              "storage_path": {
                "type": "string"
              }
            },
            "description": "Consent-agreement descriptor (documents only) - set as consent_items[i].document via clipform_update_node",
            "additionalProperties": false
          },
          "media_type": {
            "type": "string"
          },
          "upload_url": {
            "type": "string"
          },
          "upload_method": {
            "type": "string"
          },
          "media_asset_id": {
            "type": "string",
            "description": "Absent for documents"
          }
        },
        "additionalProperties": false
      },
      "description": "One result per item, in order"
    },
    "workspace_name": {
      "type": "string",
      "description": "Name of the workspace the media library entries were created in"
    }
  },
  "additionalProperties": false
}
clipform_upload_media_asset annotations
{
  "title": "Upload Media Asset",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_complete_media_upload — Complete Media Upload
Advertised by the server during the last successful anonymous check.

Confirm a signed-PUT still image upload finished, after PUTting the bytes to the upload_url returned by clipform_upload_media_asset. The API verifies the object actually landed in storage before flipping the asset from processing to ready - call this right after the PUT succeeds, or the asset stays invisible in the library. Not needed for video uploads (they settle automatically).

clipform_complete_media_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "media_asset_id",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form this is for (from clipform_create_form) - a routing hint only, to pick the right workspace. The result still lands in the workspace library, not on a node. Required on an anonymous session, or this lands in a different workspace and clipform_attach_node_media will not find it."
    },
    "media_asset_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The media_asset_id returned by clipform_upload_media_asset for the still image"
    }
  }
}
clipform_complete_media_upload output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "media_asset_id",
    "status"
  ],
  "properties": {
    "status": {
      "type": "string",
      "description": "The asset's status after this call - ready on success, or its already-settled status when called again (noop)"
    },
    "media_asset_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
clipform_complete_media_upload annotations
{
  "title": "Complete Media Upload",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_attach_node_media — Attach Node Media
Advertised by the server during the last successful anonymous check.
Advertised destructive

Attach an existing workspace media asset (from clipform_upload_media_asset) to one or more nodes (max 10). Pass one item or many; multiple items attach sequentially. Only works on node types that support media (choice, open, scale, draw, binary, button). A media asset is reusable - attach the same media_asset_id to several nodes.

clipform_attach_node_media input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "items",
    "context"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "media_asset_id"
        ],
        "properties": {
          "node_id": {
            "type": "string",
            "description": "The node ID"
          },
          "fit_media": {
            "type": "boolean",
            "description": "Show the whole frame (contain) instead of cover-cropping. ALWAYS set true when attaching renders from clipform_render_composition or clipform_render_video_template - they are composed 9:16 frames that must never be cropped. Leave unset for user-supplied media (arbitrary aspect ratios want the cover default)."
          },
          "show_captions": {
            "type": "boolean",
            "description": "Display captions/subtitles on the node. Defaults to on; pass false to hide them."
          },
          "media_asset_id": {
            "type": "string",
            "description": "A media asset ID returned by clipform_upload_media_asset"
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "One or more attachments to make"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    }
  }
}
clipform_attach_node_media output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "node_id": {
            "type": "string"
          },
          "media_asset_id": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "One result per item, in order"
    }
  },
  "additionalProperties": false
}
clipform_attach_node_media annotations
{
  "title": "Attach Node Media",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_get_node_media — Get Node Media
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the media attached to a node, including processing status. Useful for checking if a video upload has finished processing.

clipform_get_node_media input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "node_id",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "node_id": {
      "type": "string",
      "description": "The node ID"
    }
  }
}
clipform_get_node_media output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "media"
  ],
  "properties": {
    "media": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "media_type",
            "status"
          ],
          "properties": {
            "status": {
              "type": "string"
            },
            "duration": {
              "type": "number"
            },
            "media_type": {
              "type": "string"
            },
            "transcription_status": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Attached media (null if the node has none)"
    }
  },
  "additionalProperties": false
}
clipform_get_node_media annotations
{
  "title": "Get Node Media",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_delete_node_media — Delete Node Media
Advertised by the server during the last successful anonymous check.
Advertised destructive

Remove media from a node by unlinking it; the media asset and its files stay in the workspace library and keep working on any other node or live form that uses them. Requires user confirmation before it runs.

clipform_delete_node_media input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "node_id",
    "context"
  ],
  "properties": {
    "confirm": {
      "type": "boolean",
      "description": "Set to true ONLY after the user has explicitly confirmed this destructive action. Leave unset otherwise - hosts that support confirmation dialogs will prompt the user automatically."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    },
    "node_id": {
      "type": "string",
      "description": "The node ID"
    }
  }
}
clipform_delete_node_media annotations
{
  "title": "Delete Node Media",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_set_logic — Set Node Logic
Advertised by the server during the last successful anonymous check.
Advertised destructive

Set the next node for one or more nodes, wiring a linear route (A to B to C). Pass multiple nodes in one call instead of separate tool calls. Each node routes to exactly one target node. Branching by which option a respondent picks is not configured here; it is set up in the form's Build tab in the dashboard (the builder URL returned by clipform_get_form / clipform_create_form). A call replaces that node's routing entirely - it does not merge with any prior target. Example: nodes: [ { node_id: "q1-id", rules: [{ target_node_id: "q2-id" }] }, { node_id: "q2-id", rules: [{ target_node_id: "q3-id" }] } ]

clipform_set_logic input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "nodes",
    "context"
  ],
  "properties": {
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "rules"
        ],
        "properties": {
          "rules": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "target_node_id"
              ],
              "properties": {
                "target_node_id": {
                  "type": "string",
                  "description": "The node ID this node routes to"
                }
              }
            },
            "maxItems": 1,
            "minItems": 1,
            "description": "Exactly one rule: the single node this node routes to"
          },
          "node_id": {
            "type": "string",
            "description": "The node ID to set routing on"
          }
        }
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "One or more nodes to set logic on"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (returned by clipform_create_form, not the short share_id from the URL)"
    }
  }
}
clipform_set_logic output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "node_id",
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "node_id": {
            "type": "string"
          },
          "rules_count": {
            "type": "number"
          }
        },
        "additionalProperties": false
      },
      "description": "One result per node, in order"
    }
  },
  "additionalProperties": false
}
clipform_set_logic annotations
{
  "title": "Set Node Logic",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
clipform_log_generation — Log Form Generation Audit
Advertised by the server during the last successful anonymous check.

Internal audit step run by a form-generation workflow. Records a completed generation's content provenance (sources, image attributions) for the flow that just built the form. Not a user action - only call it as the final step of a generation workflow you are running, never in response to a plain create or edit request.

clipform_log_generation input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "form_id",
    "summary",
    "details",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "details": {
      "type": "object",
      "properties": {
        "images": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "url"
            ],
            "properties": {
              "url": {
                "type": "string"
              },
              "license": {
                "type": "string"
              },
              "attribution": {
                "type": "string"
              }
            }
          },
          "description": "Images used with attribution"
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "title"
            ],
            "properties": {
              "url": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "title": {
                "type": "string"
              }
            }
          },
          "description": "Knowledge sources used"
        }
      },
      "description": "Content sources and attributions"
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form ID (UUID format, not the share ID)"
    },
    "summary": {
      "type": "string",
      "description": "Short description of what was generated"
    }
  }
}
clipform_log_generation annotations
{
  "title": "Log Form Generation Audit",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_search_news — Search Recent News
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search recent news articles from NewsAPI and The Guardian and return them as structured results. Coverage: recent events, people, and topics (post-May-2025). Does NOT cover timeless topics (history, geography, science). Returns: article title, source, author, date, URL, description, and image URL per result.

clipform_search_news input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "context"
  ],
  "properties": {
    "count": {
      "type": "number",
      "maximum": 15,
      "minimum": 1,
      "description": "Max results per provider (default 5)"
    },
    "query": {
      "type": "string",
      "description": "News search query (e.g. 'Iran war 2026', 'Australian Open final', 'UK election')"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    }
  }
}
clipform_search_news output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "articles"
  ],
  "properties": {
    "query": {
      "type": "string"
    },
    "articles": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "author": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "image_url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "published_at": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Matching articles (empty if none)"
    }
  },
  "additionalProperties": false
}
clipform_search_news annotations
{
  "title": "Search Recent News",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_generate_tts — Generate Text-to-Speech
Advertised by the server during the last successful anonymous check.

Generate narration audio from text with word-level captions. Use this for quiz question narration, survey introductions, form instructions, or any node that benefits from a human voice. Proactively suggest narration for quizzes and content-rich forms - it significantly improves engagement. Available voices: ryan (British male, clear), sonia (British female, warm), andrew (American male, smooth), ava (American female, vibrant), guy (American male, deep). Pick ONE voice that fits the topic - e.g. a London quiz gets ryan or sonia, a US sports quiz gets andrew or guy - and reuse that SAME voice for every item and every call across the whole form. Never mix voices within one form unless the user explicitly asks for multiple voices. Use the tone parameter to direct HOW the voice speaks. Always set a tone that matches the form's mood - e.g. quizzes: "Energetic and playful, like a quiz show host teasing the audience", surveys: "Professional but warm, encouraging honest answers", personality quizzes: "Curious and reflective". This dramatically improves the narration quality. Pass one item or many (max 10) - multiple items run in parallel. Returns audio_url and caption_ref per item - pass caption_ref downstream to clipform_render_composition / clipform_render_video_template / clipform_upload_media_asset to attach this run's word-level captions instead of hand-copying the captions array.

clipform_generate_tts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "items",
    "context"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "maxLength": 5000,
            "minLength": 1,
            "description": "Narration text"
          },
          "tone": {
            "type": "string",
            "maxLength": 500,
            "description": "Style instructions for how the voice should sound. E.g. 'Speak like an energetic quiz show host, playful and teasing' or 'Warm and conversational, like chatting with a friend'. Infer from context if not specified by the user."
          },
          "voice": {
            "enum": [
              "ryan",
              "sonia",
              "andrew",
              "ava",
              "guy"
            ],
            "type": "string",
            "default": "ryan",
            "description": "Voice: ryan (British male, clear/articulate), sonia (British female, warm/bright), andrew (American male, smooth/neutral), ava (American female, vibrant/friendly), guy (American male, deep/authoritative). Pick ONE voice for the whole form based on its topic and audience, then reuse that same voice on every item and every call - never mix voices within a form unless the user explicitly asks for more than one."
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "One or more TTS items to generate"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form this is for (from clipform_create_form) - a routing hint only, to pick the right workspace. The result still lands in the workspace library, not on a node. Required on an anonymous session, or this lands in a different workspace and clipform_attach_node_media will not find it."
    },
    "workspace_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Workspace to act in (id from clipform_whoami workspaces). Omit to use the connection's default workspace."
    }
  }
}
clipform_generate_tts output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "captions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "start",
                "end",
                "text",
                "words"
              ],
              "properties": {
                "end": {
                  "type": "number"
                },
                "text": {
                  "type": "string"
                },
                "start": {
                  "type": "number"
                },
                "words": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "word",
                      "start",
                      "end"
                    ],
                    "properties": {
                      "end": {
                        "type": "number"
                      },
                      "word": {
                        "type": "string"
                      },
                      "start": {
                        "type": "number"
                      }
                    },
                    "additionalProperties": false
                  },
                  "minItems": 1
                }
              },
              "additionalProperties": false
            },
            "description": "Word-level captions, for reference only - prefer passing caption_ref downstream instead of copying this array."
          },
          "audio_url": {
            "type": "string"
          },
          "caption_ref": {
            "type": "string",
            "description": "Pass this as the caption_ref param on clipform_render_composition / clipform_render_video_template / clipform_upload_media_asset to attach this run's word-level captions - never hand-copy the captions array."
          }
        },
        "additionalProperties": false
      },
      "description": "One result per item, in order"
    }
  },
  "additionalProperties": false
}
clipform_generate_tts annotations
{
  "title": "Generate Text-to-Speech",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
clipform_search_media — Search Media
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search images or stock video clips. Pass one query or many (max 10) - multiple queries run in one call instead of separate tool calls. Use results to feed into clipform_render_video_template (slideshow) for narrated slideshow videos, or upload directly as still images via clipform_upload_media_asset then clipform_attach_node_media. All results are pre-cleared for commercial use. Results include a description (alt text where the provider has it) - use it to pick visually distinct images. Example: { queries: [{ query: "saturn rings" }, { query: "mars surface", count: 3 }] } returns portrait images for both.

clipform_search_media input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "queries",
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "queries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string",
            "description": "image = stock photos (default), video = stock clips"
          },
          "count": {
            "type": "number",
            "maximum": 20,
            "minimum": 1,
            "description": "Max results per provider (default 6 for image, 3 for video)"
          },
          "query": {
            "type": "string",
            "description": "What to search for (e.g. 'african lion', 'saturn rings')"
          },
          "orientation": {
            "enum": [
              "portrait",
              "landscape",
              "any"
            ],
            "type": "string",
            "description": "portrait (default) fills the 9:16 frame; landscape gets auto blur-pad framing in Ken Burns videos"
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "One or more search queries to run"
    }
  }
}
clipform_search_media output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "searches"
  ],
  "properties": {
    "searches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "query",
          "kind",
          "items"
        ],
        "properties": {
          "kind": {
            "enum": [
              "image",
              "video"
            ],
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "width": {
                  "type": "number"
                },
                "height": {
                  "type": "number"
                },
                "source": {
                  "type": "string"
                },
                "duration": {
                  "type": "number"
                },
                "attribution": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          },
          "query": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "description": "Results grouped by query (items empty if a query found nothing or failed)"
    }
  },
  "additionalProperties": false
}
clipform_search_media annotations
{
  "title": "Search Media",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_render_composition — Render Composition
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Render a specialised video composition to MP4 or PNG - custom animated visuals that a video template can't provide, such as geography animations or designed motion graphics. Available composition names and their required input props schemas come from clipform_list_compositions. Output formats: mp4 (H.264, best for social media) or png (single frame). Returns a public URL when complete. For multi-render builds (e.g. one clip per quiz question), pass everything in ONE call via items (max 10): all renders fire in parallel and you get one job ID each - then collect the URLs in a single clipform_check_render call with job_ids. Single render: pass compositionId/inputProps at the top level (wait: true blocks and returns the URL; wait: false returns a job ID). Choosing a render tool: for a recognisable form/quiz beat (guess-the-city, this-or-that, mystery reveal, multiple choice, photo montage...) reach for a video template first (clipform_list_video_templates + clipform_render_video_template) - it is a one-call recipe. For a photo/clip montage, narrated or silent, use the slideshow template (pass audio_url to sync it to a voice track). Use clipform_render_composition only when neither fits and you need a custom layer stack. A render for a form node is not done until it is attached to that node. Pass node_id (and form_id) so the completed render attaches itself automatically - do not poll clipform_check_render to completion or manually chain clipform_upload_media_asset + clipform_attach_node_media; fire the render and move on. In batch mode, set node_id per item (see items) and form_id once at the top level.

clipform_render_composition input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "wait": {
      "type": "boolean",
      "default": true,
      "description": "Single render only: true (default) blocks until the render is ready and returns its URL; false returns a job ID for clipform_check_render. Batch items always run fire-and-poll."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "compositionId"
        ],
        "properties": {
          "node_id": {
            "type": "string",
            "description": "Form node to attach this item's render to automatically once it completes. Requires the batch's top-level form_id."
          },
          "captions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "start",
                "end",
                "text",
                "words"
              ],
              "properties": {
                "end": {
                  "type": "number",
                  "description": "Segment end time in seconds"
                },
                "text": {
                  "type": "string",
                  "description": "Full segment text"
                },
                "start": {
                  "type": "number",
                  "description": "Segment start time in seconds"
                },
                "words": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "word",
                      "start",
                      "end"
                    ],
                    "properties": {
                      "end": {
                        "type": "number"
                      },
                      "word": {
                        "type": "string"
                      },
                      "start": {
                        "type": "number"
                      }
                    }
                  },
                  "minItems": 1,
                  "description": "Per-word timestamps within the segment. Required - copy the full array from clipform_generate_tts verbatim."
                }
              }
            },
            "description": "Word-level captions from clipform_generate_tts - carried onto the attached media asset. Only used when node_id is set."
          },
          "inputProps": {
            "type": "object",
            "description": "Props matching the composition's schema - validated strictly",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "caption_ref": {
            "type": "string",
            "description": "caption_ref from clipform_generate_tts - an opaque handle that attaches that TTS run's word-level captions to the media asset, resolved server-side. Preferred over captions. Only used when node_id is set."
          },
          "outputFormat": {
            "enum": [
              "mp4",
              "png"
            ],
            "type": "string",
            "default": "mp4",
            "description": "Output format (default: mp4)"
          },
          "compositionId": {
            "type": "string",
            "description": "The composition ID (see clipform_list_compositions)"
          }
        }
      },
      "maxItems": 10,
      "minItems": 1,
      "description": "Batch mode: multiple renders in one call. All fire in parallel; returns one job ID per item - collect with clipform_check_render (job_ids). Use this whenever rendering more than one clip."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID - required when node_id is set (single render) or any item sets node_id (batch)."
    },
    "node_id": {
      "type": "string",
      "description": "Single render only: form node to attach this render to automatically once it completes. Requires form_id. For batch mode, set node_id per item instead."
    },
    "captions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "start",
          "end",
          "text",
          "words"
        ],
        "properties": {
          "end": {
            "type": "number",
            "description": "Segment end time in seconds"
          },
          "text": {
            "type": "string",
            "description": "Full segment text"
          },
          "start": {
            "type": "number",
            "description": "Segment start time in seconds"
          },
          "words": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "word",
                "start",
                "end"
              ],
              "properties": {
                "end": {
                  "type": "number"
                },
                "word": {
                  "type": "string"
                },
                "start": {
                  "type": "number"
                }
              }
            },
            "minItems": 1,
            "description": "Per-word timestamps within the segment. Required - copy the full array from clipform_generate_tts verbatim."
          }
        }
      },
      "description": "Single render only: word-level captions from clipform_generate_tts, carried onto the attached media asset. Only used when node_id is set. For batch mode, set captions per item instead."
    },
    "inputProps": {
      "type": "object",
      "description": "Single render: props object matching the composition's schema from clipform_list_compositions. Validated STRICTLY - unknown or missing props fail with the schema in the error, nothing renders silently with defaults. For map compositions (Map), wide shots (camera.zoom < 9) may round lat/lng to 1 decimal place to improve cache hit rates; close shots and pin drops should keep full precision — the pin lands exactly on `target`.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "caption_ref": {
      "type": "string",
      "description": "Single render only: caption_ref from clipform_generate_tts - an opaque handle that attaches that TTS run's word-level captions to the media asset, resolved server-side. Preferred over captions. Only used when node_id is set. For batch mode, set caption_ref per item instead."
    },
    "outputFormat": {
      "enum": [
        "mp4",
        "png"
      ],
      "type": "string",
      "default": "mp4",
      "description": "Single render: output format (default: mp4)"
    },
    "compositionId": {
      "type": "string",
      "description": "Single render: the composition ID. Call clipform_list_compositions to see available options (e.g. 'Slideshow', 'Map', 'Grid'). Use items instead for multiple renders."
    }
  }
}
clipform_render_composition output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobs"
  ],
  "properties": {
    "jobs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Present when status is 'rendering' - pass to check_render"
          },
          "status": {
            "enum": [
              "rendering",
              "complete"
            ],
            "type": "string"
          },
          "attached": {
            "type": "boolean",
            "description": "True when node_id was provided and the render was attached to the node automatically (present once the attach outcome is known)."
          },
          "public_url": {
            "type": "string",
            "description": "Present when status is 'complete' - attach via upload_media_asset then attach_node_media (fit_media: true), unless node_id was set (auto-attached)"
          },
          "republished": {
            "type": "boolean",
            "description": "True when the form was live and was republished to include this media."
          },
          "attach_error": {
            "type": "string",
            "description": "Present when node_id was provided but auto-attach failed - the render itself still succeeded."
          },
          "output_format": {
            "type": "string"
          },
          "composition_id": {
            "type": "string"
          },
          "media_asset_id": {
            "type": "string",
            "description": "The workspace media asset created from this render, when attached."
          }
        },
        "additionalProperties": false
      },
      "description": "One entry per render (single or batch)"
    }
  },
  "additionalProperties": false
}
clipform_render_composition annotations
{
  "title": "Render Composition",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
clipform_search_music — Search Music
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search for royalty-free music tracks and ambient sounds. Quiz forms especially benefit from background music - it keeps energy up between questions. Also consider it for multi-step surveys and longer forms. Pass the returned URL as the audio for the slideshow video template via clipform_render_video_template. Returns download URLs, duration, artist, and license info.

clipform_search_music input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "context"
  ],
  "properties": {
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Genre/mood tags to filter by. Multiple tags are ANDed together (e.g. ['ambient', 'chill'] matches tracks tagged both)."
    },
    "count": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "Max results (default: 5)"
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "What to search for (e.g. 'upbeat quiz background', 'calm ambient', 'playful pizzicato')"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "maxDuration": {
      "type": "number",
      "description": "Maximum duration in seconds",
      "exclusiveMinimum": 0
    },
    "minDuration": {
      "type": "number",
      "description": "Minimum duration in seconds",
      "exclusiveMinimum": 0
    },
    "instrumentalOnly": {
      "type": "boolean",
      "default": true,
      "description": "Only instrumental tracks (default: true)"
    }
  }
}
clipform_search_music output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "tracks"
  ],
  "properties": {
    "query": {
      "type": "string"
    },
    "tracks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "artist": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "license": {
            "type": "string"
          },
          "duration": {
            "type": "number"
          }
        },
        "additionalProperties": false
      },
      "description": "Matching tracks (empty if none); pass a url as the audio for the slideshow template"
    }
  },
  "additionalProperties": false
}
clipform_search_music annotations
{
  "title": "Search Music",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_list_compositions — List Compositions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Browse available video compositions and their expected props schemas. Call this before using clipform_render_composition to discover visual styles and their input props. For an image or photo montage, reach for a video template (clipform_list_video_templates + clipform_render_video_template) instead of a composition.

clipform_list_compositions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    }
  }
}
clipform_list_compositions output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "compositions"
  ],
  "properties": {
    "compositions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "width",
          "height",
          "fps",
          "durationInFrames",
          "props"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "fps": {
            "type": "number"
          },
          "props": {
            "type": "string",
            "description": "Compact props summary (name*: type)"
          },
          "width": {
            "type": "number"
          },
          "height": {
            "type": "number"
          },
          "propsSchema": {
            "type": "object",
            "description": "Full JSON Schema for inputProps",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "durationInFrames": {
            "type": "number"
          }
        },
        "additionalProperties": false
      },
      "description": "Available compositions - pass an id to render_composition"
    }
  },
  "additionalProperties": false
}
clipform_list_compositions annotations
{
  "title": "List Compositions",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_list_video_templates — List Video Templates
Advertised by the server during the last successful anonymous check.
Advertised read-only

Browse available video templates - curated Scene arrangements (bed + overlay + sane defaults) that render through the Scene composition from a small controls object. Call this before clipform_render_video_template to see template names and their exposed controls. For a fully custom layer stack, assemble Scene layers directly via clipform_render_composition instead.

clipform_list_video_templates input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    }
  }
}
clipform_list_video_templates output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "templates"
  ],
  "properties": {
    "templates": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "tier",
          "description",
          "keywords",
          "controls"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "controls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Control names, '?'-suffixed when optional"
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Natural-language phrases a user's intent might match against this template"
          },
          "description": {
            "type": "string"
          },
          "exampleControls": {
            "type": "object",
            "description": "A worked, ready-to-render controls object for this template - copy and adapt it",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          }
        },
        "additionalProperties": false
      },
      "description": "Available video templates - pass a name + controls to clipform_render_video_template"
    }
  },
  "additionalProperties": false
}
clipform_list_video_templates annotations
{
  "title": "List Video Templates",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_render_video_template — Render Video Template
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Render a curated video template (a pre-arranged Scene: bed + overlay + sane defaults) to MP4 or PNG from a small controls object, instead of hand-assembling Scene layers. Call clipform_list_video_templates first for available template names and their controls. Renders through the Scene composition under the hood. Choosing a render tool: for a recognisable form/quiz beat (guess-the-city, this-or-that, mystery reveal, multiple choice, photo montage...) reach for a video template first (clipform_list_video_templates + clipform_render_video_template) - it is a one-call recipe. For a photo/clip montage, narrated or silent, use the slideshow template (pass audio_url to sync it to a voice track). Use clipform_render_composition only when neither fits and you need a custom layer stack. A render for a form node is not done until it is attached to that node. Pass node_id (and form_id) so the completed render attaches itself automatically - do not poll clipform_check_render to completion or manually chain clipform_upload_media_asset + clipform_attach_node_media; fire the render and move on.

clipform_render_video_template input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "template",
    "controls",
    "context"
  ],
  "properties": {
    "wait": {
      "type": "boolean",
      "default": true,
      "description": "true (default) blocks until the render is ready and returns its URL; false returns a job ID for clipform_check_render."
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "form_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The form UUID (required when node_id is set)."
    },
    "node_id": {
      "type": "string",
      "description": "Form node to attach this render to automatically once it completes - skips the manual clipform_upload_media_asset + clipform_attach_node_media steps and republishes the form if it's currently live. Requires form_id."
    },
    "captions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "start",
          "end",
          "text",
          "words"
        ],
        "properties": {
          "end": {
            "type": "number",
            "description": "Segment end time in seconds"
          },
          "text": {
            "type": "string",
            "description": "Full segment text"
          },
          "start": {
            "type": "number",
            "description": "Segment start time in seconds"
          },
          "words": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "word",
                "start",
                "end"
              ],
              "properties": {
                "end": {
                  "type": "number"
                },
                "word": {
                  "type": "string"
                },
                "start": {
                  "type": "number"
                }
              }
            },
            "minItems": 1,
            "description": "Per-word timestamps within the segment. Required - copy the full array from clipform_generate_tts verbatim."
          }
        }
      },
      "description": "Word-level captions from clipform_generate_tts - carried onto the attached media asset. Only used when node_id is set."
    },
    "controls": {
      "type": "object",
      "description": "Template-specific controls (see clipform_list_video_templates for the exposed control surface).",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "template": {
      "type": "string",
      "description": "Video template name (see clipform_list_video_templates)."
    },
    "caption_ref": {
      "type": "string",
      "description": "caption_ref from clipform_generate_tts - an opaque handle that attaches that TTS run's word-level captions to the media asset, resolved server-side. Preferred over captions. Only used when node_id is set. Defaults to controls.audio_url when that is a clipform_generate_tts track (slideshow narration), so narrated montages keep their captions."
    },
    "outputFormat": {
      "enum": [
        "mp4",
        "png"
      ],
      "type": "string",
      "default": "mp4",
      "description": "Output format (default: mp4)"
    }
  }
}
clipform_render_video_template output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "status"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "description": "Present when status is 'rendering' - pass to clipform_check_render"
    },
    "status": {
      "enum": [
        "rendering",
        "complete"
      ],
      "type": "string"
    },
    "attached": {
      "type": "boolean",
      "description": "True when node_id was provided and the render was attached to the node automatically (present once the attach outcome is known)."
    },
    "template": {
      "type": "string"
    },
    "public_url": {
      "type": "string",
      "description": "Present when status is 'complete' - attach via upload_media_asset then attach_node_media (fit_media: true), unless node_id was set (auto-attached)"
    },
    "republished": {
      "type": "boolean",
      "description": "True when the form was live and was republished to include this media."
    },
    "attach_error": {
      "type": "string",
      "description": "Present when node_id was provided but auto-attach failed - the render itself still succeeded."
    },
    "output_format": {
      "type": "string"
    },
    "media_asset_id": {
      "type": "string",
      "description": "The workspace media asset created from this render, when attached."
    },
    "duration_seconds": {
      "type": "number",
      "description": "Final video length in seconds - the narration's real length when audio_url drove it."
    }
  },
  "additionalProperties": false
}
clipform_render_video_template annotations
{
  "title": "Render Video Template",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
clipform_list_assets — List Assets
Advertised by the server during the last successful anonymous check.
Advertised read-only

List available creative assets (sound effects, animations, fonts) for video compositions.

clipform_list_assets input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "type": {
      "enum": [
        "sfx",
        "animation",
        "font",
        "all"
      ],
      "type": "string",
      "description": "Asset type to list (default: all)"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    }
  }
}
clipform_list_assets output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sfx",
    "animations",
    "fonts"
  ],
  "properties": {
    "sfx": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "fonts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "weights": {
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "number"
                }
              ]
            }
          }
        },
        "additionalProperties": false
      }
    },
    "animations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
clipform_list_assets annotations
{
  "title": "List Assets",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_check_render — Check Render Status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check the status of render jobs started by clipform_render_video_template or clipform_render_composition. Pass job_ids to check a whole batch in ONE call - one line of status per job. Pass job_id for a single job. Returns the output URL for each completed render. Typical render time: 10-60 seconds. Attach is automatic when node_id was provided to the render tool - no need to poll to completion, and the attach outcome is reported here once known.

clipform_check_render input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "context"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "A single job ID returned by the render tool"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "job_ids": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "maxItems": 20,
      "minItems": 1,
      "description": "Multiple job IDs - check the whole batch in one call instead of one call per job"
    }
  }
}
clipform_check_render output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobs"
  ],
  "properties": {
    "jobs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "job_id",
          "status"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "job_id": {
            "type": "string"
          },
          "status": {
            "enum": [
              "rendering",
              "complete",
              "failed",
              "not_found"
            ],
            "type": "string"
          },
          "attached": {
            "type": "boolean",
            "description": "True when the render's node_id was set and it attached to the node automatically."
          },
          "public_url": {
            "type": "string"
          },
          "republished": {
            "type": "boolean",
            "description": "True when the form was live and was republished to include this media."
          },
          "attach_error": {
            "type": "string",
            "description": "Present when node_id was set but auto-attach failed - the render itself still succeeded."
          },
          "media_asset_id": {
            "type": "string",
            "description": "The workspace media asset created from this render, when attached."
          },
          "elapsed_seconds": {
            "type": "number"
          },
          "duration_seconds": {
            "type": "number"
          }
        },
        "additionalProperties": false
      },
      "description": "One entry per queried job; attach completed public_urls via upload_media_asset then attach_node_media unless already auto-attached"
    }
  },
  "additionalProperties": false
}
clipform_check_render annotations
{
  "title": "Check Render Status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_fetch_boundary — Fetch Geographic Boundary
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a GeoJSON boundary polygon for a country, city, or region. Returns simplified GeoJSON ready to use as the 'boundary' prop in the Map composition. mainlandOnly excludes small islands and overseas territories (e.g. Corsica for France, Hawaii for USA).

clipform_fetch_boundary input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query",
    "context"
  ],
  "properties": {
    "type": {
      "enum": [
        "country",
        "city",
        "state",
        "region"
      ],
      "type": "string",
      "default": "country",
      "description": "Type of place to search for"
    },
    "query": {
      "type": "string",
      "description": "Place name (e.g. 'France', 'Paris', 'Tokyo', 'Brazil')"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "maxPoints": {
      "type": "number",
      "default": 500,
      "description": "Maximum points per polygon ring for simplification (default 500, lower = smaller payload)"
    },
    "mainlandOnly": {
      "type": "boolean",
      "default": true,
      "description": "Keep only the largest landmass, excluding small islands and overseas territories"
    }
  }
}
clipform_fetch_boundary output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "geometry_type",
    "size_kb",
    "mainland_only",
    "geojson"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "Resolved place name"
    },
    "geojson": {
      "type": "string",
      "description": "The Feature GeoJSON as a JSON string - use as the boundary prop in the Map composition"
    },
    "size_kb": {
      "type": "number",
      "description": "Approximate size of the returned GeoJSON in KB"
    },
    "geometry_type": {
      "enum": [
        "Polygon",
        "MultiPolygon"
      ],
      "type": "string"
    },
    "mainland_only": {
      "type": "boolean"
    }
  },
  "additionalProperties": false
}
clipform_fetch_boundary annotations
{
  "title": "Fetch Geographic Boundary",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_get_guide — Get Craft Guide
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve craft knowledge for building a specific form type. Returns question psychology, difficulty curves, narration style, scoring setup, and writing principles as markdown. Does NOT return a step-by-step build workflow - use clipform_get_workflow for that. Available types: quiz, survey, interview, funnel, testimonial, application, booking, intake, lead-capture. Aliases also accepted: trivia → quiz, test → quiz, exam → quiz, feedback → survey, poll → survey, nps → survey, questionnaire → survey, case-study → interview, callout → interview, lead-gen → funnel, qualification → funnel, lead-magnet → funnel, story → testimonial, review → testimonial, job-application → application, admission → application, enrollment → application, grant → application, registration → booking, signup → booking, event → booking, rsvp → booking, workshop → booking, client-intake → intake, onboarding → intake, enquiry → intake, inquiry → intake, new-client → intake, lead → lead-capture, lead-form → lead-capture, enquiry-form → lead-capture, waitlist → lead-capture, get-a-quote → lead-capture. Quiz variants (optional): personality, comprehension, composition - appends variant-specific addendum to the base quiz guide.

clipform_get_guide input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "type",
    "context"
  ],
  "properties": {
    "type": {
      "type": "string",
      "description": "Form type to get the craft guide for (accepts aliases like 'feedback' → survey)"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "variant": {
      "enum": [
        "personality",
        "comprehension",
        "composition"
      ],
      "type": "string",
      "description": "Quiz sub-variant. Only used when type is 'quiz'. Omit for a standard scored quiz."
    }
  }
}
clipform_get_guide annotations
{
  "title": "Get Craft Guide",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clipform_get_workflow — Get Build Workflow
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a step-by-step build workflow for creating a specific form type. Returns the exact tool sequence, form settings, node configuration, scoring setup, and end screen config as a build recipe. Does NOT return craft knowledge (question psychology, difficulty curves, narration style) - use clipform_get_guide for that. Available types: quiz, survey, interview, testimonial, application, booking, intake, lead-capture. Aliases also accepted: trivia → quiz, test → quiz, exam → quiz, feedback → survey, poll → survey, nps → survey, questionnaire → survey, case-study → interview, callout → interview, lead-gen → funnel, qualification → funnel, lead-magnet → funnel, story → testimonial, review → testimonial, job-application → application, admission → application, enrollment → application, grant → application, registration → booking, signup → booking, event → booking, rsvp → booking, workshop → booking, client-intake → intake, onboarding → intake, enquiry → intake, inquiry → intake, new-client → intake, lead → lead-capture, lead-form → lead-capture, enquiry-form → lead-capture, waitlist → lead-capture, get-a-quote → lead-capture. Quiz variants (optional): personality, comprehension, composition - returns the variant-specific workflow instead of the base quiz workflow. Optional args by type: - quiz: topic, question_count (8) - quiz (variant: personality): topic, categories, question_count (8) - quiz (variant: comprehension): question_count (8), audience - interview: purpose, response_format (all), needs_consent (true) - survey: topic, anonymous (true) - funnel: outcomes, criteria, needs_contact (true) - testimonial: use_case - application: role - booking: event_name, event_type - intake: use_case, response_format (all) - lead-capture: use_case

clipform_get_workflow input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "type",
    "context"
  ],
  "properties": {
    "role": {
      "type": "string",
      "description": "What the application is for (application)"
    },
    "type": {
      "type": "string",
      "description": "Form type to get the build workflow for (accepts aliases like 'feedback' → survey)"
    },
    "topic": {
      "type": "string",
      "description": "Topic or theme (quiz, survey)"
    },
    "context": {
      "type": "string",
      "description": "Describe the user's underlying goal in one sentence - not the tool you're calling."
    },
    "purpose": {
      "type": "string",
      "description": "What you're collecting (interview)"
    },
    "variant": {
      "enum": [
        "personality",
        "comprehension",
        "composition"
      ],
      "type": "string",
      "description": "Quiz sub-variant. Only used when type is 'quiz'. Omit for a standard scored quiz."
    },
    "audience": {
      "type": "string",
      "description": "Target audience (quiz variant: comprehension)"
    },
    "criteria": {
      "type": "string",
      "description": "Routing criteria (funnel)"
    },
    "outcomes": {
      "type": "string",
      "description": "Segments or recommendations (funnel)"
    },
    "use_case": {
      "type": "string",
      "description": "What stories to collect (testimonial)"
    },
    "anonymous": {
      "type": "boolean",
      "description": "Anonymous survey (survey)"
    },
    "categories": {
      "type": "string",
      "description": "Comma-separated outcome categories (quiz variant: personality)"
    },
    "event_name": {
      "type": "string",
      "description": "Event or offering name (booking)"
    },
    "event_type": {
      "type": "string",
      "description": "Type of event (booking)"
    },
    "needs_consent": {
      "type": "boolean",
      "description": "Include consent statement (interview)"
    },
    "needs_contact": {
      "type": "boolean",
      "description": "Include contact capture (funnel)"
    },
    "question_count": {
      "type": "number",
      "description": "Number of questions, default 8 (quiz types)"
    },
    "response_format": {
      "enum": [
        "video",
        "audio",
        "text",
        "all"
      ],
      "type": "string",
      "description": "How respondents reply (interview)"
    }
  }
}
clipform_get_workflow annotations
{
  "title": "Get Build Workflow",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_more_tools
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Check for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.

get_more_tools input schema
{
  "type": "object",
  "required": [
    "context"
  ],
  "properties": {
    "context": {
      "type": "string",
      "description": "A description of your goal and what kind of tool would help accomplish it."
    }
  }
}
get_more_tools annotations
{
  "title": "Get More Tools",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

10 advertised

create-quiz — Create a Quiz

Advertised by the server during the last successful anonymous check.

Build a scored knowledge quiz with narrated video questions

topic
Quiz topic (e.g. 'Space exploration', 'Premier League')
question_count
Number of questions (default: 8)
media_style
Media style: text, images, or video (default: video)
create-personality-quiz — Create a Personality Quiz

Advertised by the server during the last successful anonymous check.

Build a 'Which X are you?' personality quiz with category-based scoring and outcome screens

topic
Quiz theme (e.g. 'Which city are you?', 'What's your work style?')
categories
Comma-separated outcome categories (e.g. 'Creative, Analytical, Leader, Collaborator')
question_count
Number of questions (default: 8)
media_style
Media style: text, images, or video (default: video)
create-interview — Create an Interview

Advertised by the server during the last successful anonymous check.

Build a form to collect case studies, async video interviews, expert input, or journalist responses

purpose
What you're collecting (e.g. 'case study', 'expert input', 'journalist responses')
response_format
How respondents reply: video, audio, text, or all (default: all)
needs_consent
Include a consent statement: yes or no (default: yes)
create-survey — Create a Survey

Advertised by the server during the last successful anonymous check.

Build a feedback survey, NPS form, or research questionnaire

topic
What feedback you're collecting (e.g. 'NPS', 'event feedback', 'product satisfaction')
anonymous
Whether the survey is anonymous: yes or no (default: yes)
create-composition-quiz — Create a Composition Quiz

Advertised by the server during the last successful anonymous check.

Build a guess-and-reveal quiz from rendered compositions - flag sweeps, Rebus puzzles, blur reveals, odd-one-out grids - instead of stock-image slideshows

topic
Quiz topic (e.g. 'world flags', 'movie emoji', '90s music')
question_count
Number of questions (default: 5 - one scored choice node per question)
create-testimonial — Collect Testimonials

Advertised by the server during the last successful anonymous check.

Build a video testimonial collection form - capture authentic customer stories on camera

use_case
What stories you're collecting (e.g. 'customer success', 'product review', 'case study')
media_style
Media style: text, images, or video (default: video)
create-application — Create an Application Form

Advertised by the server during the last successful anonymous check.

Build a structured application form - job applications, programme admissions, grant proposals with video responses

role
What the application is for (e.g. 'Software Engineer', 'Scholarship', 'Membership')
create-booking — Create a Booking Form

Advertised by the server during the last successful anonymous check.

Build an event registration, course signup, or booking form with a personal video welcome

event_name
Name of the event or offering (e.g. 'Design Workshop', 'Intro Call')
event_type
Type of event (e.g. 'workshop', 'webinar', 'consultation', 'course')
create-intake — Create a Client Intake Form

Advertised by the server during the last successful anonymous check.

Build a warm client intake or onboarding form - capture contact details and what the client needs

use_case
What kind of business or service (e.g. 'massage', 'coaching', 'personal training', 'agency')
response_format
How people answer the open question: video, audio, text, or all (default: all)
create-lead-capture — Create a Lead Capture Form

Advertised by the server during the last successful anonymous check.

Build a short lead capture or enquiry form - turn interest into a contact with minimal friction

use_case
What you're capturing leads for (e.g. 'a service', 'a product', 'a waitlist', 'a quote')

Resources

13 advertised

guide-quiz

Advertised by the server during the last successful anonymous check.

Craft knowledge for writing engaging quizzes - difficulty curves, question psychology, narration style, scoring

guide-quiz URI
clipform://guides/quiz

MIME type: text/markdown

guide-quiz annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-survey

Advertised by the server during the last successful anonymous check.

Craft knowledge for feedback surveys, NPS, and research forms - brevity, rating scales, respondent fatigue

guide-survey URI
clipform://guides/survey

MIME type: text/markdown

guide-survey annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-interview

Advertised by the server during the last successful anonymous check.

Craft knowledge for building interview forms - warm-up pacing, open questions, consent, video responses

guide-interview URI
clipform://guides/interview

MIME type: text/markdown

guide-interview annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-funnel

Advertised by the server during the last successful anonymous check.

Craft knowledge for lead qualification funnels - planned feature, conditional routing coming soon

guide-funnel URI
clipform://guides/funnel

MIME type: text/markdown

guide-funnel annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-testimonial

Advertised by the server during the last successful anonymous check.

Craft knowledge for collecting testimonials and customer stories on video - storytelling prompts, comfort techniques, consent

guide-testimonial URI
clipform://guides/testimonial

MIME type: text/markdown

guide-testimonial annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-application

Advertised by the server during the last successful anonymous check.

Craft knowledge for application and evaluation forms - multi-section structure, video responses for behavioural questions, screening

guide-application URI
clipform://guides/application

MIME type: text/markdown

guide-application annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-booking

Advertised by the server during the last successful anonymous check.

Craft knowledge for event registration and booking forms - minimal friction, video welcome, confirmation flow

guide-booking URI
clipform://guides/booking

MIME type: text/markdown

guide-booking annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-intake

Advertised by the server during the last successful anonymous check.

Craft knowledge for client intake and onboarding forms - a warm welcome, minimal contact capture, a video-first question about what the client needs, and a clear next step

guide-intake URI
clipform://guides/intake

MIME type: text/markdown

guide-intake annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-lead-capture

Advertised by the server during the last successful anonymous check.

Craft knowledge for linear lead capture and enquiry forms - minimal friction, a light qualifier only if it routes follow-up, and a clear next step (no branching, no scoring)

guide-lead-capture URI
clipform://guides/lead-capture

MIME type: text/markdown

guide-lead-capture annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-quiz-personality

Advertised by the server during the last successful anonymous check.

Addendum for personality quizzes - category design, option weighting, outcome writing, no right/wrong answers

guide-quiz-personality URI
clipform://guides/quiz/personality

MIME type: text/markdown

guide-quiz-personality annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-quiz-comprehension

Advertised by the server during the last successful anonymous check.

Addendum for comprehension quizzes - writing questions from source material (transcript, document, notes), distractor design, audience adaptation

guide-quiz-comprehension URI
clipform://guides/quiz/comprehension

MIME type: text/markdown

guide-quiz-comprehension annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
guide-quiz-composition

Advertised by the server during the last successful anonymous check.

Addendum for composition quizzes - guess formats built from rendered compositions: mechanic selection, the clue clip + answer feedback default (with an optional reveal payoff node), difficulty design

guide-quiz-composition URI
clipform://guides/quiz/composition

MIME type: text/markdown

guide-quiz-composition annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 0.8
}
context-session

Advertised by the server during the last successful anonymous check.

Current session info: auth mode, workspace name, plan name, and node/form limits. Read this before planning content to know your constraints.

context-session URI
clipform://context/session

MIME type: text/markdown

context-session annotations
{
  "audience": [
    "assistant"
  ],
  "priority": 1
}

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2198 ms
95th percentile latency
2198 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2198 ms · metadata changed · 33 tool(s), 13 resource(s), 0 resource template(s), 10 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http clipform-mcp https://mcp.clipform.io

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add clipform-mcp --url https://mcp.clipform.io

Cursor

Merge this server into .cursor/mcp.json in your project, then enable clipform-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "clipform-mcp": {
      "url": "https://mcp.clipform.io"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "clipform-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.clipform.io",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start clipform-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "clipform-mcp": {
      "type": "http",
      "url": "https://mcp.clipform.io"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http clipform-mcp https://mcp.clipform.io

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "clipform-mcp": {
      "url": "https://mcp.clipform.io"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "clipform-mcp": {
      "serverUrl": "https://mcp.clipform.io"
    }
  }
}

Let your agent find its tools

Find servers like Clipform MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.