Skip to main content
Glama

appsgolem-mcp (Node / TypeScript)

AppsGolem YouTube 커터 API를 위한 MCP 서버입니다. AI 에이전트(Claude Desktop, Claude Code, Cursor 등)가 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 — 한 줄 명령:

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이 추가되며, 지속 시간이 알려진 경우에만 적용됩니다(프로브가 지속 시간을 확인할 수 없으면 추가 요금이 생략됨). N개 클립의 배치/스티치는 클립당 N 크레딧입니다. 실패한 컷은 청구되지 않습니다.


도구

서버는 세 가지 도구를 노출합니다. 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

integer

2000

frames 샘플링 간격: 100 · 500 · 1000 · 2000 · 5000 · 10000(시트가 아닌 추출은 모든 클립에서 총 1,800개 JPG로 제한됨).

burn_ts

boolean

false

frames: 각 JPG에 소스 타임스탬프를 새깁니다.

sheet

boolean

false

frames: 단일 접촉 시트 JPG(2–80프레임, 단일 클립)를 반환합니다. 설정 시 burn_ts가 비활성화됩니다.

clips

array

—

start/end 대신 사용하는 1–10개의 { start, end } 범위 배열(빈 배열은 거부됨).

stitch

boolean

false

2개 이상의 clips와 함께 사용 시 하나의 파일로 결합(그 외에는 클립 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, 기본값) — 생성된 작업 상태. 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

API 계정의 사용 가능한 크레딧 잔액과 현재 시간당 상한을 반환합니다. 매개변수 없음.

반환값

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

모드

mode

출력

주요 옵션

video

워터마크 없는 비디오 파일 — 일반적으로 MP4; fast는 소스 컨테이너를 유지합니다(예: 고해상도 WebM)

resolution, fast, speed

audio_only

mp3 / m4a / wav / flac

audio_format, bitrate, speed

both

비디오 + MP3를 함께 zip으로(fast는 비디오의 소스 컨테이너를 유지할 수 있음)

bitrate, fast, speed

nosound

오디오 트랙이 없는 비디오 — 일반적으로 MP4; fast는 소스 컨테이너를 유지합니다

resolution, fast, speed

short

세로 9:16 — 적용 가능 시 AI 스마트 크롭, 그 외에는 소스의 정확한 종횡비에 따라 달라지는 레터박스 블러 폴백(Shorts / Reels / TikTok)

resolution

gif

애니메이션 GIF(≤ 5분, 다중 클립 불가)

resolution

frames

JPG 스틸

interval_ms, burn_ts, sheet


예시 프롬프트

에이전트가 요청에서 매개변수를 선택하므로 일반 언어로 지시할 수 있습니다:

  • "https://youtu.be/dQw4w9WgXcQ에서 0:30부터 1:15까지 1080p로 잘라줘." → cut_youtube_video(url, start="0:30", end="1:15")

  • "그 동영상의 오디오를 2:00부터 5:00까지 mp3로 추출해줘." → mode="audio_only", audio_format="mp3"

  • "10:00–10:45 하이라이트로 세로 쇼츠를 만들어줘." → mode="short", start="10:00", end="10:45"

  • "0:05–0:12를 GIF로 바꿔줘." → mode="gif"

  • "1:00부터 2:00까지 5초 간격으로 프레임 접촉 시트를 추출해줘." → mode="frames", interval_ms=5000, sheet=true

  • "0:10–0:20과 1:00–1:10을 하나의 클립으로 이어줘." → clips=[{start:"0:10",end:"0:20"},{start:"1:00",end:"1:10"}], stitch=true

  • "0:00–0:30을 빠른 스트림 복사로 잘라줘." → fast=true

  • "API 크레딧이 얼마나 남았어?" → get_account_balance()


결과 및 오류 형태

핸들러의 모든 결과는 일반 객체입니다(MCP 인수 검증 실패는 예외 — 위 도구 참고 사항 참조). 실패 시 객체에는 error 코드가 있습니다(도구 호출 자체는 성공합니다):

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 base/path를 URL로 구성할 수 없습니다.

http_error

JSON 본문이 { error: … } 객체가 아닌 ≥400 응답(status 포함).

bad_response

본문이 JSON 객체(배열/스칼라/null)가 아닌 성공 응답 또는 — wait: true인 경우 — 유용한 작업 id 없이 반환된 컷 제출.

API 수준 오류(예: 검증 400, 속도 제한 429)는 API 자체 오류 본문에 status 필드를 더해 반환됩니다. 서버가 Retry-After를 보내면 429에는 retry_after(초)도 포함되므로 에이전트가 백오프할 수 있습니다.

상대 download_url(API가 경로를 반환)은 해당 오리진에 유지되는 경우에만 구성된 API base를 기준으로 전체 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

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers