appsgolem-mcp
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, сообщающий, что нужно задать ключ.
Конфигурация
Переменная окружения | Обязательная | По умолчанию | Примечания |
| да | — | Ваш ключ |
| нет |
| Переопределение для 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 после отправки).
Параметры
Имя | Тип | По умолчанию | Примечания |
| string | — | Обязательный. URL YouTube: watch / share / |
| string | — | Начало клипа: |
| string | — | Конец клипа, те же форматы (≤ 300 ч). Опустите при использовании |
| string |
|
|
| string |
|
|
| string | — | Формат вывода для |
| string | — | Битрейт lossy-аудио |
| boolean |
| Потоковое копирование (≈10× быстрее, выравнивание по ключевым кадрам); только |
| number |
| Скорость воспроизведения |
| integer |
| Интервал выборки для |
| boolean |
|
|
| boolean |
|
|
| array | — | Массив из 1–10 диапазонов |
| boolean |
| При 2+ |
| string | — | Стабильный ключ (≤ 200 символов), чтобы повторный запрос использовал то же задание (отправляется как заголовок |
| boolean |
| Опрашивать до готовности, вплоть до предела ожидания |
| integer |
| Предел ожидания в секундах (по умолчанию 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) или того, которое превысило время ожидания.
Имя | Тип | Примечания |
| string | Обязательный. Идентификатор задания (UUID), возвращённый |
Возвращает — состояние задания; после создания/доставки также содержит
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 }Режимы
| Вывод | Примечательные параметры |
| Видеофайл без водяного знака — обычно MP4; |
|
| mp3 / m4a / wav / flac |
|
| Видео + MP3 вместе, в виде zip ( |
|
| Видео без звуковой дорожки — обычно MP4; |
|
| Вертикальное 9:16 — AI-умный кроп, когда применимо, иначе запасной вариант с размытием по бокам, точное соотношение сторон зависит от источника (Shorts / Reels / TikTok) |
|
| Анимированный GIF (≤ 5 мин; без нескольких клипов) |
|
| JPG-кадры |
|
Примеры запросов
Поскольку агент выбирает параметры из вашего запроса, вы управляете им на простом языке:
«Вырежи 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 (вызов инструмента при этом всё равно завершается успешно):
| Когда |
|
|
| Ключ был отклонён (401). |
|
|
| Задача для этого аккаунта не найдена (404). |
| Задача перешла в состояние |
| Сбой соединения/транспорта или таймаут запроса. |
| Не удалось собрать URL из настроенных base/path API. |
| Ответ с кодом ≥400, тело JSON которого не является объектом |
| Успешный ответ, тело которого не является JSON-объектом (массив/скаляр/null), или — при |
Ошибки уровня 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 toolscut_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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Clip end as "SS"/"MM:SS"/"HH:MM:SS" (≤300h). Omit when passing clips. | |
| url | Yes | A YouTube video URL (watch/share/youtu.be — playlists rejected). | |
| fast | No | Stream-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. | |
| mode | No | One 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 |
| wait | No | Poll until ready (default) up to the timeout_seconds polling deadline. | |
| clips | No | A non-empty list of 1–10 {start,end} ranges INSTEAD of start/end. | |
| sheet | No | Frames — a single contact-sheet JPG (2..80 frames, single clip); disables burn_ts. | |
| speed | No | Playback speed 0.5/1.0/1.25/1.5/2.0; video/nosound/both/audio_only. | |
| start | No | Clip start as "SS"/"MM:SS"/"HH:MM:SS" (≤300h). Omit when passing clips. | |
| stitch | No | With 2+ clips, join them into one file (else a zip of clips); ignored for a single clip; video/audio_only/both/short/nosound only. | |
| bitrate | No | Lossy-audio bitrate "320"(default)/"256"/"192"/"128" — MP3/M4A in audio_only, MP3 in both; ignored for wav/flac. | |
| burn_ts | No | Frames — burn the source timestamp onto each JPG. | |
| resolution | No | 144p/240p/360p/480p/720p/1080p (default)/1440p/2160p (4K; total cut ≤60 min). | 1080p |
| interval_ms | No | Frames sampling interval — 100/500/1000/2000(default)/5000/10000; non-sheet extraction is capped at 1800 JPGs total across all clips. | |
| audio_format | No | audio_only output format — "mp3"(default)/"m4a"/"wav"/"flac". both always produces MP3. | |
| idempotency_key | No | A stable key (≤200 chars) so a retried request reuses the same job. | |
| timeout_seconds | No | Polling deadline in seconds when wait=true (default 300); submission + one in-flight status request can extend total wall-clock. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job id (a UUID) returned by cut_youtube_video. |
TDQS
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.
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.
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.
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.
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.
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 tool update
v0.1.2- Changed
cut_youtube_video21 fields changed- removed
Input schema / properties / audio_format / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / audio_format / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / bitrate / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / bitrate / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / burn_ts / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / burn_ts / typeAdded value: +[ + "boolean", + "null" +] - changed
Input schema / properties / clips / anyOfPrevious 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" + } +] - removed
Input schema / properties / end / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / end / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / fast / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / fast / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / idempotency_key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / idempotency_key / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / sheet / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / sheet / typeAdded value: +[ + "boolean", + "null" +] - removed
Input schema / properties / speed / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / speed / typeAdded value: +[ + "number", + "null" +] - removed
Input schema / properties / start / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / start / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / stitch / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / stitch / typeAdded value: +[ + "boolean", + "null" +]
3 tool updates
v0.1.0- First observed
cut_youtube_video - First observed
get_account_balance - First observed
get_cut_status
TDQS
Scored across 3 tools
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.
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.
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.
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
Related MCP Connectors
Create AI-powered short-form video clips from YouTube videos. Supports webhook callbacks.
Turn long videos into short, captioned viral clips from your AI assistant. 28 tools, OAuth.
YouTube transcripts, search, channels, playlists and bulk transcript jobs for AI agents. 14 tools.
Create shareable clips from public YouTube videos using exact start and end times.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to fetch YouTube video transcripts with precise timestamps, multi-language support, and time-range filtering.31MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to fetch transcripts, metadata, and download videos/audio from YouTube without API keys.33MIT
- AlicenseAqualityDmaintenanceEnables AI agents to search, watch, summarize, clip, and extract transcripts from YouTube videos, all without needing an API key or leaving the chat.96 npm55Apache 2.0

fetchworks-mcpofficial
AlicenseAqualityBmaintenanceEnables AI agents to retrieve YouTube transcripts from individual videos, channels, and search results, supporting multiple output formats such as plain text, SRT, and VTT.316 npmMIT