Skip to main content
Glama
shell-as-mcp

shell-as-mcp

by meomeo-dev

🌐 English | δΈ­ζ–‡

shell-as-mcp

TypeScript Shell-as-MCP Server: maps shell commands to standard MCP tools via single-file YAML specs.


1) YAML Spec Design

Each YAML file defines one MCP tool. The root must contain apiVersion, tool, and execution.

apiVersion: v1
tool:
  name: <server>__<action>        # snake_case, e.g. brew__install
  description: |-
    /**
     * One-line description of the tool's purpose (TSDoc format, sole description field).
     * @param param_name Parameter description
     */
  input:
    properties:
      param_name:
        type: string              # string | number | integer | boolean
        description: "..."
    required: [param_name]
  output:
    type: object
    properties:
      status:            { type: string }
      exit_code:         { type: number }
      stdout:            { type: string }
      stderr:            { type: string }
      command:           { type: string }
      execution_time_ms: { type: number }
execution:
  shell:
    mode: direct                  # direct | shell
    name: bash                    # optional: bash | zsh | sh | pwsh | cmd
    path: /usr/bin/bash           # optional, takes precedence over name
    args: ["-lc"]                 # optional, defaults used if omitted
  env:
    static:
      KEY: VALUE
    fromParams:
      TOOL_ENV_KEY: inputParamName  # UPPER_SNAKE_CASE; add TOOL_ prefix if unsure
    fromRuntime:
      TARGET_ENV: SOURCE_ENV        # maps from server runtime env; supports priority lists
      TOOL_OUTPUT_DIR: [YTDLP_OUTPUT_DIR, SHELL_AS_MCP_OUTPUT_DIR]
  compatibility:
    targets:
      - os: macos
        kernel: darwin
        arch: arm64
        support: tested            # optional: tested | declared
        notes: Apple Silicon only validated target
  workingDirectory: /tmp/work
  timeoutMs: 30000
  taskMode: sync                  # sync (default, returns result synchronously) | async (background task, returns taskId immediately)
  maxOutputBytes: 1048576
  # Script mode (recommended: always use this in bundles)
  script:
    path: ./scripts/<tool_name>.sh  # relative to the YAML file's directory
    interpreter: bash
  # Command mode (only for a single executable + static args; forbid && || ; | > < in args)
  # command:
  #   executable: ffmpeg
  #   args: ["-version"]

Key constraints:

  • tool.name format is <server>__<action>, all lowercase snake_case

  • tool.description must be a TSDoc /** */ block comment

  • execution.env.fromParams env var names use UPPER_SNAKE_CASE; add TOOL_ prefix when clashing with reserved names (PATH, HOME, USER, etc.)

  • execution.compatibility is optional compatibility metadata; if present, targets must be a non-empty array and each target's os, kernel, arch must be non-empty strings

  • targets[].support is optional and only allows tested or declared; targets[].notes is optional and must be a string

  • If a target is marked support: tested, a corresponding per-target smoke test must exist under the bundle's scripts/: {prefix}__smoke_test__{kernel}_{arch}.sh (e.g. brew__smoke_test__darwin_arm64.sh)

  • execution.command is forbidden when args contain shell operators (&&, ||, ;, |, >, <); multi-step logic must use execution.script

  • Each YAML defines exactly one tool

  • execution.env.fromRuntime supports a string array, resolved left-to-right with short-circuit; ideal for expressing group-level to global-level fallback chains

  • execution.taskMode controls execution mode: sync (default, returns result synchronously) or async (background task, returns taskId immediately; query status via Task management tools)

1.1 Compatibility Metadata

execution.compatibility.targets declares "known runtime targets", not a "hard platform gate".

  • Declare each target as a complete tuple to avoid generating incorrect cartesian products by splitting os, kernel, arch into separate lists.

  • support: tested means the target has actual validation evidence; omitting it or using declared means the target is claimed to work, but the repository does not use this field as a runtime enforcement condition.

  • The evidence for support: tested is a per-target smoke test script: {prefix}__smoke_test__{kernel}_{arch}.sh; lint verifies its existence.

  • The current loader and lint validate the field structure, but the server startup and tool exposure logic do not perform platform filtering based on this field.

1.2 Health Check Contract

The __healthz tool's responsibility is dependency availability probing, not business execution.

  • Goal: quickly determine whether the key runtime dependencies of a command bundle are present and callable.

  • Output semantics: status=success means dependencies are available; status=error means a dependency is missing or not callable.

  • Failure boundary: a healthz failure only indicates that the bundle's runtime requirements are not met in the current environment; it must not masquerade as success.

  • Design requirement: healthz must stay lightweight and idempotent, with no side effects.

1.3 Zero-Parameter Tool Rule

For zero-parameter tools (e.g. healthz), the YAML input contract must satisfy:

  • tool.input must exist and be a mapping (object).

  • tool.input.properties must exist and be a mapping; empty object is allowed.

  • tool.input.required should be an empty list for zero-parameter tools.

  • Introducing dummy parameters just to "pass validation" is not allowed.

Lint alignment rules:

  • Lint validates the existence and type of tool.input.properties, no longer enforcing non-empty.

  • This ensures zero-parameter tools are expressed legally and consistently with their runtime behavior.

For the full spec, see shell_as_mcp_defs/runprompt__generate_artifact/prompts/type-specs/shell-as-mcp-yaml.spec.md.

1.4 __mcp_response_mode Parameter

Every tool has an implicitly injected optional parameter __mcp_response_mode:

Value

Description

content (default)

Returns result via the MCP content field

structuredContent

Returns result via the MCP structuredContent field

Typically you do not need to pass this explicitly; the default content mode is sufficient.


Related MCP server: mcp-this

2) Developing shell_as_mcp_defs

Each subdirectory under shell_as_mcp_defs/ is a command bundle with the following layout:

shell_as_mcp_defs/<server>/
  spec_yaml/          # one YAML definition file per tool
  scripts/            # one .sh script per tool (referenced by execution.script.path in the YAML)
  prompts/            # optional: runprompt prompt templates

Manual development workflow:

  1. Create <server>__<action>.yaml under spec_yaml/, following the Β§1 spec

  2. Create the matching .sh under scripts/, reading params via $TOOL_* env vars

  3. Run bash scripts/lint/lint_all.sh to validate

Generating via runprompt__generate_artifact:

