appsgolem-mcp
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 を返します。
設定
環境変数 | 必須 | デフォルト | 備考 |
| 必須 | — | あなたの |
| 任意 |
| セルフホスト / 開発用の上書き。 |
料金発生
クリップ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 になります)。
パラメータ
名前 | 型 | デフォルト | 説明 |
| string | — | 必須。 YouTube の watch / share / |
| string | — | クリップ開始。 |
| string | — | クリップ終了(同じ形式、≤ 300時間)。 |
| string |
|
|
| string |
|
|
| string | — |
|
| string | — | 非可逆オーディオのビットレート。 |
| boolean |
| ストリームコピー(約10倍高速、キーフレーム位置へ整列)。 |
| number |
| 再生速度。 |
| number |
|
|
| boolean |
|
|
| boolean |
|
|
| array | — |
|
| boolean |
| 2 以上の |
| string | — | 安定したキー(≤ 200文字)。再試行されるリクエストが同じジョブを再利用できるようにします( |
| boolean |
| 準備ができるまでポーリングします。上限は |
| integer |
| ポーリング期限(秒)。デフォルト 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) で開始したジョブや、タイムアウトしたジョブのポーリングに使います。
名前 | 型 | 説明 |
| string | 必須。 |
戻り値 — ジョブの状態。生成/配信が完了すると、ダウンロード トークンが利用可能な場合は 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 }モード
| 出力 | 主なオプション |
| 透かしなしのビデオファイル — 通常は MP4。 |
|
| mp3 / m4a / wav / flac |
|
| ビデオ + 単一の zip 形式の MP3( |
|
| 音声トラックのないビデオ — 通常は MP4。 |
|
| ポートレート 9:16 — 可能な場合は AI スマートクロップ、それ以外はレターボックス / ぼかしの代替。完全なアスペクト比はソースに依存します(Shorts / Reels / TikTok) |
|
| アニメーション GIF GXP7(≤ 5分、マルチクリップ不可) |
|
| JPG 静止画( |
|
プロンプト例
エージェントはあなたのリクエストからパラメータを選ぶので、自然な言葉で指示できます:
"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 コードを持ちます(ツール呼び出し自体は成功します)。
| 発生条件 |
|
|
| キーが拒否されました (401)。 |
|
|
| このアカウントにはそのようなジョブがありません (404)。 |
| ジョブが |
| 接続/転送の失敗、またはリクエストのタイムアウト。 |
| 設定された API ベース/パスを URL に構築できませんでした。 |
| JSON ボディが |
| ボディが JSON オブジェクトではない成功レスポンス (配列/スカラー/null)、または — |
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 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 for AI agents: transcripts, comments, video stats, channel monitor, Shorts captions.
YouTube transcripts, search, channels, playlists and bulk transcript jobs for AI agents. 14 tools.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to fetch YouTube video transcripts with precise timestamps, multi-language support, and time-range filtering.31MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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.927 npm61Apache 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.337 npmMIT