Skip to content

skillserver CLI

skillserver is the command-line tool for publishing and managing skills and sub-agents on a skill server. It’s what you run by hand during authoring and what your CI pipeline runs on merge. It speaks to the server’s REST API, so anything the gallery shows, skillserver can do from a terminal.

Terminal window
# .NET global tool
dotnet tool install --global Netclaw.SkillServer.Cli
# Or a self-contained binary (Linux/macOS), no .NET runtime needed
curl -fsSL https://raw.githubusercontent.com/netclaw-dev/skill-server/dev/scripts/install-skillserver.sh | bash

For CI, pin the version. The install script takes one as an argument (bash -s -- 0.4.0), or commit a dotnet-tools.json manifest and run dotnet tool restore.

skillserver needs a server URL, and a publish API key for any command that writes. It resolves both from three sources, highest priority first:

SourceHow to setUse for
CLI flags--server-url, --api-keyOne-off overrides
EnvironmentSKILLSERVER_URL, SKILLSERVER_API_KEYCI
Config fileskillserver config init~/.skillserver/config.jsonLocal dev
Terminal window
skillserver config init # interactive first-run setup
skillserver config set server-url https://skills.example.com
skillserver config show # print current config (no secrets)

Read-only commands (list, list-subagents, versions, verify, download-subagent) need only the URL. Everything that writes needs a key.

Terminal window
skillserver publish ./my-skill # one skill; version from SKILL.md frontmatter
skillserver publish ./my-skill --version 2.0.0 # override the version
skillserver publish-all ./skills # every skill dir under ./skills
skillserver publish-subagent ./agent.md --version 1.0.0
skillserver publish-subagents ./subagents # every .md under ./subagents

publish points at a single skill directory (the one holding SKILL.md). publish-all points at the parent directory and publishes each subdirectory. Both skip versions already on the server unless you pass --force. Sub-agents take their version from --version, which is required. The markdown frontmatter’s metadata.version is ignored.

$ skillserver publish-all ./skills
Scanning ./skills...
Found 2 skill(s) to publish.
hello-greeter@1.0.0 Published
k8s-log-triage@0.2.0 Published
Results: 2 published, 0 skipped, 0 failed
FlagMeaning
--version <v>Override the version (required for sub-agents)
--force, -fDelete the existing version, then re-publish
--dry-runShow what would publish without uploading
Terminal window
skillserver list # all skills: name, latest, version count
skillserver list --search kubernetes # full-text search
skillserver versions my-skill # every version of one skill
skillserver list-subagents
skillserver verify ./my-skill # local files vs published digests
skillserver download-subagent release-notes-writer 1.0.0 ./agent.md

verify hashes each local file and compares it to the published version, which is handy in CI to confirm a release matches the repo:

$ skillserver verify ./k8s-log-triage
Verifying k8s-log-triage@0.2.0...
SKILL.md match
scripts/collect-logs.sh match
references/kubectl-cheatsheet.md match
assets/triage-template.json match
All files verified

lint runs entirely on local files, with no URL and no key, so it’s the natural PR gate.

Terminal window
skillserver lint ./skills # every skill dir under ./skills
skillserver lint subagent ./agent.md # one sub-agent file
skillserver lint subagents ./subagents # every sub-agent .md in a dir

It checks that frontmatter parses, required fields are present, names are lowercase-kebab, and versions are semver.

Terminal window
skillserver delete my-skill 1.0.0 --yes
skillserver delete-subagent release-notes-writer 1.0.0 --yes
skillserver api-key create --label ci-publish # prints the secret ONCE
skillserver api-key list # ids + labels, never secrets
skillserver api-key delete 2

--yes/-y skips the delete confirmation prompt, so reach for it in scripts. api-key create shows the sk-… secret a single time, so store it immediately.

FlagDescription
--server-url <url>Override the configured URL
--api-key <key>Override the configured key
--output <text|json>Output format (default text)
--verbose, -vDetailed progress / upload logs
--help, -hCommand help (works without a server)
--versionPrint the CLI version

Pass --output json to any read command for scripting:

Terminal window
skillserver list --output json | jq '.[].name'
CodeMeaning
0Success
1Any failure: usage error, unknown command, validation error, auth failure, or a rejected server request

There’s no separate code for usage versus runtime errors. Both are 1, so scripts should branch on 0 versus non-zero.