⚠️ Work in Progress (WIP): The auto-generation feature of runprompt__generate_artifact is still under development and not yet stable. The spec documents under type-specs/ can be used directly as a reference for manual development, but relying on this tool to auto-generate bundles in production is not recommended.

runprompt__generate_artifact lets an LLM generate a complete bundle (YAML + scripts + optional prompts) in one shot, with the output automatically written to SHELL_AS_MCP_SPEC_DIR/<server_name>/.

Guidance for LLMs developing a new bundle (AI prompt)

When developing a new shell_as_mcp_defs bundle:

  1. Full spec is in shell_as_mcp_defs/runprompt__generate_artifact/prompts/type-specs/:

    • shell-as-mcp-yaml.spec.md β€” YAML structure and forbidden patterns

    • script.spec.md β€” corresponding shell script spec

    • runprompt-prompt.spec.md β€” runprompt prompt spec

  2. Reference existing bundle examples: brew/, ytdlp/, host_info/, ffmpeg/

  3. All tool input params must be mapped to UPPER_SNAKE_CASE env vars via execution.env.fromParams with TOOL_ prefix; scripts only read $TOOL_*, never $1

  4. Validate params early in scripts (fail fast); sensitive operations must be re-authorized inside the script and must not rely on the caller for authorization

  5. execution.command is only for single-line static commands; multi-step logic must always use execution.script


3) Built-in Tools

All bundles are under shell_as_mcp_defs/ and loaded from SHELL_AS_MCP_SPEC_DIR at startup.

3.1 host_info

Tool

Description

host_info__healthz

Probes whether host_info bundle runtime dependencies are available

host_info__get_host_context

Collects host system context (OS, locale, timezone, hardware, ~35 dev tool versions); ideal as the first call before code execution tasks

Parameters:

Parameter

Type

Required

Description

include_hardware

boolean

No

Whether to include CPU count and memory size; default true

filter_tools

string

No

Comma-separated tool names (e.g. python3,node); empty = check all

output_format

string

No

pretty (default) or compact


3.2 ffmpeg

Tool

Description

Required Params

Optional Params

ffmpeg__healthz

Probes whether ffmpeg bundle runtime dependencies (ffmpeg/ffprobe) are available

β€”

β€”

ffmpeg__process_video_for_llm

Video preprocessing (trim/scale/fps/speed/strip audio/watermark)

input_path, output_path

start_time, end_time, max_resolution, fps, speed_factor, strip_audio, watermark_path

ffmpeg__process_audio_for_stt

Audio preprocessing (segment/resample/mono/silence removal)

input_path, output_path

start_time, end_time, sample_rate, channels, remove_silence, audio_format

ffmpeg__extract_frames_for_vision

Frame extraction for vision (low fps or keyframes)

input_path

output_dir, start_time, end_time, fps, keyframes_only, max_resolution

ffmpeg__split_video

Split one video into multiple segments at specified timestamps

input_path, split_points

output_dir, output_prefix, reencode

ffmpeg__create_video_summary

Montage summary video (multi-input sampling and concatenation)

input_paths, output_path

interval_sec, clip_duration_sec, merge_audio

3.2.1 ffmpeg Output Directory Defaults

Currently applies to ffmpeg__extract_frames_for_vision and ffmpeg__split_video.

Priority order:

  1. Explicit parameter output_dir

  2. Group-level env var FFMPEG_OUTPUT_DIR

  3. Global env var SHELL_AS_MCP_OUTPUT_DIR

The tool's "directory output" contract remains unchanged; this only allows the default directory to be sourced from the runtime environment when no explicit parameter is passed.


3.3 brew

⚠️ brew__install / brew__uninstall / brew__upgrade require confirm_action=true to authorize execution; the script will also prompt a native macOS authorization dialog.

Tool

Description

Required Params

Optional Params

brew__healthz

Probes whether brew bundle runtime dependencies (Homebrew) are available

β€”

β€”

brew__info

Query formula/cask details (version, dependencies, homepage)

package_name

cask

brew__search

Search packages

query

include_casks

brew__list_installed

List installed packages

β€”

cask_only, formula_only

brew__install

Install a formula/cask

package_name, confirm_action

cask

brew__uninstall

Uninstall a formula/cask

package_name, confirm_action

cask, force

brew__upgrade

Upgrade a formula/cask

package_name, confirm_action

cask


3.4 ytdlp

The cookies parameter accepts a path to a Netscape-format cookies file. You can also run ytdlp__setup_cookies first to encrypt and store cookies; subsequent tools will automatically fall back to these stored cookies when cookies is not specified.

Tool

Description

Required Params

Optional Params

ytdlp__healthz

Probes whether ytdlp bundle runtime dependencies (yt-dlp) are available

β€”

β€”

ytdlp__setup_cookies

Guides macOS users through exporting cookies via a browser extension and encrypts/saves them (macOS only)

β€”

overwrite

ytdlp__download_video

Download video (supports resolution selection and time-range clipping)

url

resolution, startTime, endTime, output_dir, cookies, proxy

ytdlp__download_audio

Download audio

url

output_dir, cookies, proxy

ytdlp__download_transcript

Download subtitle text content

url

language, cookies, proxy

ytdlp__download_video_subtitles

Download subtitle files

url

language, output_dir, cookies, proxy

ytdlp__list_subtitle_languages

List available subtitle languages for a video

url

cookies, proxy

ytdlp__get_video_metadata

Retrieve full video metadata as JSON

url

fields, cookies, proxy

ytdlp__get_video_metadata_summary

Retrieve video metadata summary (title/duration/channel/etc.)

url

cookies, proxy

ytdlp__get_video_comments

Retrieve comment list

url

maxComments, sortOrder, cookies, proxy

ytdlp__get_video_comments_summary

Retrieve comment summary

url

maxComments, cookies, proxy

ytdlp__search_videos

Search videos

query

maxResults, offset, response_format, uploadDateFilter, cookies, proxy

3.4.1 Output Directory Priority

Applies only to ytdlp download tools: ytdlp__download_video, ytdlp__download_audio, ytdlp__download_video_subtitles.

Priority order:

  1. Explicit parameter output_dir

  2. Group-level env var YTDLP_OUTPUT_DIR

  3. Global env var SHELL_AS_MCP_OUTPUT_DIR

  4. Historical default ~/Downloads

Scripts uniformly read TOOL_OUTPUT_DIR; the bundle handles the mapping via execution.env.fromRuntime and execution.env.fromParams. This does not change the existing semantics of output_path / output_dir; it merely adds default value sources for download tools.


