Skip to main content
Glama

appsgolem-mcp (Node / TypeScript)

Ein MCP-Server für die AppsGolem-YouTube-Cutter-API. Er ermöglicht es einem KI-Agenten (Claude Desktop, Claude Code, Cursor, …), Clips aus YouTube-Videos zu schneiden – in jedem Format, das der Web-Cutter unterstützt – und einen direkten Download-Link zurückzubekommen. Die REST-Logik lebt in einem kleinen, dependency-armen Client (src/client.ts); src/server.ts ist die dünne MCP-Tool-Schicht darüber.

Voraussetzungen

  • Node.js >= 18 (nutzt das globale fetch).

  • Ein AppsGolem-API-Schlüssel (ag_live_…) – erstelle einen in deinem Dashboard unter https://appsgolem.com/api-billing/. Guthaben wird im Voraus bezahlt; kaufe dort ein Paket oder ein Abo.

Related MCP server: youtube-mcp

Installation / Verbindung (keine manuelle Installation)

npx holt und startet den Server bei Bedarf – nichts muss global installiert werden.

Claude Desktop / Cursor – füge ihn zur MCP-Konfiguration des Clients hinzu (z. B. claude_desktop_config.json):

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

Claude Code – ein Befehl:

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

Der Server spricht MCP über stdio (den Transport, den diese Clients verwenden). Ein fehlender APPSGOLEM_API_KEY ist beim Start nicht fatal – der Server startet trotzdem und bewirbt seine Tools; jeder Aufruf gibt dann einen klaren config_error zurück, der dich auffordert, den Schlüssel zu setzen.

Konfiguration

Env-Variable

Erforderlich

Standard

Hinweise

APPSGOLEM_API_KEY

ja

–

Dein ag_live_…-Schlüssel.

APPSGOLEM_API_BASE

nein

https://appsgolem.com

Überschreiben für Self-Hosting / Entwicklung.

Preisgestaltung

1 erstellter Clip = 1 Guthaben. 2160p (4K) = 4 Guthaben pro Clip – außer audio_only, das bei 1 bleibt. Eine Quelle, die länger als 2 h ist, addiert +1 einmal pro Auftrag, aber nur, wenn ihre Dauer bekannt ist (der Aufschlag entfällt, wenn die Analyse die Dauer nicht ermitteln kann). Ein Stapel/Zusammenschnitt von N Clips kostet N pro Clip. Fehlgeschlagene Schnitte werden nie berechnet.


Tools

Der Server stellt drei Tools bereit. Ein Aufruf, der die MCP-Eingabevalidierung besteht, gibt ein strukturiertes Ergebnis zurück – das eigene JSON der API bei Erfolg oder { "error": … } bei einem Handler-/API-Fehler – und löst niemals einen Fehler auf Protokollebene aus, sodass ein Agent immer ein brauchbares Objekt erhält. (Ungültige Tool-Argumente werden vom MCP-SDK vor dem Handler abgelehnt, als reines isError-Ergebnis.)

1. cut_youtube_video

Schneidet einen Clip (oder einen Stapel von Clips) aus einem YouTube-Video. Standardmäßig wartet es, bis der Clip erstellt ist, und gibt seinen Status zurück (einschließlich download_url, sobald ein Download-Token verfügbar ist); setze wait: false, um sofort zu senden und das aktuelle Ergebnis zu erhalten (sein Zustand ist nach dem Senden normalerweise queued).

Parameter

Name

Typ

Standard

Hinweise

url

string

–

Erforderlich. YouTube-URL (watch / share / youtu.be). Playlists werden abgelehnt.

start

string

–

Clip-Start: "SS", "MM:SS" oder "HH:MM:SS" (≤ 300 h). Weglassen, wenn clips verwendet wird.

end

string

–

Clip-Ende, gleiche Formate (≤ 300 h). Weglassen, wenn clips verwendet wird.

resolution

string

1080p

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

mode

string

video

video · audio_only · both · nosound · short · gif · frames (siehe Modi unten).

audio_format

string

–

Das Ausgabeformat für audio_only: mp3 · m4a · wav · flac (Server-Standard ist mp3). both erzeugt immer MP3.

