← WebMCP Directory

Tool tree

clipbrief-weld.vercel.app

Productivity & BusinessTools verified
Website
A WebMCP surface where a human and an agent review a short-video corpus together and leave with a marketing brief.
Explore capabilities

    page: Every page

    list_videosAnswer

    Browse the clip corpus. Optionally filter by category, hook type, hashtag or maximum duration. Returns compact summaries — id, title, creator, duration, measured signals, and whether a transcript and teardown already exist. Cheap and instant. Start here when you do not know what is in the corpus.

    View tool JSON
    {
      "name": "list_videos",
      "kind": "answer",
      "impl": "imperative",
      "description": "Browse the clip corpus. Optionally filter by category, hook type, hashtag or maximum duration. Returns compact summaries — id, title, creator, duration, measured signals, and whether a transcript and teardown already exist. Cheap and instant. Start here when you do not know what is in the corpus.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "description": "Exact category, e.g. \"skincare\", \"coffee\", \"fitness\", \"gadgets\"."
          },
          "hookType": {
            "type": "string",
            "description": "question | shock | pov | stat | demo | testimonial | other"
          },
          "hashtag": {
            "type": "string",
            "description": "With or without the leading #."
          },
          "maxDurationS": {
            "type": "number",
            "description": "Only clips at or under this many seconds."
          },
          "limit": {
            "type": "number",
            "description": "Cap the number returned."
          }
        },
        "required": []
      },
      "page": "/"
    }
    get_videoAnswer

    Everything known about one clip: its metadata, its full transcript with timings, and its creative teardown if one has been produced. Use this instead of transcribe_video or analyze_video when you only need results that already exist — it never calls a model.

    View tool JSON
    {
      "name": "get_video",
      "kind": "answer",
      "impl": "imperative",
      "description": "Everything known about one clip: its metadata, its full transcript with timings, and its creative teardown if one has been produced. Use this instead of transcribe_video or analyze_video when you only need results that already exist — it never calls a model.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string",
            "description": "The clip id, e.g. \"glow-serum-3am\"."
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    search_transcriptsAnswer

    Find clips by what is actually said in them, across every transcript in the corpus at once. Returns the best matching line per clip with its timestamp, ranked. Also highlights the matching clips on screen for the human. This is the fastest way to answer "which clips talk about X".

    View tool JSON
    {
      "name": "search_transcripts",
      "kind": "answer",
      "impl": "imperative",
      "description": "Find clips by what is actually said in them, across every transcript in the corpus at once. Returns the best matching line per clip with its timestamp, ranked. Also highlights the matching clips on screen for the human. This is the fastest way to answer \"which clips talk about X\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "A word or phrase spoken in the clips, e.g. \"retinol\" or \"cold brew\"."
          },
          "limit": {
            "type": "number",
            "description": "Cap the number of clips returned."
          }
        },
        "required": [
          "query"
        ]
      },
      "page": "/"
    }
    focus_videoAction

    Scroll the feed to one clip and play it, optionally seeking to a timestamp. Use this whenever you reference a specific clip, so the human can see the thing you are talking about. It changes what is on screen; it returns no analysis.

    View tool JSON
    {
      "name": "focus_video",
      "kind": "act",
      "impl": "imperative",
      "description": "Scroll the feed to one clip and play it, optionally seeking to a timestamp. Use this whenever you reference a specific clip, so the human can see the thing you are talking about. It changes what is on screen; it returns no analysis.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string",
            "description": "The clip id to bring on screen."
          },
          "seek_s": {
            "type": "number",
            "description": "Optional start position in seconds."
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    transcribe_videoAction

    Return the transcript for one clip. Clips that ship a caption track are parsed from it; the rest were transcribed with Whisper running locally at build time, and those responses carry live:false plus the model used. Results are committed, so this is instant and costs nothing. If you only need a transcript that already exists, get_video is equivalent and clearer.

    View tool JSON
    {
      "name": "transcribe_video",
      "kind": "act",
      "impl": "imperative",
      "description": "Return the transcript for one clip. Clips that ship a caption track are parsed from it; the rest were transcribed with Whisper running locally at build time, and those responses carry live:false plus the model used. Results are committed, so this is instant and costs nothing. If you only need a transcript that already exists, get_video is equivalent and clearer.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string"
          },
          "force": {
            "type": "boolean",
            "description": "Ignored for the speech-to-text path, which is build-time only."
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    analyze_videoAction

    Produce the creative teardown for one clip: the verbatim hook and its type, core message, audience, tone, CTA, pain point, the objection it handles, and key phrases. Served from cache instantly; pass force:true to re-run the model live, which takes a few seconds. Fields the transcript does not support come back as empty strings rather than invented.

    View tool JSON
    {
      "name": "analyze_video",
      "kind": "act",
      "impl": "imperative",
      "description": "Produce the creative teardown for one clip: the verbatim hook and its type, core message, audience, tone, CTA, pain point, the objection it handles, and key phrases. Served from cache instantly; pass force:true to re-run the model live, which takes a few seconds. Fields the transcript does not support come back as empty strings rather than invented.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string"
          },
          "force": {
            "type": "boolean",
            "description": "Re-run the model instead of serving the committed result."
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    analyze_textAction

    Tear down a script the human pastes in, rather than a clip in the corpus. Same output shape as analyze_video, with video_id null. Use this when someone shares copy they wrote and wants it analysed the same way. Always calls the model, so it takes a few seconds.

    View tool JSON
    {
      "name": "analyze_text",
      "kind": "act",
      "impl": "imperative",
      "description": "Tear down a script the human pastes in, rather than a clip in the corpus. Same output shape as analyze_video, with video_id null. Use this when someone shares copy they wrote and wants it analysed the same way. Always calls the model, so it takes a few seconds.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The full script. At least 40 characters."
          },
          "label": {
            "type": "string",
            "description": "Optional name for the pasted script."
          }
        },
        "required": [
          "text"
        ]
      },
      "page": "/"
    }
    rank_videosAction

    Reorder the feed by a measured property of the clips, optionally within one category, and show a "ranked by" banner to the human. Every value is computed from the encoded file and the committed transcript — pace is words per minute, hook_speed is how many seconds pass before the opening line ends, cut_rate is the mean seconds per transcript cue. There are no view or like counts in this corpus because none of these clips has ever been published anywhere.

    View tool JSON
    {
      "name": "rank_videos",
      "kind": "act",
      "impl": "imperative",
      "description": "Reorder the feed by a measured property of the clips, optionally within one category, and show a \"ranked by\" banner to the human. Every value is computed from the encoded file and the committed transcript — pace is words per minute, hook_speed is how many seconds pass before the opening line ends, cut_rate is the mean seconds per transcript cue. There are no view or like counts in this corpus because none of these clips has ever been published anywhere.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "by": {
            "type": "string",
            "enum": [
              "pace",
              "duration",
              "hook_speed",
              "hook_length",
              "words",
              "cut_rate"
            ],
            "description": "pace = words per minute · duration = seconds · hook_speed = seconds until the hook ends (lowest first) · hook_length = words in the opening line (lowest first) · words = total words spoken · cut_rate = mean seconds per transcript cue (lowest first)."
          },
          "category": {
            "type": "string"
          },
          "limit": {
            "type": "number"
          }
        },
        "required": [
          "by"
        ]
      },
      "page": "/"
    }
    add_to_briefAction

    Put one clip into the human's brief tray, where it appears on screen immediately and persists across reloads. Requires the clip to have both a transcript and a teardown — call analyze_video first if it does not. Adding the same clip twice replaces the existing row rather than duplicating it.

    View tool JSON
    {
      "name": "add_to_brief",
      "kind": "act",
      "impl": "imperative",
      "description": "Put one clip into the human's brief tray, where it appears on screen immediately and persists across reloads. Requires the clip to have both a transcript and a teardown — call analyze_video first if it does not. Adding the same clip twice replaces the existing row rather than duplicating it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string"
          },
          "note": {
            "type": "string",
            "description": "Optional short note explaining why this clip earns its place."
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    remove_from_briefAction

    Take one clip out of the brief tray. The human can also do this by hand, so read the tray with get_brief before assuming you know what is in it.

    View tool JSON
    {
      "name": "remove_from_brief",
      "kind": "act",
      "impl": "imperative",
      "description": "Take one clip out of the brief tray. The human can also do this by hand, so read the tray with get_brief before assuming you know what is in it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "video_id": {
            "type": "string"
          }
        },
        "required": [
          "video_id"
        ]
      },
      "page": "/"
    }
    get_briefAnswer

    Read what is currently in the brief tray, including rows the human added or removed by hand. Call this before answering any question about the brief — your own add_to_brief calls are not the whole story, because the human edits the same tray you do.

    View tool JSON
    {
      "name": "get_brief",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read what is currently in the brief tray, including rows the human added or removed by hand. Call this before answering any question about the brief — your own add_to_brief calls are not the whole story, because the human edits the same tray you do.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/"
    }
    export_brief_csvAction

    Export the brief tray as a CSV and start the download for the human. Twenty-six fixed columns: the clip, its absolute permalink, the full teardown with the model that produced it, and the measured signals — words, pace, hook length, speech density. Returns the row count and the column list so you can describe the file you just made. Fails cleanly if the tray is empty.

    View tool JSON
    {
      "name": "export_brief_csv",
      "kind": "act",
      "impl": "imperative",
      "description": "Export the brief tray as a CSV and start the download for the human. Twenty-six fixed columns: the clip, its absolute permalink, the full teardown with the model that produced it, and the measured signals — words, pace, hook length, speech density. Returns the row count and the column list so you can describe the file you just made. Fails cleanly if the tray is empty.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "description": "Optional. \".csv\" is appended if missing."
          }
        },
        "required": []
      },
      "page": "/"
    }