3.5 shell

Tool

Description

Required Params

Optional Params

shell__healthz

Probes whether shell bundle base runtime (bash) is available

β€”

β€”

shell__run_script_echo

Runs a local script and echo-prefixes the input value (for development debugging)

value

β€”


3.6 advanced_substation_alpha_ass

Advanced SubStation Alpha (ASS) subtitle format toolkit.

Tool

Description

Required Params

Optional Params

ass__healthz

Probes whether ASS bundle runtime dependencies (ffmpeg) are available

β€”

β€”

ass__create_template

Creates a new ASS v4.00+ subtitle template file (with Default/Title/Note styles)

output_path

output_dir, title, play_res_x, play_res_y, overwrite

ass__get_spec

Returns the ASS format specification document (read-only reference tool)

β€”

section

ass__lint

Validates/lints an ASS subtitle file (16 structural rules)

ass_file_path

strict

ass__smoke_test

Renders a test video to verify ASS subtitle renderability (requires ffmpeg)

ass_file_path, output_path

output_dir, duration_sec, resolution, background_color

3.6.1 ASS Output Directory Defaults

Applies to ass__create_template and ass__smoke_test when output_path is a relative path.

Priority order:

  1. Explicit parameter output_dir

  2. Group-level env var ASS_OUTPUT_DIR

  3. Global env var SHELL_AS_MCP_OUTPUT_DIR


3.7 runprompt__generate_artifact

⚠️ Work in Progress (WIP): The auto-generation feature is still under development and not yet stable.

Tool

Description

Required Params

Optional Params

runprompt__healthz

Probes whether runprompt bundle runtime prerequisites (python3) are available

β€”

β€”

runprompt__generate_artifact

Uses runprompt + LLM to auto-generate a complete shell-as-mcp bundle under SHELL_AS_MCP_SPEC_DIR

artifact_type, requirements

server_name, tool_name, max_repair_rounds, run_tests, run_code_review, run_security_review


3.8 run_safe_command

⚠️ run_safe_command__execute and run_safe_command__pipeline both run without shell eval. execute accepts a single command + args in a validated working directory; pipeline accepts a JSON-structured sequence of pipe-connected stages, each validated against a safe command allowlist. On darwin/arm64, both use native Swift+WKWebView for pre-execution authorization and automatically fall back to OSA. All executions are written to a structured audit log.

Tool

Description

Required Params

Optional Params

run_safe_command__healthz

Probes whether run_safe_command runtime dependencies and platform capabilities are available

β€”

β€”

run_safe_command__execute

Executes a command without shell eval; records structured security and audit metadata

command, args_json, working_dir

β€”

run_safe_command__pipeline

Executes a safe shell pipeline from JSON-structured stage definitions; each stage is validated against a command allowlist (no shell eval); async β€” returns taskId immediately

stages_json, working_dir

β€”

run_safe_command__help

Shows usage and safety model for the run_safe_command bundle

β€”

topic

run_safe_command__audit_get

Reads recent execution audit records

β€”

limit, include_rotated, rotated_file_limit

run_safe_command__audit_rotate

Rotates the audit file and enforces retention

β€”

max_files


3.9 iwencai

iwencai__query2data_basic and iwencai__search_basic are bounded, read-only wrappers around the local iwencai CLI. They require IWENCAI_API_KEY in the runtime environment and never write output files.

Tool

Description

Required Params

Optional Params

iwencai__healthz

Checks whether the local iwencai CLI is available and whether IWENCAI_API_KEY is already configured

β€”

β€”

iwencai__query2data_basic

Runs a bounded natural-language query2data request for structured market data

query

limit, page, format

iwencai__search_basic

Runs a bounded search across supported channels: announcement, investor, news, report

query, channel

limit, format

iwencai__skillbook

Exports the built-in iwencai skillbook for local reference or LLM onboarding

β€”

format


4) Running

npm install
npm run build
npm start

4.1 Launch via GitHub npx -y (stdio)

npx -y github:meomeo-dev/shell-as-mcp --transport stdio

If you use the runprompt__generate_artifact tool, install runprompt separately:

# Using uv (recommended)
uv pip install git+https://github.com/chr15m/runprompt
# Using pip
pip install "git+https://github.com/chr15m/runprompt.git"

4.2 Startup Options & Environment Variables

Option

Env Var

Default

Description

--transport

SHELL_AS_MCP_TRANSPORT

stdio

stdio or streamable-http

--spec-dir

SHELL_AS_MCP_SPEC_DIR

./shell_as_mcp_defs

YAML spec directory (overlay)

--host

SHELL_AS_MCP_HTTP_HOST

127.0.0.1

HTTP listen address

--port

SHELL_AS_MCP_HTTP_PORT

3001

HTTP listen port

--http-path

SHELL_AS_MCP_HTTP_PATH

/mcp

HTTP path

--max-concurrent-tasks

SHELL_AS_MCP_MAX_CONCURRENT_TASKS

β€” (unlimited)

Max concurrent background async tasks

β€”

SHELL_AS_MCP_SERVER_NAME

shell-as-mcp

MCP server name

β€”

SHELL_AS_MCP_SERVER_VERSION

package.json version

MCP server version

4.3 Built-in Spec vs. Overlay Directory

The tools in the built-in shell_as_mcp_defs/ are always loaded directly from the package. SHELL_AS_MCP_SPEC_DIR is an overlay directory that additionally loads tools from it; tools with the same name as built-in ones are overridden by the user directory.

  • The default value is ./shell_as_mcp_defs (loaded only once when it matches the built-in path).


5) mcpServers Configuration

{
  "mcpServers": {
    "shell-as-mcp": {
      "command": "npx",
      "args": ["-y", "github:meomeo-dev/shell-as-mcp", "--transport", "stdio"],
      "env": {
        "SHELL_AS_MCP_SPEC_DIR": "/absolute/path/to/specs",
        "RUNPROMPT_MODEL": "openrouter/deepseek/deepseek-v3.2",
        "RUNPROMPT_BASE_URL": "https://openrouter.ai/api/v1",
        "RUNPROMPT_OPENROUTER_API_KEY": "sk-or-v1-xxxx",
        "https_proxy": "http://127.0.0.1:8890",
        "HTTPS_PROXY": "http://127.0.0.1:8890"
      }
    }
  }
}

5.2 streamable-http

