Skip to main content
Glama

appsgolem-mcp (Node / TypeScript)

Un servidor MCP para la API de corte de YouTube AppsGolem. Permite que un agente de IA (Claude Desktop, Claude Code, Cursor, …) corte clips de videos de YouTube — en cualquier formato que admita el cortador web — y obtenga una URL de descarga directa. La lógica REST vive en un cliente pequeño y con pocas dependencias (src/client.ts); src/server.ts es la capa fina de herramientas MCP sobre él.

Requisitos

  • Node.js >= 18 (usa fetch global).

  • Una clave de API de AppsGolem (ag_live_…) — créala en tu panel en https://appsgolem.com/api-billing/. Los créditos son prepagados; compra un paquete o una suscripción allí.

Related MCP server: youtube-mcp

Instalar / conectar (sin instalación manual)

npx descarga y ejecuta el servidor bajo demanda — no hay que instalar nada globalmente.

Claude Desktop / Cursor — añade al archivo de configuración MCP del cliente (p. ej. claude_desktop_config.json):

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

Claude Code — un comando:

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

El servidor habla MCP sobre stdio (el transporte que usan esos clientes). La ausencia de APPSGOLEM_API_KEY no es fatal al inicio — el servidor igualmente arranca y anuncia sus herramientas; cada llamada devuelve entonces un config_error claro indicando que debes establecer la clave.

Configuración

Variable de entorno

Obligatoria

Valor por defecto

Notas

APPSGOLEM_API_KEY

sí

—

Tu clave ag_live_….

APPSGOLEM_API_BASE

no

https://appsgolem.com

Anulación para autoalojado / dev.

Precios

1 clip producido = 1 crédito. 2160p (4K) = 4 créditos por clip — excepto audio_only, que sigue siendo 1. Una fuente de más de 2 h añade +1 una vez por trabajo, pero solo cuando se conoce su duración (el recargo se omite si la sonda no puede determinarla). Un lote/unión de N clips cuesta N por clip. Los cortes fallidos nunca se facturan.


Herramientas

El servidor expone tres herramientas. Una llamada que pasa la validación del esquema de entrada MCP devuelve un resultado estructurado — el propio JSON de la API en caso de éxito, o { "error": … } en cualquier fallo del manejador/API — y nunca lanza un error a nivel de protocolo, de modo que un agente siempre obtiene un objeto utilizable. (Los argumentos de herramienta no válidos son rechazados por el SDK de MCP antes de que se ejecute el manejador, como un resultado isError solo de texto.)

1. cut_youtube_video

Corta un clip (o un lote de clips) de un video de YouTube. Por defecto espera hasta que el clip se produce y devuelve su estado (incluyendo un download_url una vez que un token de descarga está listo); establece wait: false para enviar y devolver inmediatamente con el trabajo actual (su estado normalmente es queued después del envío).

Parámetros

Nombre

Tipo

Por defecto

Notas

url

string

—

Obligatorio. URL de YouTube de tipo watch / share / youtu.be. Las listas de reproducción se rechazan.

start

string

—

Inicio del clip: "SS", "MM:SS" o "HH:MM:SS" (≤ 300 h). Omitir al usar clips.

end

string

—

Fin del clip, mismos formatos (≤ 300 h). Omitir al usar clips.

resolution

string

1080p

144p · 240p · 360p · 480p · 720p · 1080p · 1440p · 2160p (4K; corte total ≤ 60 min).

mode

string

video

video · audio_only · both · nosound · short · gif · frames (ver Modos abajo).

audio_format

string

—

El formato de salida de audio_only: mp3 · m4a · wav · flac (el servidor usa mp3 por defecto). both siempre produce MP3.

bitrate

string

—

Bitrate de audio con pérdida 320 · 256 · 192 · 128 (por defecto 320): MP3/M4A en audio_only, MP3 en both; ignorado para WAV/FLAC.

fast

boolean

false

Copia de flujo (≈10× más rápido, alineado a keyframes); solo video / nosound / both. Mutuamente excluyente con una speed distinta de 1× — si ambos se establecen, fast gana y speed se fuerza a 1.0.

speed

number

1.0

Velocidad de reproducción 0.5 · 1 · 1.25 · 1.5 · 2. video / nosound / both / audio_only.

interval_ms

integer

2000

Intervalo de muestreo de frames: 100 · 500 · 1000 · 2000 · 5000 · 10000 (la extracción sin hoja está limitada a 1,800 JPGs en total entre todos los clips).

burn_ts

boolean

false

frames: graba la marca de tiempo de origen en cada JPG.

sheet

boolean

false

frames: devuelve un único JPG de hoja de contactos (2–80 fotogramas, un solo clip). Al establecerlo, desactiva burn_ts.

clips

array

—

Un array de 1–10 rangos { start, end } en lugar de start/end (un array vacío se rechaza).

stitch

boolean

false

Con 2+ clips, únelos en un solo archivo (si no, un zip de clips); ignorado para un solo clip. video / audio_only / both / short / nosound.

idempotency_key

string

—

Una clave estable (≤ 200 caracteres) para que una solicitud reintentada reutilice el mismo trabajo (se envía como cabecera Idempotency-Key).

wait

boolean

true

Sondea hasta que esté listo, hasta el plazo de timeout_seconds.

timeout_seconds

integer

300

