Skip to main content
Glama

appsgolem-mcp (Node / TypeScript)

AppsGolem の YouTube カッター API 用の MCP サーバーです。AI エージェント(Claude Desktop、Claude Code、Cursor、…)が、Web カッターが対応している任意の形式で YouTube 動画からクリップを切り出し、直接ダウンロードできる URL を取得できるようにします。REST のロジックは、依存が少ない小さなクライアント(src/client.ts)にあり、src/server.ts はその上に重ねる薄い MCP ツール層です。

必要条件

  • Node.js = 18(グローバルの fetch を使用)。

  • AppsGolem の API キー(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 — コマンド1つで追加します:

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

サーバーは stdio 上で MCP(それらのクライアントが使うトランスポート)を介して通信します。APPSGOLEM_API_KEY が未設定でも起動時には問題になりません。サーバーは起動してツールを公開し続けます。各呼び出しは、キーを設定するよう知らせる明確な config_error を返します。

設定

環境変数

必須

デフォルト

備考

APPSGOLEM_API_KEY

必須

—

あなたの ag_live_… キー。

APPSGOLEM_API_BASE

任意

https://appsgolem.com

セルフホスト / 開発用の上書き。

料金発生

クリップ1本の生成 = 1クレジット。2160p(4K)= クリップごとに4クレジット — ただし audio_only は 1 のままです。2時間を超えるソースはジョブごとに +1 が1回加算されます。ただし、ソースの長さが判明している場合に限ります(プローブで判定できないときは追加料金はスキップされます)。N クリップのバッチ/ステッチは、クリップごとに N ずつかかります。失敗したジョブは一切課金されません。


ツール

サーバーは 3つ のツールを公開します。MCP 入力スキーマの検証を通過した呼び出しは、構造化された結果を返します。成功時は API 自体の JSON、ハンドラ/API の障害時は { "error": … } です。プロトコルレベルのエラーを出すことはないので、エージェントは常に有効なオブジェクトを受け取れます。(無効なツール引数は、ハンドラが実行される前に、MCP SDK によってテキストのみの isError 結果として拒否されます。)

1. cut_youtube_video

YouTube 動画からクリップ(または複数のクリップのバッチ)を切り出します。デフォルトではクリップの生成が完了するまで 待機 して、そのステータス(ダウンロードトークンの準備ができていれば download_url を含む)を返します。wait: false を設定すると、送信してすぐに現在のジョブを返します(その状態は通常、送信後に queued になります)。

パラメータ

名前

型

デフォルト

説明

url

string

—

必須。 YouTube の watch / share / youtu.be URL。プレイリストは拒否されます。

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

—

非可逆オーディオのビットレート。320 · 256 · 192 · 128(デフォルト 320)。audio_only の MP3/M4A、both の MP3 に適用。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

number

1000

frames のサンプリング間隔。100 · 500 · 1000 · 2000 · 5000 · 10000(シート以外の書き出しは、全クリップ合計で 1,800 JPG 上限)。

burn_ts

boolean

false

frames:各 JPG にソースのタイムスタンプを焼き付けます。

sheet

boolean

false

frames:1枚のコンタクトシート JPG(2〜80コマ、単一クリップ)を返します。設定すると burn_ts は無効になります。

clips

array

—

start / end の代わりに使う、1〜10 個の { start, end } 範囲の配列。空配列は拒否されます。

stitch

boolean

false

2 以上の clips がある場合、それらを1ファイルに結合します(そうでない場合はzip)。単一クリップでは無視されます。video / audio_only / both / short / nosound。

idempotency_key

string

—

安定したキー(≤ 200文字)。再試行されるリクエストが同じジョブを再利用できるようにします(Idempotency-Key ヘッダーとして送信)。

wait

boolean

true

準備ができるまでポーリングします。上限は timeout_seconds のポーリング期限です。

timeout_seconds

integer

300

ポーリング期限(秒)。デフォルト 300。制約されるのはポーリングだけです。初期送信と1回の状態確認(各リクエストは最大 30 秒)が実時間を伸ばすことがあります。

戻り値(wait: true(デフォルt))** — 生成されたジョブのステータス。ダウンロード トークンが準備できると 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 はまだありません。id を指定して get_cut_status をポーリング(または 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 が含まれます。その id で get_cut_status をポーリングしてください。ジョブが終端の失敗に達した場合は、結果は { "error": "cut_failed", "state": "failed" | "refunded", "id": … }(クレジットは課金されません)となります。

2. get_cut_status

カットジョブの状態を id で確認します。cut_youtube_video(wait=false) で開始したジョブや、タイムアウトしたジョブのポーリングに使います。

名前

型

説明

job_id

string

必須。 cut_youtube_video が返すジョブ id(UUID)。

戻り値 — ジョブの状態。生成/配信が完了すると、ダウンロード トークンが利用可能な場合は download_url も含まれます(それ以外は再度ポーリングしてください):

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

状態は accepted → queued → produced → delivered と進み、エラー時は failed → refunded と進みます。

3. get_account_balance

アカウントの利用可能なクレジット残高と、現在の1時間あたりの上限を返します。パラメータはありません。

戻り値

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

モード

mode

出力

主なオプション

video

透かしなしのビデオファイル — 通常は MP4。fast はソースコンテナを保持します(例:高解像度で WebM)

resolution, fast, speed

audio_only

mp3 / m4a / wav / flac

audio_format, bitrate, speed

both

ビデオ + 単一の zip 形式の MP3(fast はビデオのソースコンテナを保持する場合があります)

bitrate, fast, speed

nosound

音声トラックのないビデオ — 通常は MP4。fast はソースコンテナを保持します

resolution, fast, speed

short

ポートレート 9:16 — 可能な場合は AI スマートクロップ、それ以外はレターボックス / ぼかしの代替。完全なアスペクト比はソースに依存します(Shorts / Reels / TikTok)

resolution

gif

アニメーション GIF GXP7(≤ 5分、マルチクリップ不可)

resolution

frames

JPG 静止画(sheet を使用すると単一シート)

interval_ms, burn_ts, sheet


プロンプト例

エージェントはあなたのリクエストからパラメータを選ぶので、自然な言葉で指示できます:

  • "Cut 0:30 to 1:15 from https://youtu.be/dQw4w9WgXcQ in 1080p." → cut_youtube_video(url, start="0:30", end="1:15")

  • "Grab the audio of that video from 2:00 to 5:00 as an mp3." → mode="audio", audio_format="mp3"

  • "Make a vertical short of the 10:00–10:45 highlight." → mode="short", start="10:00", end="10:45"

  • "Turn 0:05–0:12 into a GIF." → mode="gif"

  • "Extract a contact sheet of frames every 5 seconds from 1:00 to 2:00." → mode="frames", interval_ms=5000, sheet=true

  • "Stitch 0:10–0:20 and 1:00–1:10 into one clip." → clips=[{start:"0:10",end:"0:20"},{start:"1:00",end:"1:10"}], stitch=true

  • "Do a fast, stream-copy cut of 0:00–0:30 we." → "残りクレジットは、いくつ?" → 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

設定された API ベース/パスを URL に構築できませんでした。

http_error

JSON ボディが { error: … } オブジェクトではない ≥400 レスポンス (status を保持)。

bad_response

ボディが JSON オブジェクトではない成功レスポンス (配列/スカラー/null)、または — wait: true の場合 — 利用可能なジョブ id なしで返されたカット送信。

API レベルのエラー (例: バリデーション 400、レート制限 429) は、API 自身のエラーボディに加えて status フィールドを付けて返されます。429 には、サーバーが Retry-After を送信した場合に retry_after (秒) も含まれるため、エージェントはバックオフできます。

相対的な download_url (API がパスを返す) は、そのオリジン上に留まる場合にのみ、設定された API ベースに対して完全な URL に解決されます。すでに絶対 URL のものや、オリジン外の参照は変更されません。


開発

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.

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