Skip to main content
Glama

appsgolem-mcp (Node / TypeScript)

Сервер MCP для API нарезки YouTube-видео AppsGolem. Он позволяет ИИ-агенту (Claude Desktop, Claude Code, Cursor, …) вырезать клипы из YouTube-видео — в любом формате, который поддерживает веб-резак, — и получать прямую ссылку для скачивания. REST-логика находится в небольшом клиенте без лишних зависимостей (src/client.ts); src/server.ts — это тонкий слой инструментов MCP поверх него.

Требования

  • Node.js >= 18 (используется глобальный fetch).

  • Ключ API AppsGolem (ag_live_…) — создайте его в панели управления по адресу https://appsgolem.com/api-billing/. Кредиты предоплачены; купите пакет или подписку там.

Related MCP server: youtube-mcp

Установка / подключение (без ручной установки)

npx загружает и запускает сервер по требованию — ничего глобально устанавливать не нужно.

Claude Desktop / Cursor — добавьте в конфигурацию MCP клиента (например, claude_desktop_config.json):

{
  "mcpServers": {
    "appsgolem": {
      "command": "npx",
      "args": ["-y", "appsgolem-mcp"],
      "env": { "APPSGOLEM_API_KEY": "ag_live_…" }
    }
  }
}

Claude Code — одна команда:

claude mcp add appsgolem -e APPSGOLEM_API_KEY=ag_live_… -- npx -y appsgolem-mcp

Сервер общается по MCP через stdio (транспорт, который используют эти клиенты). Отсутствие APPSGOLEM_API_KEY не является фатальным при запуске — сервер всё равно запускается и объявляет свои инструменты; каждый вызов затем возвращает понятный config_error, сообщающий, что нужно задать ключ.

Конфигурация

Переменная окружения

Обязательная

По умолчанию

Примечания

APPSGOLEM_API_KEY

да

—

Ваш ключ ag_live_….

APPSGOLEM_API_BASE

нет

https://appsgolem.com

Переопределение для self-host / dev.

Цены

1 созданный клип = 1 кредит. 2160p (4K) = 4 кредита за клип — кроме audio_only, который остаётся 1. Исходник длиннее 2 часов добавляет +1 один раз за задание, но только когда его длительность известна (надбавка пропускается, если пробу не удаётся её определить). Пакет/склейка из N клипов стоит N за клип. Неудачные нарезки не тарифицируются.


Инструменты

Сервер предоставляет три инструмента. Вызов, прошедший проверку схемы входных данных MCP, возвращает структурированный результат — собственный JSON API при успехе или { "error": … } при любой ошибке обработчика/API — и никогда не вызывает ошибку на уровне протокола, так что агент всегда получает пригодный объект. (Недопустимые аргументы инструмента отклоняются MCP SDK до запуска обработчика, как текстовый результат isError.)

1. cut_youtube_video

Вырезать клип (или пакет клипов) из YouTube-видео. По умолчанию он ожидает готовности клипа и возвращает его статус (включая download_url, когда токен для скачивания готов); установите wait: false, чтобы отправить задание и сразу вернуться с текущим заданием (его состояние обычно queued после отправки).

Параметры

Имя

Тип

По умолчанию

Примечания

url

string

—

Обязательный. URL YouTube: watch / share / youtu.be. Плейлисты отклоняются.

start

string

—

Начало клипа: "SS", "MM:SS" или "HH:MM:SS" (≤ 300 ч). Опустите при использовании clips.

end

string

—

Конец клипа, те же форматы (≤ 300 ч). Опустите при использовании clips.

resolution

string

1080p

144p · 240p · 360p · 480p · 720p · 1080p · 1440p · 2160p (4K; общая нарезка ≤ 60 мин).

mode

string

video

video · audio_only · both · nosound · short · gif · frames (см. Режимы ниже).

audio_format

string

—

Формат вывода для audio_only: mp3 · m4a · wav · flac (сервер по умолчанию использует mp3). both всегда создаёт MP3.

bitrate

string

—

Битрейт lossy-аудио 320 · 256 · 192 · 128 (по умолчанию 320): MP3/M4A в audio_only, MP3 в both; игнорируется для WAV/FLAC.

fast

boolean

false

Потоковое копирование (≈10× быстрее, выравнивание по ключевым кадрам); только video / nosound / both. Взаимоисключающе с не-1× speed — если заданы оба, fast побеждает, а speed принудительно становится 1.0.

speed

number

1.0

Скорость воспроизведения 0.5 · 1 · 1.25 · 1.5 · 2. video / nosound / both / audio_only.

interval_ms

integer

2000

Интервал выборки для frames: 100 · 500 · 1000 · 2000 · 5000 · 10000 (извлечение без листа ограничено 1 800 JPG суммарно по всем клипам).

