← WebMCP Directory

Tool tree

sheeesh3.github.io

Media & PersonalTools verified
Website
A rough-cut video editor an agent can drive. Select the sentence that must survive; the agent builds the clip around it. Your video never leaves the tab.
Explore capabilities
    get_editor_stateAnswer

    Read the current state of the Cutlet editor: the loaded video, how many sentences the transcript has, what the user has anchored, and every clip with its segments, duration and revision. Call this before editing a clip, and again after the user says they changed something — revisions change when a human edits, and you need the current one to write safely.

    View tool JSON
    {
      "name": "get_editor_state",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the current state of the Cutlet editor: the loaded video, how many sentences the transcript has, what the user has anchored, and every clip with its segments, duration and revision. Call this before editing a clip, and again after the user says they changed something — revisions change when a human edits, and you need the current one to write safely.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    read_transcriptAnswer

    Read the transcript as sentences, each with a stable id like s0042 and its start and end time. Use the ids — never raw timestamps — when you propose a clip. To find clips in a recording you have not seen, call this once with detail "skim": it returns every sentence shortened to a few words, so a whole recording arrives in one result and you can see its shape. Then read the stretches that look promising with detail "full" before you commit to any boundary. There are two transcripts here. scope "source" (default) is the whole recording as spoken — that is where you find clips. scope "clip" is one cut as it actually plays: only the sentences it kept, in play order, with each gap marked where material was dropped. Read that before you judge or revise a cut — the segment list tells you what survived, but only this tells you how the joins sound.

    View tool JSON
    {
      "name": "read_transcript",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the transcript as sentences, each with a stable id like s0042 and its start and end time. Use the ids — never raw timestamps — when you propose a clip.\n\nTo find clips in a recording you have not seen, call this once with detail \"skim\": it returns every sentence shortened to a few words, so a whole recording arrives in one result and you can see its shape. Then read the stretches that look promising with detail \"full\" before you commit to any boundary.\n\nThere are two transcripts here. scope \"source\" (default) is the whole recording as spoken — that is where you find clips. scope \"clip\" is one cut as it actually plays: only the sentences it kept, in play order, with each gap marked where material was dropped. Read that before you judge or revise a cut — the segment list tells you what survived, but only this tells you how the joins sound.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "source",
              "clip"
            ],
            "description": "source (default) reads the whole recording as spoken. clip reads one cut as it plays — kept sentences only, gaps marked. Use clip to hear an edit before revising it."
          },
          "clipId": {
            "type": "string",
            "description": "Which clip to read when scope is \"clip\". Defaults to the selected clip, which is what the user means by \"this\"."
          },
          "detail": {
            "type": "string",
            "enum": [
              "full",
              "skim"
            ],
            "description": "full (default) returns complete sentences, up to 120. skim returns every sentence shortened to about 11 words, up to 900 — use it to survey a whole recording before choosing where to look."
          },
          "startSentenceId": {
            "type": "string",
            "description": "First sentence to return, e.g. \"s0042\". Defaults to the start of the transcript, or to the user's anchor when there is one."
          },
          "count": {
            "type": "number",
            "description": "How many sentences to return. Default 40 when reading in full, the whole transcript when skimming."
          },
          "before": {
            "type": "number",
            "description": "Also include this many sentences of context before startSentenceId. Useful when you need to find where a thought begins."
          }
        },
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    search_transcriptAnswer

    Find sentences matching a word or phrase, anywhere in the transcript. Returns matching sentence ids with a little surrounding context so you can judge where a thought starts and ends before proposing a range. This is the cheap way to locate a moment in a long recording.

    View tool JSON
    {
      "name": "search_transcript",
      "kind": "answer",
      "impl": "imperative",
      "description": "Find sentences matching a word or phrase, anywhere in the transcript. Returns matching sentence ids with a little surrounding context so you can judge where a thought starts and ends before proposing a range. This is the cheap way to locate a moment in a long recording.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Words to look for. Case-insensitive; all words must appear in the sentence, in any order."
          },
          "limit": {
            "type": "number",
            "description": "Maximum number of hits. Default 8, maximum 25."
          },
          "contextSentences": {
            "type": "number",
            "description": "How many sentences either side of each hit to include. Default 1."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    get_guidelinesAnswer

    Read the editorial rules this editor works by: the difference between a topic and a cut, what makes a cut land, how long clips should be, and what this tool set can and cannot do. Read this once before your first edit.

    View tool JSON
    {
      "name": "get_guidelines",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the editorial rules this editor works by: the difference between a topic and a cut, what makes a cut land, how long clips should be, and what this tool set can and cannot do. Read this once before your first edit.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    create_clipAction

    Create a clip and add it to the rail. Pass one contiguous range for a topic (startSentenceId + endSentenceId), or a list of segments for a cut with gaps in it. Ranges are inclusive of both ends. If the user has anchored a sentence, that sentence should fall inside what you create.

    View tool JSON
    {
      "name": "create_clip",
      "kind": "act",
      "impl": "imperative",
      "description": "Create a clip and add it to the rail. Pass one contiguous range for a topic (startSentenceId + endSentenceId), or a list of segments for a cut with gaps in it. Ranges are inclusive of both ends. If the user has anchored a sentence, that sentence should fall inside what you create.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "startSentenceId": {
            "type": "string",
            "description": "First sentence, for a single-range clip."
          },
          "endSentenceId": {
            "type": "string",
            "description": "Last sentence, inclusive, for a single-range clip."
          },
          "segments": {
            "type": "array",
            "description": "For a cut: the pieces to keep, in order. Each is {startSentenceId, endSentenceId}, inclusive. Gaps between them are the sentences you are dropping.",
            "items": {
              "type": "object",
              "properties": {
                "startSentenceId": {
                  "type": "string"
                },
                "endSentenceId": {
                  "type": "string"
                }
              },
              "required": [
                "startSentenceId",
                "endSentenceId"
              ]
            }
          },
          "title": {
            "type": "string",
            "description": "Short human title. A few words, sentence case."
          },
          "note": {
            "type": "string",
            "description": "One line on why this shape — the user reads this."
          },
          "preview": {
            "type": "boolean",
            "description": "Play it immediately. Default true — the point is for the human to watch it."
          }
        },
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    update_clipAction

    Change an existing clip: replace its segments, move an edge, retitle it, or set the padding around each cut. Pass expectedRevision with the revision you last read — if a human has edited it since, the write is refused and you are told the real revision, so you can look at what they did instead of overwriting it.

    View tool JSON
    {
      "name": "update_clip",
      "kind": "act",
      "impl": "imperative",
      "description": "Change an existing clip: replace its segments, move an edge, retitle it, or set the padding around each cut. Pass expectedRevision with the revision you last read — if a human has edited it since, the write is refused and you are told the real revision, so you can look at what they did instead of overwriting it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clipId": {
            "type": "string",
            "description": "Which clip, e.g. \"c2\"."
          },
          "expectedRevision": {
            "type": "number",
            "description": "The revision you last saw on this clip. Strongly recommended — it is what stops you clobbering a human edit."
          },
          "startSentenceId": {
            "type": "string",
            "description": "New single range, first sentence."
          },
          "endSentenceId": {
            "type": "string",
            "description": "New single range, last sentence."
          },
          "segments": {
            "type": "array",
            "description": "Replace every segment. Each is {startSentenceId, endSentenceId}, inclusive. They are sorted into transcript order unless you also pass preserveOrder.",
            "items": {
              "type": "object",
              "properties": {
                "startSentenceId": {
                  "type": "string"
                },
                "endSentenceId": {
                  "type": "string"
                }
              },
              "required": [
                "startSentenceId",
                "endSentenceId"
              ]
            }
          },
          "title": {
            "type": "string",
            "description": "New title."
          },
          "note": {
            "type": "string",
            "description": "New one-line note."
          },
          "pad": {
            "type": "number",
            "description": "Seconds of breathing room added at each end of every segment, 0 to 2. Raise it if the cuts feel clipped; lower it if they feel slack."
          },
          "preserveOrder": {
            "type": "boolean",
            "description": "Play the segments in the order you listed them rather than in transcript order. Use it to rearrange a cut — to open on the punchline and then give the setup, say. Reordering is safe because it makes no new boundary: every piece keeps the sentence ids it already had."
          },
          "preview": {
            "type": "boolean",
            "description": "Play the revised clip. Default true."
          }
        },
        "required": [
          "clipId"
        ],
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    cut_clipAction

    Reduce a clip to a postable length by keeping the sentences you name and dropping the rest, then write the result back to the same clip. Runs of consecutive ids become one piece; every break between them becomes a cut. Read the clip in full first and choose the lines yourself. Deciding what survives is the judgement this tool exists to carry — there is no automatic mode, because nothing mechanical can tell a throwaway aside from the payoff.

    View tool JSON
    {
      "name": "cut_clip",
      "kind": "act",
      "impl": "imperative",
      "description": "Reduce a clip to a postable length by keeping the sentences you name and dropping the rest, then write the result back to the same clip. Runs of consecutive ids become one piece; every break between them becomes a cut.\n\nRead the clip in full first and choose the lines yourself. Deciding what survives is the judgement this tool exists to carry — there is no automatic mode, because nothing mechanical can tell a throwaway aside from the payoff.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clipId": {
            "type": "string",
            "description": "The clip to cut down, usually a topic."
          },
          "expectedRevision": {
            "type": "number",
            "description": "The revision you last saw on it."
          },
          "keepSentenceIds": {
            "type": "array",
            "description": "The sentences to keep, in any order. Aim for 30 to 60 seconds of speech unless the user asked for something else. Keeping two sentences in a row reads better than keeping two good ones with a hole between them.",
            "items": {
              "type": "string"
            },
            "minItems": 1
          },
          "note": {
            "type": "string",
            "description": "One line on what you kept and why."
          },
          "preview": {
            "type": "boolean",
            "description": "Play the cut. Default true."
          }
        },
        "required": [
          "clipId",
          "keepSentenceIds"
        ],
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    edit_clip_sentenceAction

    Drop a single sentence out of a clip, or put one back. Dropping an interior sentence splits the clip into two segments with a gap where it was. This is the fine adjustment after the shape is roughly right — reach for it when the user says one specific line has to go or come back.

    View tool JSON
    {
      "name": "edit_clip_sentence",
      "kind": "act",
      "impl": "imperative",
      "description": "Drop a single sentence out of a clip, or put one back. Dropping an interior sentence splits the clip into two segments with a gap where it was. This is the fine adjustment after the shape is roughly right — reach for it when the user says one specific line has to go or come back.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clipId": {
            "type": "string",
            "description": "Which clip."
          },
          "sentenceId": {
            "type": "string",
            "description": "Which sentence, e.g. \"s0031\"."
          },
          "action": {
            "type": "string",
            "enum": [
              "remove",
              "add"
            ],
            "description": "remove drops it from the clip; add puts it back in transcript order."
          },
          "preview": {
            "type": "boolean",
            "description": "Play the result. Default true."
          }
        },
        "required": [
          "clipId",
          "sentenceId",
          "action"
        ],
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    split_sentenceAction

    Cut one sentence into two at a word boundary, when the boundary you need is not one the transcript has. Sentences come from whatever punctuation the speech recogniser guessed, and it guesses badly: a missed full stop leaves a sixty-word run you can only take whole. Splitting makes the boundary you want into a real sentence with its own id, so you can then cut on it like any other. The first half keeps the original id; the second half gets a new one, reported back. Clips are rewritten so they still contain exactly what they contained before — splitting changes the vocabulary, never the edit. Read the sentence first so you can count the words.

    View tool JSON
    {
      "name": "split_sentence",
      "kind": "act",
      "impl": "imperative",
      "description": "Cut one sentence into two at a word boundary, when the boundary you need is not one the transcript has.\n\nSentences come from whatever punctuation the speech recogniser guessed, and it guesses badly: a missed full stop leaves a sixty-word run you can only take whole. Splitting makes the boundary you want into a real sentence with its own id, so you can then cut on it like any other.\n\nThe first half keeps the original id; the second half gets a new one, reported back. Clips are rewritten so they still contain exactly what they contained before — splitting changes the vocabulary, never the edit. Read the sentence first so you can count the words.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sentenceId": {
            "type": "string",
            "description": "The sentence to split, e.g. \"s0013\"."
          },
          "afterWord": {
            "type": "number",
            "description": "How many words stay in the first half. 5 means the split falls after the fifth word, so the sixth begins the new sentence. Must be at least 1 and less than the number of words in the sentence."
          }
        },
        "required": [
          "sentenceId",
          "afterWord"
        ],
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }
    preview_clipAction

    Play something in the player so the human can watch it. Give it a clipId to play a clip, gaps and all, or a pair of sentence ids to audition a range before committing to it. Playback happens in the user's tab; you get back what you asked it to do, not the video.

    View tool JSON
    {
      "name": "preview_clip",
      "kind": "act",
      "impl": "imperative",
      "description": "Play something in the player so the human can watch it. Give it a clipId to play a clip, gaps and all, or a pair of sentence ids to audition a range before committing to it. Playback happens in the user's tab; you get back what you asked it to do, not the video.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "clipId": {
            "type": "string",
            "description": "Play this existing clip, jumping its gaps."
          },
          "startSentenceId": {
            "type": "string",
            "description": "Play from this sentence. Use with endSentenceId to audition a range."
          },
          "endSentenceId": {
            "type": "string",
            "description": "Play up to and including this sentence."
          },
          "mode": {
            "type": "string",
            "enum": [
              "play",
              "seek"
            ],
            "description": "play (default) runs it and stops at the end. seek parks the playhead at the start."
          }
        },
        "additionalProperties": false
      },
      "page": "/cutlet/"
    }