bitrate

string

–

Bitrate für verlustbehaftetes Audio 320 · 256 · 192 · 128 (Standard 320): MP3/M4A bei audio_only, MP3 bei both; wird bei WAV/FLAC ignoriert.

fast

boolean

false

Stream-Kopie (≈10× schneller, an Keyframes ausgerichtet); nur video / nosound / both. Nicht kombinierbar mit einer speed ≠ 1× – wenn beides gesetzt ist, gewinnt fast und speed wird auf 1.0 erzwungen.

speed

number

1.0

Wiedergabegeschwindigkeit 0.5 · 1 · 1.25 · 1.5 · 2. Nur video / nosound / both / audio_only.

interval_ms

integer

2000

Abtastintervall für frames: 100 · 500 · 1000 · 2000 · 5000 · 10000 (bei Nicht-Kontaktbogen-Extraktion gedeckelt auf 1.800 JPGs insgesamt über alle Clips).

burn_ts

boolean

false

frames: brennt den Quell-Zeitstempel auf jedes JPG.

sheet

boolean

false

frames: gibt ein einzelnes Kontaktbogen-JPG zurück (2–80 Frames, einzelner Clip). Deaktiviert burn_ts.

clips

array

–

Ein Array aus 1–10 { start, end }-Bereichen statt start/end (ein leeres Array wird abgelehnt).

stitch

boolean

false

Bei 2+ clips: fügt sie zu einer Datei zusammen (sonst ein ZIP der Clips); wird bei einem einzelnen Clip ignoriert. Nur video / audio_only / both / short / nosound.

idempotency_key

string

–

Ein stabiler Schlüssel (≤ 200 Zeichen), damit ein wiederholter Request denselben Auftrag wiederverwendet (wird als Idempotency-Key-Header gesendet).

wait

boolean

true

Wartet, bis fertig, bis zum timeout_seconds-Polling-Deadline.

timeout_seconds

integer

300

Polling-Deadline in Sekunden (Standard 300). Sie begrenzt nur das Polling – die ursprüngliche Übermittlung und ein Statusabruf (jeweils bis zu 30 s Request-Timeout) können die Gesamtzeit verlängern.

Rückgabe (wait: true, Standard) – der erzeugte Auftragsstatus. download_url ist vorhanden, sobald ein Download-Token verfügbar ist; falls noch nicht, erneut abfragen:

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

Rückgabe (wait: false) – der Auftrag sofort, mit seinem aktuellen Zustand (nach dem Senden normalerweise queued) und noch ohne download_url; frage get_cut_status mit der id ab (oder rufe poll_url auf):

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

Wenn das Warten abläuft, bevor der Clip fertig ist, enthält das Ergebnis "still_processing": true und die Auftrags-id – frage get_cut_status mit dieser id ab. Wenn der Auftrag einen endgültigen Fehler erreicht, lautet das Ergebnis { "error": "cut_failed", "state": "failed" | "refunded", "id": … } (und es wird kein Guthaben berechnet).

2. get_cut_status

Überprüft einen Schneideauftrag anhand seiner id. Verwende es, um einen Auftrag abzufragen, der mit cut_youtube_video(wait=false) gestartet wurde oder dessen Zeit abgelaufen ist.

Name

Typ

Hinweise

job_id

string

Erforderlich. Die Auftrags-id (eine UUID), die von cut_youtube_video zurückgegeben wurde.

Rückgabe – der Zustand des Auftrags; sobald er erstellt/geliefert ist, enthält er außerdem eine download_url, wenn ein Download-Token verfügbar ist (sonst erneut abfragen):

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

Zustände durchlaufen accepted → queued → produced → delivered oder bei einem Fehler failed → refunded.

3. get_account_balance

Gibt das ausgabefähige Guthaben des API-Kontos und das aktuelle Stundenlimit zurück. Keine Parameter.

Rückgabe

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

Modi

mode

Ausgabe

Wichtige Optionen

video

Videodatei ohne Wasserzeichen – normalerweise MP4; fast erhält den Quellcontainer (z. B. WebM bei hoher Auflösung)

