SkillAgentSearch skills...

clyops

A cross-language option parser that turns your programs/scripts into typed tools for humans, HTTP clients, and AI agents.

Install / Use

claude mcp add wankdanker -- npx -y github:wankdanker/clyops

If the server publishes to npm under a different name, use that package instead — check the repo README.

About this skill
🔌

MCP Server

Model Context Protocol server

Quality Score

83/100

Supported Platforms

Claude Code
Claude Desktop

Our assessment of clyops

clyops scores 83/100 on our quality scale, 3051st of 4,597 Development & Engineering skills we index.

Its MCP Server is 20 KB long, well organised into 18 sections with 20 code examples: a thorough specification that gives an agent plenty to work with.

It has 3 GitHub stars, so there is little community track record yet; judge it on its content.

Substance
30/30
Structure
20/20
Description
15/15
Adoption
3/20
Freshness
15/15

Maintenance, license and trust

  • The repository was last updated 3 days ago, so clyops is actively maintained.
  • It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
  • Its trust signals score 92/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

Safety scan

No issues found

Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.

Automated pattern scan on 2026-10-20. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.

clyops compared with similar skills

All 4 of these similar skills score higher than clyops; compare them before choosing.

SkillScoreStarsUpdatedFormat
clyops (this skill)by wankdanker8333d agoMCP Server
Agent-Reachby Panniantong10099.8k4d agoCLAUDE.md
taste-skillby Leonxlnx10099.5ktodayCLAUDE.md
headroomby headroomlabs-ai10076.3ktodayCLAUDE.md
ai-job-searchby MadsLorentzen10057.9ktodayCLAUDE.md

Frequently asked questions

How do I install clyops?
Run claude mcp add wankdanker -- npx -y github:wankdanker/clyops. The install tabs above show the steps for each supported agent.
Which AI agents does clyops work with?
It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
Is clyops safe to use?
Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 92/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is clyops still maintained?
The repository was last updated 3 days ago, so clyops is actively maintained.

clyops

Define your CLI once. Use it from terminals, desktop forms, HTTP and AI agents. clyops turns the options beside your code into a consistent, machine-readable contract. Keep the execution logic in your language; use the same tool through the terminal, the desktop runner, the HTTP API or an MCP client.

Register your options and arguments once at the top of a program, and clyops handles parsing, validation, help text, config files, environment variables, a JSON schema of the interface, logging helpers and shell completion for bash, zsh and fish.

See the animated project homepage or run the walkthrough: one small deployment-plan tool, from generated help to an agent call and an HTTP endpoint.

Try the mixed Bash/Python scripts immediately after cloning:

./examples/scripts/plan.py --env production --replicas 3
./examples/scripts/report.py --format table
./examples/scripts/transcode.sh examples/data/tone.wav /tmp/clyops-demo.m4a

No library compilation or pip dependencies are needed. FFmpeg and curl wrappers preview commands before explicit execution. The browser playground executes the Python examples in your tab.

The same behavior ships for Bash, JavaScript, TypeScript, Python, Rust, C, Go, Ruby and Java. Every implementation is checked against one shared specification and conformance suite, so a tool keeps the same help output, error messages and completion when you port it from Bash to Rust.

clyops_opt PORT port p 8080 "Server port" Network port                      # Bash
cli.opt('PORT', 'port', 'p', '8080', 'Server port', 'Network', 'port');    // JavaScript / TypeScript
cli.opt("PORT", "port", "p", "8080", "Server port", "Network", "port")       # Python
cli.opt("PORT", "port", "p", "8080", "Server port").group("Network").rule("port"); // Rust
clyops_opt(cli, "PORT", "port", "8080", .short_name = 'p', .description = "Server port", .group = "Network", .rule = "port"); // C
cli.Opt("PORT", "port", "p", "8080", "Server port", "Network", "port")       // Go
cli.opt "PORT", "port", "p", "8080", "Server port", "Network", "port"        # Ruby
cli.opt("PORT", "port", "p", "8080", "Server port", "Network", "port");     // Java

A complete program

<table> <tr><th>Bash</th><th>Python</th></tr> <tr><td>
#!/usr/bin/env bash
source clyops.sh

clyops_description "Copy files to a server."
clyops_arg          SRC   "File to send" "" "file:exists"
clyops_arg_variadic EXTRA "More files" "file:exists"
clyops_opt  HOST    host    H localhost "Server"  Network hostname
clyops_opt  PORT    port    p 22        "Port"    Network port
clyops_opt  VERBOSE verbose v flag      "Chatty"
clyops_opt  CONFIG  config  c optional  "Config file" Config path
clyops_config config "send:"
clyops_run "$@"

info "sending $SRC to $HOST:$PORT"
</td><td>
#!/usr/bin/env python3
from clyops import Cli, info

cli = Cli()
cli.set_description("Copy files to a server.")
cli.arg("SRC", "File to send", "", "file:exists")
cli.arg_variadic("EXTRA", "More files", "file:exists")
cli.opt("HOST", "host", "H", "localhost", "Server", "Network", "hostname")
cli.opt("PORT", "port", "p", "22", "Port", "Network", "port")
cli.opt("VERBOSE", "verbose", "v", "flag", "Chatty")
cli.opt("CONFIG", "config", "c", "optional", "Config file", "Config", "path")
cli.set_config("config", "send:")
args = cli.run()

info(f"sending {args.SRC} to {args.HOST}:{args.PORT}")
</td></tr> </table>

Each package's README shows the same program in its own language: JavaScript/TypeScript · Bash · Python · Rust · C · Go · Ruby · Java.

Either version (and the same program in every other language) prints exactly this for send --help:

Usage: send <SRC> [<EXTRA...>] [OPTIONS]

Copy files to a server.

Positional Arguments:
  SRC                           File to send (accepts: existing file)
  EXTRA                         More files (variadic, accepts: existing file)

Network:
  -H, --host=<value>            Server (default: localhost, accepts: hostname)
  -p, --port=<value>            Port (default: 22, accepts: port: 1-65535)

Options:
  -v, --verbose                 Chatty

Config:
  -c, --config=<value>          Config file (accepts: path)

Global:
  -h, --help                    Show this help message and exit
<details> <summary><code>send --help-json-schema</code>: the machine-readable interface that UIs, the API and the MCP server are built from</summary>
{
  "clyops": 1,
  "script": "send",
  "description": "Copy files to a server.",
  "epilog": "",
  "arguments": [
    {
      "name": "SRC",
      "description": "File to send",
      "required": true,
      "isVariadic": false,
      "default": "",
      "validation": "file:exists"
    },
    {
      "name": "EXTRA",
      "description": "More files",
      "required": false,
      "isVariadic": true,
      "default": "",
      "validation": "file:exists"
    }
  ],
  "options": [
    {
      "name": "host",
      "shortName": "H",
      "variableName": "HOST",
      "description": "Server",
      "default": "localhost",
      "group": "Network",
      "type": "string",
      "isFlag": false,
      "isArray": false,
      "required": false,
      "validation": "hostname",
      "choices": [],
      "secret": false
    },
    {
      "name": "port",
      "shortName": "p",
      "variableName": "PORT",
      "description": "Port",
      "default": "22",
      "group": "Network",
      "type": "integer",
      "isFlag": false,
      "isArray": false,
      "required": false,
      "validation": "port",
      "choices": [],
      "secret": false
    },
    {
      "name": "verbose",
      "shortName": "v",
      "variableName": "VERBOSE",
      "description": "Chatty",
      "default": "false",
      "group": "Options",
      "type": "boolean",
      "isFlag": true,
      "isArray": false,
      "required": false,
      "validation": "",
      "choices": [],
      "secret": false
    },
    {
      "name": "config",
      "shortName": "c",
      "variableName": "CONFIG",
      "description": "Config file",
      "default": "",
      "group": "Config",
      "type": "path",
      "isFlag": false,
      "isArray": false,
      "required": false,
      "validation": "path",
      "choices": [],
      "secret": false
    },
    {
      "name": "help",
      "shortName": "h",
      "variableName": "HELP",
      "description": "Show this help message and exit",
      "default": "false",
      "group": "Global",
      "type": "boolean",
      "isFlag": true,
      "isArray": false,
      "required": false,
      "validation": "",
      "choices": [],
      "secret": false
    }
  ],
  "requiredCommands": [],
  "effects": [],
  "constraints": [],
  "stdin": null,
  "stdout": null,
  "commands": []
}
</details>

What you get

| | | | --- | --- | | Parsing | --opt value, --opt=value, -o value, -ovalue, clustered flags -vq, --no-flag, -- to end options, repeatable array options, optional and variadic positionals | | Precedence | command line > config file > environment variable (named after the option's variable) > default | | Validation | int, int:1-10, float:0-1, string:1-8, choice:a,b, bool, port, ip, hostname, url, email, uuid, date:YYYY-MM-DD, regex:…, path, file:exists, file:readable, file:writable, dir:exists, dir:writable. Typed languages get converted values (PORT is an integer). | | Paths | path values become absolute, relative to wherever they came from: the cwd for the command line, the config file's directory for config values, the project root for defaults; optional search directories for bare names | | Config files | prefix:key=value lines, several prefixes per program, @include with cycle detection | | Help | generated --help, grouped and wrapped, showing defaults, accepted values and config values | | Introspection | --help-json-schema describes the whole interface (spec/schema.json) for UIs and tooling such as the runner | | Completion | --completion bash\|zsh\|fish prints a script that completes options, choices, files, directories and hosts | | Logging | info, warn, error, success, die with timestamps and colors (TTY only, NO_COLOR aware, CLYOPS_SILENT) | | Required commands | declare external tools a script needs; help shows whether each is installed | | Commands | nested subcommands in one program (mytool db migrate --to 3), each with its own options, arguments, help, schema and completion, sharing the program's options and config | | Relationships | exclusive, requires and oneOf between options, checked after config and environment, shown in help and the schema | | Secrets | a secret (or secret:RULE) option is masked in help and in the values JSON, and marked so the API, MCP server and runner keep it out of command lines, logs and templates | | Effects and I/O | declare what running the program does (read-only, idempotent, destructive, network) and what it reads on stdin and writes on stdout (with MIME types), for agents and servers to act on |

The spec is the precise reference for all of it.

Shell completion

The completion guide has copyable Bash, Zsh and Fish setup, including the example scripts and a dispatcher wrapper.

Every clyops program completes itself. Add one line to your shell startup:

eval "$(mytool --completion bash)"                                  # ~/.bashrc
eval "$(mytool --completion zsh)"                                   # ~/.zshrc, after compinit
mytool --completion fish > ~/.config/fish/completions/mytool.fish   # fish

The script asks the program for its options at completion time (mytool --bash-completion), so completion follows the code with no regeneration step.

clyops-dispatch

apps/dispatch turns a directory of tools into one command. A tiny definition file such as scripts/mytool

#!/usr/bin/env clyops-dispatch
description: mytool toolchain

makes every executable next to it a subcommand (mytool check) and every folder a group of subcommands (mytool media to-pcm), at any depth. mytool and mytool media list what's available with descriptions from each tool, and eval "$(mytool --completion bash)" (or zsh, fish) completes group and command names, then the chosen command's own options. Without a definition file, an alias does the same: alias mytool='clyops-dispatch --root ~/mytool/scripts --name mytool'. It ships as a native binary for Linux, macOS and Windows in each release.

Node tooling

packages/tools (clyops-tools) is the Node side of running clyops tools for someone else: it discovers a directory of tools the way clyops-dispatch does, reads their schemas, maps a JSON object onto a command line (spec §13) and gives the JSON Schema of that object. packages/jobs (clyops-jobs) runs tools as jobs: functions bound to tools in a JSON config, templated options, artifacts, job records and a queue.

clyops-api

apps/api serves a directory of tools over HTTP: clyops-api --root ~/mytool/scripts makes POST /tools/media/to-pcm run media/to-pcm.sh with a JSON body validated against the tool's schema, waiting for it or (?async=true) returning a job to poll, and publishes the whole thing as an OpenAPI document at /openapi.json. It serves the same tools to AI agents over MCP at /mcp. A non-JSON body is streamed to the tool's stdin, declared binary output

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars3
CategoryDevelopment
Updated3d ago
Forks0

Languages

TypeScript

Trust signals

92/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

1 low