burn_ts

boolean

false

frames: вжигать исходную временную метку на каждый JPG.

sheet

boolean

false

frames: вернуть один JPG-лист контактов (2–80 кадров, один клип). Установка отключает burn_ts.

clips

array

—

Массив из 1–10 диапазонов { start, end } вместо start/end (пустой массив отклоняется).

stitch

boolean

false

При 2+ clips объединить их в один файл (иначе zip клипов); игнорируется для одного клипа. video / audio_only / both / short / nosound.

idempotency_key

string

—

Стабильный ключ (≤ 200 символов), чтобы повторный запрос использовал то же задание (отправляется как заголовок Idempotency-Key).

wait

boolean

true

Опрашивать до готовности, вплоть до предела ожидания timeout_seconds.

timeout_seconds

integer

300

Предел ожидания в секундах (по умолчанию 300). Он ограничивает только опрос — начальная отправка и один запрос статуса в процессе (каждый с таймаутом запроса до 30 с) могут увеличить общее время.

Возвращает (wait: true, по умолчанию) — статус созданного задания. download_url присутствует, когда токен для скачивания готов; если его ещё нет, опросите снова:

{
  "id": "e48db1a2-1c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "state": "produced",
  "credits_reserved": 1,
  "created_at": "2026-08-22T12:00:00+00:00",
  "download_url": "https://appsgolem.com/v1/download/…/clip.mp4"
}

Возвращает (wait: false) — задание сразу, с его текущим состоянием (обычно queued после отправки) и без download_url; опросите get_cut_status с id (или получите poll_url):

{
  "id": "e48db1a2-1c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "state": "queued",
  "credits_reserved": 1,
  "poll_url": "/v1/cuts/e48db1a2-1c3d-4e5f-8a9b-0c1d2e3f4a5b"
}

Если ожидание истекло до готовности клипа, результат содержит "still_processing": true и id задания — опросите get_cut_status с этим id. Если задание достигло конечного сбоя, результат — { "error": "cut_failed", "state": "failed" | "refunded", "id": … } (и кредит не списывается).

2. get_cut_status

Проверить задание нарезки по его id. Используйте для опроса задания, запущенного с cut_youtube_video(wait=false) или того, которое превысило время ожидания.

Имя

Тип

Примечания

job_id

string

Обязательный. Идентификатор задания (UUID), возвращённый cut_youtube_video.

Возвращает — состояние задания; после создания/доставки также содержит download_url, когда токен для скачивания доступен (иначе опросите снова):

{ "id": "e48db1a2-…", "state": "queued", "credits_reserved": 1, "created_at": "…" }

Состояния прогрессируют accepted → queued → produced → delivered, или failed → refunded при ошибке.

3. get_account_balance

Возвращает доступный кредитный баланс API-аккаунта и текущий часовой лимит. Без параметров.

Возвращает

{ "balance": 412, "hourly_cap": 60 }

Режимы

mode

Вывод

Примечательные параметры

video

Видеофайл без водяного знака — обычно MP4; fast сохраняет исходный контейнер (например, WebM в высоком разрешении)

resolution, fast, speed

audio_only

mp3 / m4a / wav / flac

audio_format, bitrate, speed

both

Видео + MP3 вместе, в виде zip (fast может сохранить исходный контейнер видео)

bitrate, fast, speed

nosound

Видео без звуковой дорожки — обычно MP4; fast сохраняет исходный контейнер

resolution, fast, speed

short

Вертикальное 9:16 — AI-умный кроп, когда применимо, иначе запасной вариант с размытием по бокам, точное соотношение сторон зависит от источника (Shorts / Reels / TikTok)

resolution

gif

Анимированный GIF (≤ 5 мин; без нескольких клипов)

resolution

frames

JPG-кадры

interval_ms, burn_ts, sheet


Примеры запросов

Поскольку агент выбирает параметры из вашего запроса, вы управляете им на простом языке:

  • «Вырежи 0:30–1:15 из https://youtu.be/dQw4w9WgXcQ в 1080p.» → cut_youtube_video(url, start="0:30", end="1:15")

  • «Возьми аудио этого видео с 2:00 по 5:00 как mp3.» → mode="audio_only", audio_format="mp3"

  • «Сделай вертикальный шорт из хайлайта 10:00–10:45.» → mode="short", start="10:00", end="10:45"

  • «Преврати 0:05–0:12 в GIF.» → mode="gif"

  • «Извлеки лист кадров каждые 5 секунд с 1:00 по 2:00.» → mode="frames", interval_ms=5000, sheet=true

  • «Склей 0:10–0:20 и 1:00–1:10 в один клип.» → clips=[{start:"0:10",end:"0:20"},{start:"1:00",end:"1:10"}], stitch=true

  • «Сделай быструю нарезку с потоковым копированием 0:00–0:30.» → fast=true

  • «Сколько у меня осталось API-кредитов?» → get_account_balance()