resolution, fast, speed

audio_only

mp3 / m4a / wav / flac

audio_format, bitrate, speed

both

Video + MP3 zusammen, als ZIP (fast kann den Quellcontainer des Videos erhalten)

bitrate, fast, speed

nosound

Video ohne Tonspur – normalerweise MP4; fast erhält den Quellcontainer

resolution, fast, speed

short

Hochformat 9:16 – KI-Smart-Crop, wenn anwendbar, sonst ein Letterbox-Blur-Fallback, dessen genaues Seitenverhältnis von der Quelle abhängt (Shorts / Reels / TikTok)

resolution

gif

Animiertes GIF (≤ 5 min; kein Multi-Clip)

resolution

frames

JPG-Standbilder

interval_ms, burn_ts, sheet


Beispielaufforderungen

Da der Agent die Parameter aus deiner Anfrage auswählt, steuerst du ihn in natürlicher Sprache:

  • „Schneide 0:30 bis 1:15 aus https://youtu.be/dQw4w9WgXcQ in 1080p." → cut_youtube_video(url, start="0:30", end="1:15")

  • „Hol mir den Ton dieses Videos von 2:00 bis 5:00 als MP3." → mode="audio_only", audio_format="mp3"

  • „Mach ein vertikales Short aus dem Highlight 10:00–10:45." → mode="short", start="10:00", end="10:45"

  • „Mach aus 0:05–0:12 ein GIF." → mode="gif"

  • „Extrahiere ein Kontaktbogen mit Frames alle 5 Sekunden von 1:00 bis 2:00." → mode="frames", interval_ms=5000, sheet=true

  • „Füge 0:10–0:20 und 1:00–1:10 zu einem Clip zusammen." → clips=[{start:"0:10",end:"0:20"},{start:"1:00",end:"1:10"}], stitch=true

  • „Mach einen schnellen Stream-Copy-Schnitt von 0:00–0:30." → fast=true

  • „Wie viele API-Guthaben habe ich noch?" → get_account_balance()


Ergebnis- und Fehlerformen

Jedes Ergebnis eines Handlers ist ein einfaches Objekt (MCP-Argumentvalidierungsfehler sind die Ausnahme – siehe Hinweis zu den Tools oben). Bei einem Fehler enthält das Objekt einen error-Code (der Tool-Aufruf gelingt trotzdem):

error

Wann

config_error

APPSGOLEM_API_KEY fehlt.

invalid_api_key

Der Schlüssel wurde abgelehnt (401).

invalid_job_id

job_id ist keine UUID.

not_found

Kein solcher Auftrag für dieses Konto (404).

cut_failed

Der Auftrag hat den Status failed/refunded erreicht (wurde nie abgerechnet).

network_error

Verbindungs-/Transportfehler oder Anforderungs-Timeout.

bad_request

Die konfigurierte API-Basis/der konfigurierte API-Pfad konnte nicht zu einer URL zusammengesetzt werden.

http_error

Eine ≥400-Antwort, deren JSON-Body kein { error: … }-Objekt ist (trägt status).

bad_response

Eine Erfolgsantwort, deren Body kein JSON-Objekt ist (Array/Skalar/null), oder — mit wait: true — eine Cut-Übermittlung, die ohne eine verwendbare Job-id zurückkam.

API-Fehler (z. B. Validierungs-400, Rate-Limit-429) werden als eigener Fehler-Body der API plus ein status-Feld zurückgegeben; eine 429 enthält außerdem retry_after (Sekunden), wenn der Server Retry-After sendet, damit ein Agent eine Pause einlegen kann.

Eine relative download_url (die API gibt einen Pfad zurück) wird nur dann zu einer vollständigen URL gegen die konfigurierte API-Basis aufgelöst, wenn sie auf dieser Origin bleibt; bereits absolute URLs und Verweise außerhalb der Origin bleiben unverändert.


Entwicklung

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)

Veröffentlichung

npm publish (aus diesem Verzeichnis) macht npx appsgolem-mcp für alle funktionsfähig. Das prepare-Skript erstellt dist/ automatisch bei Installation/Veröffentlichung.

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