{
  "mcpServers": {
    "shell-as-mcp-http": {
      "command": "npx",
      "args": [
        "-y", "github:meomeo-dev/shell-as-mcp",
        "--transport", "streamable-http",
        "--host", "127.0.0.1",
        "--port", "3001",
        "--http-path", "/mcp"
      ],
      "env": {
        "SHELL_AS_MCP_SPEC_DIR": "/absolute/path/to/specs",
        "SHELL_AS_MCP_SERVER_NAME": "shell-as-mcp-http"
      }
    }
  }
}

5.3 Available Environment Variables

All of the following env vars can be placed directly in mcpServers.<name>.env.

Server Startup

Env Var

Purpose

Default

SHELL_AS_MCP_TRANSPORT

Transport mode: stdio or streamable-http

stdio

SHELL_AS_MCP_SPEC_DIR

Overlay spec directory

./shell_as_mcp_defs

SHELL_AS_MCP_HTTP_HOST

HTTP listen address

127.0.0.1

SHELL_AS_MCP_HTTP_PORT

HTTP listen port

3001

SHELL_AS_MCP_HTTP_PATH

HTTP path

/mcp

SHELL_AS_MCP_SERVER_NAME

MCP server name

shell-as-mcp

SHELL_AS_MCP_SERVER_VERSION

MCP server version

package.json version

SHELL_AS_MCP_MAX_CONCURRENT_TASKS

Max concurrent background async tasks

β€” (unlimited)

Output Directory Defaults

Env Var

Purpose

Applicable Tools

SHELL_AS_MCP_OUTPUT_DIR

Global output directory fallback

ytdlp__download_video, ytdlp__download_audio, ytdlp__download_video_subtitles, ffmpeg__extract_frames_for_vision, ffmpeg__split_video, ass__create_template, ass__smoke_test

YTDLP_OUTPUT_DIR

ytdlp group-level output directory

ytdlp__download_video, ytdlp__download_audio, ytdlp__download_video_subtitles

FFMPEG_OUTPUT_DIR

ffmpeg group-level output directory

ffmpeg__extract_frames_for_vision, ffmpeg__split_video

ASS_OUTPUT_DIR

ASS group-level output directory

ass__create_template, ass__smoke_test

runprompt Generation

Env Var

Purpose

Fallback

RUNPROMPT_MODEL

LLM model name

MODEL

RUNPROMPT_BASE_URL

API Base URL

OPENAI_BASE_URL, OPENAI_API_BASE, BASE_URL

RUNPROMPT_OPENROUTER_API_KEY

API Key

OPENROUTER_API_KEY, API_KEY

RUNPROMPT_DEBUG_PROMPT

Print the full rendered prompt and enable verbose debug before the request

β€”

SHELL_AS_MCP_RUNPROMPT_DIAGNOSTIC

Output runprompt startup diagnostics

β€”

SHELL_AS_MCP_RUNPROMPT_TIMEOUT_SEC

Timeout in seconds for the runprompt Python layer

120

SHELL_AS_MCP_RUNPROMPT_TOOL_ROOT

Root directory for runprompt file tools

Rarely needs manual configuration

iwencai Query

Env Var

Purpose

Applicable Tools

IWENCAI_API_KEY

API key passed through to the local iwencai CLI for bounded read-only queries

iwencai__healthz, iwencai__query2data_basic, iwencai__search_basic

Network Proxy

Env Var

Purpose

https_proxy

Lowercase HTTPS proxy env var

HTTPS_PROXY

Uppercase HTTPS proxy env var

In short: if you just run the server normally, you typically only need SHELL_AS_MCP_SPEC_DIR; if you need file output, also add SHELL_AS_MCP_OUTPUT_DIR or the group-level directory vars; if you use runprompt__generate_artifact, also supply the RUNPROMPT_* vars.

runprompt__generate_artifact environment variables (⚠️ auto-generation is WIP):

Var

Description

Fallback

RUNPROMPT_MODEL

LLM model name

MODEL

RUNPROMPT_BASE_URL

API Base URL

OPENAI_BASE_URL, OPENAI_API_BASE, BASE_URL

RUNPROMPT_OPENROUTER_API_KEY

API Key

OPENROUTER_API_KEY, API_KEY

Debug tip: set RUNPROMPT_DEBUG_PROMPT=1 to print the full rendered prompt before the request and enable runprompt -v.


6) Testing & Lint

# All TypeScript tests (unit + contract + e2e)
npm test

# Run smoke tests (generic + current-target)
bash scripts/run_smoke_tests.sh

# Build + pack + strict protocol handshake smoke in one command
make regress-pack-smoke

# Lint (YAML spec + shellcheck + prompt format; full scan of shell_as_mcp_defs/)
bash scripts/lint/lint_all.sh