Формы результатов и ошибок

Каждый результат от обработчика — это обычный объект (исключение — ошибки валидации аргументов MCP; см. примечание об инструментах выше). При сбое объект содержит код error (вызов инструмента при этом всё равно завершается успешно):

error

Когда

config_error

APPSGOLEM_API_KEY отсутствует.

invalid_api_key

Ключ был отклонён (401).

invalid_job_id

job_id не является UUID.

not_found

Задача для этого аккаунта не найдена (404).

cut_failed

Задача перешла в состояние failed/refunded (оплата не производилась).

network_error

Сбой соединения/транспорта или таймаут запроса.

bad_request

Не удалось собрать URL из настроенных base/path API.

http_error

Ответ с кодом ≥400, тело JSON которого не является объектом { error: … } (содержит status).

bad_response

Успешный ответ, тело которого не является JSON-объектом (массив/скаляр/null), или — при wait: true — отправка cut, вернувшаяся без пригодного id задачи.

Ошибки уровня API (например, ошибка валидации 400, превышение лимита запросов 429) возвращаются в виде собственного тела ошибки API плюс поле status; 429 также включает retry_after (в секундах), когда сервер отправляет Retry-After, чтобы агент мог сделать паузу.

Относительный download_url (API возвращает путь) преобразуется в полный URL на основе настроенного базового URL API только если он относится к тому же origin; уже абсолютные URL и ссылки на другой origin остаются без изменений.


Разработка

npm install
npm run build      # tsc -> dist/
npm test           # builds, then runs node --test (no network)
npm start          # run the stdio server locally (key needed for calls, not startup)

Публикация

npm publish (из этого каталога) делает npx appsgolem-mcp доступным для всех. Скрипт prepare автоматически собирает dist/ при установке/публикации.

Available Tools

3 tools
cut_youtube_videoCut a YouTube videoA

Cut a clip (or clips) from a YouTube video and return its download URL. Submits a cut job to AppsGolem and (by default) polls until it's produced, then returns the produced status — which includes a download_url once a download token is ready. Pricing: 1 credit per produced clip (4K = 4/clip, except audio_only which stays 1; a known source duration > 2h adds +1 once); a batch/stitch of N clips costs N per-clip. Failed cuts are never billed. On a wait-timeout the result has still_processing=true; poll get_cut_status with the returned id.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoClip end as "SS"/"MM:SS"/"HH:MM:SS" (≤300h). Omit when passing clips.
urlYesA YouTube video URL (watch/share/youtu.be — playlists rejected).
fastNoStream-copy (≈10× faster, keyframe-aligned); video/nosound/both only. Mutually exclusive with a non-1× speed — fast wins and speed is forced to 1.0.
modeNoOne of "video" (video file, default; MP4 normally, source container e.g. WebM in fast mode), "audio_only" (mp3/m4a/wav/flac), "both" (video + MP3 zip), "nosound" (video, no audio), "short" (portrait 9:16; AI smart-crop when applicable, else letterbox-blur with source-dependent aspect), "gif" (animated GIF, ≤5 min), "frames" (JPG stills).video
waitNoPoll until ready (default) up to the timeout_seconds polling deadline.
clipsNoA non-empty list of 1–10 {start,end} ranges INSTEAD of start/end.
sheetNoFrames — a single contact-sheet JPG (2..80 frames, single clip); disables burn_ts.
speedNoPlayback speed 0.5/1.0/1.25/1.5/2.0; video/nosound/both/audio_only.
startNoClip start as "SS"/"MM:SS"/"HH:MM:SS" (≤300h). Omit when passing clips.
stitchNoWith 2+ clips, join them into one file (else a zip of clips); ignored for a single clip; video/audio_only/both/short/nosound only.
bitrateNoLossy-audio bitrate "320"(default)/"256"/"192"/"128" — MP3/M4A in audio_only, MP3 in both; ignored for wav/flac.
burn_tsNoFrames — burn the source timestamp onto each JPG.
resolutionNo144p/240p/360p/480p/720p/1080p (default)/1440p/2160p (4K; total cut ≤60 min).1080p
interval_msNoFrames sampling interval — 100/500/1000/2000(default)/5000/10000; non-sheet extraction is capped at 1800 JPGs total across all clips.
audio_formatNoaudio_only output format — "mp3"(default)/"m4a"/"wav"/"flac". both always produces MP3.
idempotency_keyNoA stable key (≤200 chars) so a retried request reuses the same job.
timeout_secondsNoPolling deadline in seconds when wait=true (default 300); submission + one in-flight status request can extend total wall-clock.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does so thoroughly: it discloses asynchronous job submission, default polling, wait-timeout semantics (still_processing=true), the need to poll get_cut_status with the returned id, and detailed billing rules including no charge on failure. This is far more transparent than a simple 'cuts a video' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences deliver purpose, process, return value, pricing, and timeout behavior with no filler. Every sentence earns its place and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 17 parameters and no output schema, the description covers all operational essentials: what is returned, how the async job behaves, what to do on timeout, and cost/failure semantics. The fully-covered schema handles parameter-level details, so nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 17 parameters are already documented in detail. The description adds operational context around job lifecycle and pricing but does not add per-parameter meaning beyond what the schema states, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Cut a clip (or clips) from a YouTube video and return its download URL.' This clearly distinguishes it from siblings get_cut_status (polling job status) and get_account_balance (billing). The additional detail about submitting a cut job and returning produced status refines rather than obscures the core purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: the tool submits a cut job, polls by default, and explicitly directs the agent to get_cut_status when a wait-timeout occurs. It does not fully enumerate when to avoid this tool or mention get_account_balance, but the key alternative behavior is explicitly covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_account_balanceAccount balanceA