Plazo de sondeo en segundos (por defecto 300). Limita solo el sondeo — el envío inicial y una solicitud de estado en curso (cada una con un tiempo de espera de solicitud de hasta 30 s) pueden extender el tiempo total de pared.

Devuelve (wait: true, por defecto) — el estado del trabajo producido. download_url está presente una vez que un token de descarga está disponible; si aún no lo está, vuelve a sondear:

{
  "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"
}

Devuelve (wait: false) — el trabajo inmediatamente, con su estado actual (normalmente queued después del envío) y sin download_url todavía; sondea get_cut_status con el id (o consulta poll_url):

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

Si la espera agota el tiempo antes de que el clip esté listo, el resultado lleva "still_processing": true y el id del trabajo — sondea get_cut_status con ese id. Si el trabajo alcanza un fallo terminal, el resultado es { "error": "cut_failed", "state": "failed" | "refunded", "id": … } (y no se cobra ningún crédito).

2. get_cut_status

Comprueba un trabajo de corte por su id. Úsalo para sondear un trabajo iniciado con cut_youtube_video(wait=false) o uno que agotó el tiempo.

Nombre

Tipo

Notas

job_id

string

Obligatorio. El id del trabajo (un UUID) devuelto por cut_youtube_video.

Devuelve — el estado del trabajo; una vez producido/entregado también lleva un download_url cuando hay un token de descarga disponible (si no, vuelve a sondear):

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

Los estados progresan accepted → queued → produced → delivered, o failed → refunded en caso de error.

3. get_account_balance

Devuelve el saldo de créditos gastables de la cuenta de la API y el límite horario actual. Sin parámetros.

Devuelve

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

Modos

mode

Salida

Opciones notables

video

Archivo de video, sin marca de agua — normalmente MP4; fast conserva el contenedor de origen (p. ej. WebM en alta resolución)

resolution, fast, speed

audio_only

mp3 / m4a / wav / flac

audio_format, bitrate, speed

both

Video + MP3 juntos, como un zip (fast puede conservar el contenedor de origen del video)

bitrate, fast, speed

nosound

Video sin pista de audio — normalmente MP4; fast conserva el contenedor de origen

resolution, fast, speed

short

Vertical 9:16 — recorte inteligente por IA cuando corresponde, si no un respaldo de letterbox desenfocado cuyo aspecto exacto depende de la fuente (Shorts / Reels / TikTok)

resolution

gif

GIF animado (≤ 5 min; sin multi-clip)

resolution

frames

Fotogramas JPG

interval_ms, burn_ts, sheet


Ejemplos de indicaciones

Como el agente elige los parámetros a partir de tu solicitud, lo manejas en lenguaje natural:

  • "Corta de 0:30 a 1:15 de https://youtu.be/dQw4w9WgXcQ en 1080p." → cut_youtube_video(url, start="0:30", end="1:15")

  • "Extrae el audio de ese video de 2:00 a 5:00 como mp3." → mode="audio_only", audio_format="mp3"

  • "Haz un short vertical del momento destacado de 10:00–10:45." → mode="short", start="10:00", end="10:45"

  • "Convierte 0:05–0:12 en un GIF." → mode="gif"

  • "Extrae una hoja de contactos de fotogramas cada 5 segundos de 1:00 a 2:00." → mode="frames", interval_ms=5000, sheet=true

  • "Une 0:10–0:20 y 1:00–1:10 en un solo clip." → clips=[{start:"0:10",end:"0:20"},{start:"1:00",end:"1:10"}], stitch=true

  • "Haz un corte rápido con copia de flujo de 0:00–0:30." → fast=true

  • "¿Cuántos créditos de API me quedan?" → get_account_balance()


Formas de resultado y error

Cada resultado de un manejador es un objeto simple (los fallos de validación de argumentos MCP son la excepción — ver la nota de Herramientas arriba). En caso de fallo, el objeto tiene un código error (la llamada a la herramienta sigue teniendo éxito):

error

Cuándo

config_error

Falta APPSGOLEM_API_KEY.

invalid_api_key

La clave fue rechazada (401).

invalid_job_id

job_id no es un UUID.

not_found

No existe tal trabajo para esta cuenta (404).

cut_failed

El trabajo alcanzó failed/refunded (nunca facturado).

network_error

Error de conexión/transporte o tiempo de espera de la solicitud agotado.

bad_request

La base/ruta de API configurada no pudo construirse en una URL.

http_error

Una respuesta ≥400 cuyo cuerpo JSON no es un objeto { error: … } (lleva status).

bad_response

Una respuesta de éxito cuyo cuerpo no es un objeto JSON (array/escalar/null), o — con wait: true — un envío de cut que volvió sin un id de trabajo utilizable.

Los errores a nivel de API (p. ej. validación 400, límite de velocidad 429) se devuelven como el cuerpo de error propio de la API más un campo status; un 429 también incluye retry_after (segundos) cuando el servidor envía Retry-After, para que un agente pueda retroceder.

Un download_url relativo (la API devuelve una ruta) se resuelve a una URL completa contra la base de API configurada solo cuando permanece en ese origen; las URL ya absolutas y las referencias fuera de origen se dejan sin cambios.


Desarrollo

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)

Publicación

npm publish (desde este directorio) hace que npx appsgolem-mcp funcione para todos. El script prepare construye dist/ automáticamente al instalar/publicar.

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.

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.

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.

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