lint_all.sh auto-discovers and validates five categories:

  • spec_yaml/*.yaml β†’ validate_shell_as_mcp_yaml.sh (structure/fields/forbidden patterns)

  • scripts/*.sh β†’ validate_script.sh (shellcheck)

  • prompts/*.prompt (not starting with _) β†’ validate_runprompt_prompt.sh (frontmatter/schema)

  • spec_yaml/*.yaml (containing support: tested) β†’ validate_tested_has_smoke_test.sh (verifies the corresponding per-target smoke test exists)

  • SKILL.md β†’ validate_skill_md.sh (frontmatter and structure)

run_smoke_tests.sh first runs each bundle's generic smoke test (*__smoke_test.sh), then auto-discovers and runs the per-target smoke test matching the current platform (e.g. *__smoke_test__darwin_arm64.sh).

make regress-pack-smoke runs build, npm pack, starts the server in streamable-http mode from the tarball, and validates the strict handshake sequence: initialize, notifications/initialized, tools/list.

Single-file validation:

bash scripts/lint/validate_shell_as_mcp_yaml.sh shell_as_mcp_defs/brew/spec_yaml/brew__info.yaml
bash scripts/lint/validate_script.sh shell_as_mcp_defs/brew/scripts/brew__info.sh
bash scripts/lint/validate_tested_has_smoke_test.sh shell_as_mcp_defs/brew/spec_yaml/brew__info.yaml

6.1 Make Shortcuts

make build    # clean + compile TypeScript + copy runtime assets
make test     # equivalent to npm test (unit + e2e)
make lint     # equivalent to bash scripts/lint/lint_all.sh
make deps     # npm ci to install dependencies
make help     # show all available make targets

6.2 Docker

# Build image
make docker-build

# Run container (stdio mode)
make docker-run

# Enter container shell for debugging
make docker-shell

Acknowledgements

This project builds on top of the following excellent open-source projects:

  • @modelcontextprotocol/sdk β€” TypeScript MCP SDK providing standardized MCP server protocol implementation

  • runprompt β€” CLI LLM prompt runner powering the runprompt__generate_artifact bundle

  • dotprompt β€” Google's structured prompt format specification, influencing this project's prompt template design

License

MIT β€” see LICENSE for details.

Available Tools

49 tools
ass__create_templateA

Create a new ASS subtitle template file with Default, Title, and Note styles. @remarks Writes a valid ASS v4.00+ file with pre-configured styles for general subtitles, title overlays, and note text. Fails if the output file already exists unless overwrite=true. @param output_path Destination path for the generated .ass file. @param output_dir Optional output directory fallback for relative output_path. Falls back to ASS_OUTPUT_DIR or SHELL_AS_MCP_OUTPUT_DIR. @param title Script title embedded in [Script Info] section. Default: "Untitled". @param play_res_x Virtual canvas width in pixels. Default: 1920. @param play_res_y Virtual canvas height in pixels. Default: 1080. @param overwrite If true, overwrite the file when it already exists. Default: false. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: output_path (required), title, overwrite, output_dir, +3 more.

ass__get_specA

Returns the ASS (Advanced SubStation Alpha) subtitle format specification. @remarks Read-only reference tool. Returns structured spec content for the requested section. No external files or network access required; content is fully embedded in the script. @param section Which section of the ASS spec to return. Default "all". Allowed values: all | script_info | v4_styles | events | tags | colors | example @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: section, __mcp_response_mode.

ass__healthzA

Check whether the ASS tool bundle runtime dependencies are available. @remarks Validates ffmpeg presence and returns a small JSON health report. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

ass__lintA

Lint and validate an ASS (Advanced SubStation Alpha) subtitle file. @remarks Checks 16 structural rules including section headers, ScriptType, PlayRes fields, Format/Style/Dialogue line presence, time format validity, and color field format. Returns a JSON report with per-check results. In strict mode, also validates field counts per Dialogue (>=10) and Style (=23). @param ass_file_path Absolute or relative path to the .ass file to lint. @param strict When true, enables additional field-count checks (checks 15 & 16). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: ass_file_path (required), strict, __mcp_response_mode.

ass__smoke_testA

Render a short test video from an ASS subtitle file to verify renderability. @remarks Uses ffmpeg lavfi virtual color source to generate a background, then overlays the ASS subtitles via the subtitles filter (requires libass support in ffmpeg). Outputs a JSON summary on success or an error payload on failure. @param ass_file_path Path to the ASS subtitle file to render. @param output_path Path for the output MP4 video file. @param output_dir Optional output directory fallback for relative output_path. Falls back to ASS_OUTPUT_DIR or SHELL_AS_MCP_OUTPUT_DIR. @param duration_sec Duration of the test video in seconds (1-300). Default: 10. @param resolution Output video resolution in WxH format. Default: 1920x1080. @param background_color Background color for the test video (ffmpeg color name or hex). Default: black. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: output_path (required), ass_file_path (required), output_dir, resolution, +3 more.

builtin__bg_task_cancelB

Cancel a running background task. Sends SIGTERM followed by SIGKILL if needed.

Inputs: taskId (required).

builtin__bg_task_cleanupA

Remove completed, failed, or cancelled tasks from memory. Optionally specify maxAgeMs to only remove tasks older than the given milliseconds.

Inputs: maxAgeMs.

builtin__bg_task_getA

Get full details of a background task by taskId, including stdout/stderr output.

Inputs: taskId (required).

builtin__bg_task_listA

List all background tasks. Optionally filter by status.

Inputs: status.

ffmpeg__add_fadeA

Add fade-in and/or fade-out transitions to a video clip. @remarks At least one of fade_in_duration or fade_out_duration must be greater than zero. Audio fade is applied simultaneously when include_audio is true. Returns JSON in stdout with output_path and applied parameters. @param input_path Source video path. @param output_path Destination video path with fade transitions. @param fade_in_duration Fade-in duration in seconds. Default 0 (no fade in). @param fade_out_duration Fade-out duration in seconds. Default 0 (no fade out). @param fade_color Fade transition color: black or white. Default black. @param include_audio Whether to apply afade filter synchronously with the video fade. Default true. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), fade_color, include_audio, +3 more.

ffmpeg__apply_color_lutA

Apply a .cube format 3D color Look-Up Table (LUT) to a video for color grading. @remarks Uses the ffmpeg lut3d filter. Returns JSON in stdout with output_path and lut_path. @param input_path Source video path. @param lut_path Path to a .cube format LUT file. @param output_path Destination color-graded video path. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: lut_path (required), input_path (required), output_path (required), __mcp_response_mode.

ffmpeg__burn_subtitlesA

Hard-burn SRT or ASS subtitle file into a video using the ffmpeg subtitles filter. @remarks Consumes .ass files produced by the ass bundle (ass__create_template). Re-encodes the video track. Returns JSON in stdout with output_path and applied parameters. @param input_path Source video path. @param subtitle_path Subtitle file path (.srt or .ass). @param output_path Destination video path with burned-in subtitles. @param force_style Optional ASS/SSA style override string (for example Fontsize=24,PrimaryColour=&HFFFFFF&). Applies to both SRT and ASS inputs. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), subtitle_path (required), force_style, +1 more.

ffmpeg__concat_clipsA

Concatenate multiple video clips in sequence using the ffmpeg concat demuxer. @remarks input_paths accepts a comma or newline-separated list of clip paths. Returns JSON in stdout with output_path and clip_count. Use reencode=true when clips have different codecs or parameters. @param input_paths Comma or newline-separated list of clip file paths in playback order. @param output_path Destination video path. @param reencode Whether to re-encode during concat (required for clips with different codecs), default false. @param video_codec Video codec when re-encoding, default libx264. @param audio_codec Audio codec when re-encoding, default aac. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_paths (required), output_path (required), reencode, audio_codec, +2 more.

ffmpeg__create_video_summaryA

Create a montage-style summary clip from one or more videos. @remarks input_paths accepts one path or a comma/newline-separated list. Returns JSON in stdout with output_path and sampled clip_count. @param input_paths One path or a comma/newline-separated list of source video paths. @param output_path Destination summary video path. @param interval_sec Sampling interval in seconds, default 300. @param clip_duration_sec Duration of each sampled clip in seconds, default 2. @param merge_audio Whether to keep audio in sampled clips, default true. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_paths (required), output_path (required), merge_audio, interval_sec, +2 more.

ffmpeg__export_videoA

Transcode a video to a delivery-grade output with full codec and quality control. @remarks Supports H.264, H.265, and VP9. Use crf for quality-based encoding or bitrate for target-bitrate mode (mutually exclusive; bitrate takes precedence). Returns JSON in stdout with output_path and applied parameters. @param input_path Source video path. @param output_path Destination video path. @param video_codec Output video codec: libx264, libx265, or libvpx-vp9. Default libx264. @param crf Constant Rate Factor for quality-based encoding. Default 23 for H.264, 28 for H.265, 33 for VP9. @param bitrate Target video bitrate (for example 4M). Overrides crf when set. @param preset Encoding speed/compression preset. Default medium. @param profile H.264/H.265 profile (for example baseline, main, high). @param level H.264/H.265 level (for example 4.0, 4.1). @param resolution Output resolution as WxH (for example 1920x1080). Keeps original if omitted. @param audio_bitrate Output audio bitrate. Default 128k. @param pixel_format Output pixel format. Default yuv420p. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), crf, level, +8 more.

ffmpeg__extract_frames_for_visionA

Extract image frames for multimodal vision prompts. @remarks Returns JSON in stdout with frame_paths and frame_count for direct LLM/prompt ingestion. @param input_path Source video path. @param output_dir Optional output directory. Falls back to FFMPEG_OUTPUT_DIR or SHELL_AS_MCP_OUTPUT_DIR. @param start_time Optional start timestamp. @param end_time Optional end timestamp. @param fps Optional extraction fps (for example 0.5 for one frame every two seconds). @param keyframes_only Whether to extract only keyframes (I-frames). @param max_resolution Optional longest-edge cap for generated frames. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), fps, end_time, output_dir, +4 more.

ffmpeg__generate_proxyA

Transcode high-bitrate source footage to an edit-friendly H.264 proxy. @remarks Generates a lower-bitrate proxy suitable for editing. Returns JSON in stdout with output_path and applied parameters. @param input_path Source video path. @param output_path Destination proxy video path. @param width Proxy output width in pixels. Height is auto-calculated to maintain aspect ratio. Default 1280. @param crf H.264 CRF quality factor (lower = better quality). Default 28. @param fps Optional output frame rate to unify mixed-fps footage. @param pixel_format Output pixel format. Default yuv420p for maximum compatibility. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), crf, fps, +3 more.

ffmpeg__generate_thumbnailA

Extract a single frame from a video at a specified timestamp to use as a thumbnail or poster image. @remarks Returns JSON in stdout with output_path and applied parameters. Output format is determined by output_path extension (jpg recommended). @param input_path Source video path. @param output_path Destination image path (for example thumbnail.jpg or poster.png). @param timestamp Timestamp to extract the frame from. Default 00:00:01. @param width Output image width in pixels. Height is auto-calculated. Default 1280. @param quality JPEG quality factor 1-31 (lower value = better quality). Default 2. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), width, quality, +2 more.

ffmpeg__healthzA

Check whether ffmpeg runtime dependency is available. @remarks Returns ffmpeg version and health status as JSON. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

ffmpeg__mix_audio_tracksA

Mix two audio tracks (voice and background music) into a single output using the amix filter. @remarks Typical use: normalize voice first, then mix with BGM using a low bgm_volume (0.2–0.3). Returns JSON in stdout with output_path and applied volume parameters. @param voice_path Primary audio track path (for example voice or narration). @param bgm_path Background music track path. @param output_path Destination mixed audio path. @param voice_volume Volume multiplier for the primary track. Default 1.0. @param bgm_volume Volume multiplier for the background music track. Default 0.3. @param duration Output duration strategy: shortest (default), longest, or first. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: bgm_path (required), voice_path (required), output_path (required), duration, +3 more.

ffmpeg__mux_audioA

Replace or attach an audio track to a video by muxing a separate audio file. @remarks The original video audio is discarded. Typical use: attach a mixed or dubbed audio track to a graded video. Returns JSON in stdout with output_path and applied parameters. @param video_path Source video path (its original audio track will be discarded). @param audio_path Replacement audio track path. @param output_path Destination video path with the new audio track. @param audio_delay_ms Audio track delay in milliseconds (positive = delay audio). Default 0. @param reencode_audio Whether to re-encode the audio to AAC. Default false uses stream copy. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: audio_path (required), video_path (required), output_path (required), audio_delay_ms, +2 more.

ffmpeg__normalize_audioA

Normalize audio loudness to a target EBU R128 LUFS using the ffmpeg loudnorm filter. @remarks Returns JSON in stdout with output_path and applied normalization parameters. Default target of -14 LUFS is suitable for most streaming platforms (YouTube, Spotify). @param input_path Source audio or video path. @param output_path Destination audio path. @param target_lufs Target integrated loudness in LUFS. Default -14. @param true_peak Maximum true peak level in dBTP. Default -1.0. @param loudness_range Target loudness range (LRA) in LU. Default 11. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), true_peak, target_lufs, +2 more.

ffmpeg__probe_mediaA

Probe a media file and return full metadata as JSON using ffprobe. @remarks Returns ffprobe JSON output in stdout with streams and format information. @param input_path Source media file path (video or audio). @param stream_type Filter streams to probe: all (default), video, or audio. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), stream_type, __mcp_response_mode.

ffmpeg__process_audio_for_sttA

Build a Whisper/STT-ready compact audio output from either audio or video input. @remarks Returns a JSON summary in stdout with output_path and normalization parameters for LLM-friendly parsing. @param input_path Source media path (video or audio). @param output_path Destination audio path. @param start_time Optional start timestamp (for example 00:04:30). @param end_time Optional end timestamp (for example 00:05:30). @param sample_rate Output sample rate in Hz, default 16000. @param channels Output channels count, default 1. @param remove_silence Whether to remove long silent regions, default true. @param audio_format Output container format, default mp3. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), channels, end_time, +5 more.

ffmpeg__process_video_for_llmA

Build an LLM-ready video in one ffmpeg run (trim, scale, fps, speed, optional audio strip and watermark). @remarks Returns a compact JSON summary in stdout with output_path and applied options for LLM-friendly parsing. @param input_path Source video path. @param output_path Destination video path. @param start_time Optional start timestamp (for example 00:04:30). @param end_time Optional end timestamp (for example 00:05:30). @param max_resolution Optional longest-edge cap (for example 720). @param fps Optional output fps (for example 1.0). @param speed_factor Playback speed factor (for example 2.0). @param strip_audio Whether to remove audio track. @param watermark_path Optional watermark/subtitle image path. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), output_path (required), fps, end_time, +6 more.

ffmpeg__split_videoA

Split a single video into multiple segments at specified timestamps. @remarks split_points is a comma-separated list of timestamps (HH:MM:SS or seconds). Returns JSON in stdout with output_dir, segment_count, and segments array. Falls back to FFMPEG_OUTPUT_DIR or SHELL_AS_MCP_OUTPUT_DIR if output_dir param is omitted. @param input_path Source video file path. @param output_dir Output directory for generated segments. Falls back to FFMPEG_OUTPUT_DIR or SHELL_AS_MCP_OUTPUT_DIR. @param split_points Comma-separated list of cut timestamps, for example 00:10:00,00:20:00,00:30:00. @param output_prefix Filename prefix for segment files, default segment. @param reencode Whether to re-encode segments. Default false uses stream copy (faster but may cause keyframe misalignment). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: input_path (required), split_points (required), reencode, output_dir, +2 more.

host_info__get_host_contextA

Collect host system context for code development tasks in a single call. @remarks Returns two sections: 'system' (OS, locale, timezone, hardware, current time) and 'dev_environments' (availability, path, and version for ~35 programming tools). Ideal as a first call before writing or running code on the host. @param include_hardware Whether to include CPU count and total memory size in system section. Default true. @param filter_tools Optional comma-separated list of tool names to probe (e.g. 'python3,node,rustc'). Empty = check all ~35 tools. @param output_format JSON indentation style: 'pretty' (default, 2-space indent) or 'compact'. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: filter_tools, output_format, include_hardware, __mcp_response_mode.

host_info__healthzA

Check whether host_info bundle can access basic host context commands. @remarks Verifies uname availability and emits a compact JSON report. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

runprompt__generate_artifactA

Generate a shell-as-mcp bundle with runprompt under SHELL_AS_MCP_SPEC_DIR. @param artifact_type Artifact type: shell-as-mcp-bundle. @param requirements Natural language requirements used to generate file content. @param server_name Optional server folder for shell-as-mcp-bundle mode. @param tool_name Optional tool base name for shell-as-mcp-bundle mode. @param max_repair_rounds Optional max repair rounds when quality gates fail. @param run_tests Optional toggle for running tests in quality gates. @param run_code_review Optional toggle for running code review gate (default true). @param run_security_review Optional toggle for running security review gate (default true). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: requirements (required), artifact_type (required), run_tests, tool_name, +5 more.

runprompt__healthzA

Check whether runprompt bundle runtime prerequisites are available. @remarks Verifies python3 availability and returns version in JSON. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

run_safe_command__audit_getA

Read recent run_safe_command execution audit records. @param limit Maximum number of most recent entries to return. Default 20. @param include_rotated Include rotated audit files in addition to the active audit file. Default true. @param rotated_file_limit Maximum number of rotated audit files to scan. Range 1-50. Default 10. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: limit, include_rotated, rotated_file_limit, __mcp_response_mode.

run_safe_command__audit_rotateA

Rotate run_safe_command audit file immediately and enforce retention. @param max_files Optional retention count for rotated files. Range 1-100. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: max_files, __mcp_response_mode.

run_safe_command__executeA

Execute a command safely with structured security and audit metadata. @remarks The command is executed without shell eval in a validated working directory. Runtime control behaviors are internal-only and not caller-configurable. On darwin/arm64, pre-execution auth prefers native Swift+WKWebView and automatically falls back to OSA. @param command Executable name to run (for example: ls, cat, grep). @param args_json JSON array string of positional arguments, for example ["-la", "./src"]. @param working_dir Absolute working directory where the command will run. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: command (required), args_json (required), working_dir (required), __mcp_response_mode.

run_safe_command__healthzA

Check run_safe_command runtime dependencies and platform capabilities. @remarks Missing optional trace tools (for example strace on macOS) are reported as warnings, not hard failures. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

run_safe_command__helpA

Show usage and safety model for run_safe_command tools. @param topic Optional topic filter: execute, audit, healthz, security. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: topic, __mcp_response_mode.

run_safe_command__pipelineA

Execute a safe shell pipeline from structured stage definitions. @remarks Each stage is validated against a command allowlist before execution. The pipeline is assembled using Python subprocess chaining (Popen stdin chains), not via shell eval or bash -c with user-supplied data. Commands are restricted to a safe processing-only allowlist; destructive or network commands are not permitted. Unlike run_safe_command__execute, this tool accepts pipe-connected stage sequences but applies stricter per-stage command validation to compensate. On darwin/arm64, pre-execution auth prefers native Swift+WKWebView and automatically falls back to OSA. @param stages_json JSON array of pipeline stage objects. Each stage must have "command" (string) and "args" (string array). Commands must pass the pipeline allowlist: grep, awk, sed, cut, sort, uniq, wc, head, tail, cat, echo, tr, xargs, find, ls, ps, du, df, date, env, printenv, uname, hostname, id, whoami, pwd, dirname, basename. Example: [{"command":"ps","args":["aux"]},{"command":"grep","args":["python"]}] @param working_dir Absolute working directory shared by all pipeline stages. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: stages_json (required), working_dir (required), __mcp_response_mode.

shell__healthzA

Check whether shell bundle basic runtime is available. @remarks Verifies bash command presence and returns JSON status. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

shell__run_script_echoC

Run a local script and echo the input value with prefix. @param value Input value passed to the script. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: value (required), __mcp_response_mode.

ytdlp__download_audioA

Download audio from a video URL using yt-dlp, saving as m4a to output_dir or a configured default directory. @remarks Extracts best-quality audio track. Supports optional cookies file and proxy. @param url The video URL to download audio from (must start with http:// or https://). @param output_dir Optional output directory. Falls back to YTDLP_OUTPUT_DIR, SHELL_AS_MCP_OUTPUT_DIR, or ~/Downloads. @param cookies Optional path to a Netscape-format cookies file for authenticated downloads. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, maxRetries, +2 more.

ytdlp__download_transcriptA

Download and extract plain-text transcript from a video URL using yt-dlp. @remarks Downloads VTT subtitles (manual or auto-generated) to a temp dir, converts to plain text (strips timestamps, NOTE blocks, duplicate adjacent lines), then cleans up. @param url The video URL (must start with http:// or https://). @param language Subtitle language code. Defaults to "en". @param output_dir Optional output directory. If set, transcript text is also saved as a .txt file. @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address. @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, language, +3 more.

ytdlp__download_videoA

Download a video from a URL using yt-dlp, saving to output_dir or a configured default directory. @remarks Supports resolution selection and optional time-range trimming via --download-sections. Both startTime and endTime must be provided together to enable trimming. @param url The video URL (must start with http:// or https://). @param resolution Target resolution: "480p", "720p" (default), "1080p", or "best". @param startTime Optional start time for clip extraction (e.g. "00:01:30"). @param endTime Optional end time for clip extraction (e.g. "00:05:00"). @param output_dir Optional output directory. Falls back to YTDLP_OUTPUT_DIR, SHELL_AS_MCP_OUTPUT_DIR, or ~/Downloads. @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address. @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, endTime, +5 more.

ytdlp__download_video_subtitlesA

Download subtitle files (VTT) for a video URL using yt-dlp, saving to output_dir or a configured default directory. @remarks Downloads both manual and auto-generated subtitles without downloading the video itself. @param url The video URL (must start with http:// or https://). @param language Subtitle language code. Defaults to "en". @param output_dir Optional output directory. Falls back to YTDLP_OUTPUT_DIR, SHELL_AS_MCP_OUTPUT_DIR, or ~/Downloads. @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address. @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, language, +3 more.

ytdlp__get_video_commentsA

Fetch video comments from a URL using yt-dlp and return structured JSON. @remarks Uses yt-dlp --write-comments -j to extract comments metadata, then filters/sorts via Python to return at most maxComments entries. @param url The video URL (must start with http:// or https://). @param maxComments Maximum number of comments to return (1-5000). Defaults to 100. @param sortOrder Comment sort order: "top" (default) or "new". @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address. @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, sortOrder, +3 more.

ytdlp__get_video_comments_summaryB

Fetch and summarize top comments from a video URL using yt-dlp. @remarks Returns formatted comment list with author, like count, and text. @param url The video URL (must start with http:// or https://). @param maxComments Number of comments to return (1-50, default 10). @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, maxRetries, +2 more.

ytdlp__get_video_metadataA

Fetch raw metadata JSON for a video URL using yt-dlp. @remarks Returns full or filtered metadata fields as JSON. @param url The video URL (must start with http:// or https://). @param fields Comma-separated field names to return (e.g. "title,uploader,view_count"); empty returns all. @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, fields, cookies, +2 more.

ytdlp__get_video_metadata_summaryA

Fetch and display a human-readable metadata summary for a video URL using yt-dlp. @remarks Returns title, channel, duration, upload date, views, likes, tags, and description snippet. @param url The video URL (must start with http:// or https://). @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, maxRetries, +1 more.

ytdlp__healthzA

Check whether ytdlp bundle runtime dependency is available. @remarks Verifies yt-dlp, python3, node and _ytdlp_cookies_lib.sh availability, then returns yt-dlp version in JSON. @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: __mcp_response_mode.

ytdlp__list_subtitle_languagesA

List all available subtitle languages for a video URL using yt-dlp. @remarks Outputs subtitle language codes and formats without downloading. @param url The video URL (must start with http:// or https://). @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: url (required), proxy, cookies, maxRetries, +1 more.

ytdlp__search_videosA

Search YouTube videos by keyword using yt-dlp and return results as summary or JSON. @remarks Uses ytsearch to query YouTube; supports pagination via offset and date filtering. @param query Search keywords (must not contain newlines). @param maxResults Number of results to return (1-50, default 10). @param offset Pagination offset (default 0). @param response_format Output format: "summary" (default) or "json". @param uploadDateFilter Filter by upload date: "today", "week", "month", or "year". @param cookies Optional path to a Netscape-format cookies file. @param proxy Optional proxy address (e.g. socks5://127.0.0.1:1080). @param maxRetries Optional retry count after failures, capped at 2 (default: 2). @param __mcp_response_mode Optional response mode: content (default) or structuredContent.

Inputs: query (required), proxy, offset, cookies, +5 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 49 tools

    Disambiguation2/5

    Multiple healthz tools across bundles (ffmpeg__healthz, ass__healthz, shell__healthz, etc.) are functionally identical, and several ffmpeg transcode tools (export_video, generate_proxy, process_video_for_llm) have overlapping parameters and purposes. The ytdlp summary/full pairs add further ambiguity.

    Naming Consistency4/5

    Tool names consistently follow a bundle__verb_noun pattern with snake_case, and the bundle prefix provides a clear namespace. Minor deviations exist (e.g., ffmpeg__extract_frames_for_vision vs. simple verb_noun names), but the overall pattern is predictable.

    Tool Count2/5

    49 tools is excessive for a coherent server; it aggregates multiple independent domains (ffmpeg, yt-dlp, ASS, safe command, host info) into one namespace. The high count is inflated by redundant healthz checks and trivial wrappers, making selection and navigation burdensome.

    Completeness3/5

    Major subdomains like ffmpeg and yt-dlp have decent coverage, but the shell bundle is nearly empty (only a trivial echo script), and there are notable gaps such as no simple audio extraction tool and no unified status/diagnostics tool. The broad scope makes full completeness difficult to assess.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Turns any shell command into an MCP server by defining command-line tools in simple YAML files. Enables AI agents to execute system commands, security scanners, DevOps tools, and CLI utilities directly from chat interfaces.
      4
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Dynamically exposes CLI/bash commands as MCP tools and creates structured AI prompt templates through simple YAML configuration files, enabling users to transform any command-line tool into an MCP-compatible interface without writing code.
      20
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables execution of arbitrary CLI tools and shell scripts by defining them in YAML configuration files as MCP Tools. Supports custom shells (bash, Python, Node.js, Deno), input parameters passed as environment variables, and flexible timeout settings.
      31 npm
      36
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables users to define and run MCP tools using declarative YAML configs with built-in trust enforcement, credential brokering, and tamper-evident audit logging.
      14
      MIT