Return the API account's spendable credit balance and hourly cap.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It adds useful context by specifying 'spendable' credit and 'hourly cap', but doesn't explicitly confirm the call is side-effect-free, discuss error scenarios, or note whether it hits an external service. For a no-parameter getter this is adequate but not exceptional.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that names the verb and both return values with zero wasted words. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description covers the essential ground: what is returned and for whom. The only minor omission is specifics about the return format/units of the balance, but given the tool's simplicity and the clear sibling context, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0 parameters, baseline is 4. The description does clarify that the balance is for 'the API account' (not a passed-in user), which adds meaningful semantic context about whose balance this is. The schema is empty so there is nothing else to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return') and names the exact resource ('API account's spendable credit balance and hourly cap'). It clearly distinguishes itself from the sibling tools (cut_youtube_video, get_cut_status), which are entirely different domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its usage through context—it's the only read-only account-balance tool among the siblings. However, it never explicitly explains when to choose this over alternatives or mentions prerequisites like API key configuration. The differentiation from siblings is not explicit but is strongly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cut_statusCheck a cut jobA

Check a cut job's status by its id. Returns the job's state (accepted / queued / produced / delivered / failed / refunded) and, once produced/delivered, a download_url when a download token is available. Use this to poll a job started with cut_youtube_video(wait=false) or one that timed out.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesThe job id (a UUID) returned by cut_youtube_video.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the return states and the conditional download_url, which is good. However, it doesn't mention potential rate limits, error handling, or whether the job status is final, but for a simple status check this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the primary purpose, and includes necessary details without fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple status-check tool with one parameter and no output schema, the description is complete. It covers the states, the download_url condition, and the usage context. Minor gaps like error handling are not critical for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter is well-described in the schema. The description adds context by explaining the job_id is returned by cut_youtube_video, which is helpful but not essential beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks a cut job's status by its id, lists the possible states, and mentions the download_url condition. It distinguishes itself from siblings by referencing cut_youtube_video and the polling use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: to poll a job started with cut_youtube_video(wait=false) or one that timed out. This provides clear context and differentiates from the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.1.2
    • Changedcut_youtube_video21 fields changed
      • removedInput schema / properties / audio_format / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / audio_format / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / bitrate / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / bitrate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / burn_ts / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / burn_ts / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / clips / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "end": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "start": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "end": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "start": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / end / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / end / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / fast / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / fast / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedInput schema / properties / idempotency_key / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / idempotency_key / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / sheet / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / sheet / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedInput schema / properties / speed / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / speed / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedInput schema / properties / start / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / start / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / stitch / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / stitch / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
  2. 3 tool updatesv0.1.0
    • First observedcut_youtube_video
    • First observedget_account_balance
    • First observedget_cut_status

TDQS

A4.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct concern: submitting a cut job, polling job status, and checking account balance. There is no overlapping purpose or ambiguity between them.

Naming Consistency5/5

All tool names follow a clear verb_noun pattern in snake_case: cut_youtube_video, get_cut_status, get_account_balance. The verbs are specific and readable, with no mixed naming conventions.

Tool Count4/5

Three tools is minimal but appropriate for a focused YouTube clipping service. The core operations—submit, poll, and check credit—are covered without redundant tools.

Completeness4/5

The core workflow is complete: create a cut, retrieve its status/download URL, and verify account balance. Minor gaps include no cancel-job or list-jobs operation, but these are not essential for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers