Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build a generic-installable CLI tool with its companion SKILL.md so any agent (Vellum, Claude, GPT, etc.) can pick it up and use it. Use when the task is "ship a CLI for service X" or "wrap API Y in a tool agents can call." Out of scope for one-off internal scripts that don't need agent discovery, and for skills that wrap a service where a CLI already exists and is well-maintained.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 64% | 0% |
You're shipping a public CLI tool plus the SKILL.md that tells another agent how to use it. The pairing has to work for an agent you've never met, on a machine you've never seen.
The discipline is claim only what you've verified, and keep personal content out of the public surface. The rest of this skill is the rules.
Build a CLI + skill when:
pip install or equivalent).Skip when:
Every CLI should fit one of these two shapes:
<cli> <verb> [args] [flags] # a la twilio, vercel, gh
<cli> <verb> <object> [args] # a la aws, gcloud, ghAvoid the "single command with a --mode flag" anti-pattern (e.g. cli --mode=tts, cli --mode=user). Subcommands are how agents learn what a tool does from --help.
Three rules:
0 = success, 2 = user error (bad input, missing key), 3+ = service error. Don't use 1, it's ambiguous.note-style textual hint ("missing API key. Set FOO_API_KEY or pass --key-file."). Agents will grep for that string.--local mode (recommended for read-only commands)For any list/browse command, ship a --local flag that returns a curated default from baked-in code, no API call, no key needed. This is what makes the skill usable for an agent that hasn't been configured with credentials yet.
Critical: the offline path must actually skip the auth step. Build the network client lazily, only inside the commands that hit the network. Constructing the client in main() before dispatch will gate your advertised "no key needed" behavior behind the same auth wall as the rest of the tool.
A fresh tts call without flags should produce something useful. Pick neutral defaults:
--side).Tell the user which default you picked and why, in one line, before showing output.
Two paths, both supported:
SERVICE_API_KEY=...--key-file /path/to/key.txtA credential-vault reveal is the third path if the agent harness provides one. Document all three in the README.
Never embed a key in code or test fixtures, including the example calls in README.md.
This is the file an agent reads when it gets pip installd the CLI. Treat it like an API reference for the agent, not a sales brochure.
yaml--- name: <kebab-case-name> # must match parent dir, lowercase + hyphens only description: <100 token description, keyword-rich> compatibility: # optional metadata: # optional, includes emoji and display-name ---
The description is what an agent uses to decide whether to load this skill. Include:
A good SKILL.md has these sections, in this order:
Keep the description under ~100 tokens. Keep the body under 500 lines. Move deeper reference material to references/ (linked from the SKILL.md) so progressive disclosure kicks in.
Every shell example in Examples should be a command you've actually run during development. If you didn't run it, don't show it. Agents will copy-paste these.
A CLI + skill that an agent calls falls into one of two categories. Pick one explicitly.
The CLI is pip install-able by anyone. Host it in a public GitHub repo. The repo:
elevenlabs-cli, kalshi-cli).The companion SKILL.md lives at the repo root, not in some private vault.
If the CLI is a private tool (e.g. your prediction-market strategy, your bespoke home-automation script), keep it inside a private repo that's strictly separate from any public repo. Don't bleed content across.
The line: if the public CLI repo contains any file that only makes sense to you, delete it. Strategy docs, README drafts with your name, internal notes, test fixtures with your data — none of these belong in a public agent-discoverable tool.
Before you tell the user "shipped," every item on this list:
--local flag specifically: tested with no API key set, confirmed it works.pip install . or the equivalent for the language you picked.If any item is unchecked, don't ship. Mark it "needs review" or fix it first.
main() constructs the auth client before the dispatcher gets a chance to see --local. The offline shortcut dies on the path that's supposed to need nothing. Fix: build the client inside the commands that actually hit the network.next_character_count_reset_unix, your code reads reset_at. The pretty output silently prints dashes for everything you got wrong. Fix: hit the live API once.Accept: audio/mpeg. Works for mp3, breaks the moment a caller asks for pcm_*. Fix: let the query parameter win, don't override Accept.requests. The claim reads as marketing: a reader will check and lose trust. Fix: drop the claim, replace with what's true.elevenlabs-cli — a generic ElevenLabs TTS CLI plus companion SKILL.md. Useful as a worked example of the pattern: subcommand shape, --local mode, curated voice list, env/flag auth, a SKILL.md that includes trigger phrases, inputs/outputs, latency-per-tier gotchas, and out-of-scope flags for features that belong elsewhere.
The v1 of that CLI shipped with bugs that the "Pre-flight checklist" above was written to prevent. Treat the checklist as the lessons learned in compressed form.
Other measured skills in the registry, with their headline benchmark lift.