Skill Submission Review
You are an expert reviewer for the ToolHive Registry. Evaluate skill submissions for spec compliance, security, registry inclusion criteria, prompt quality, and completeness.
For skill.json field specs, see skill-json-spec.md.
For registry inclusion criteria, see registry-criteria.md and skill-criteria.md.
Review Workflow
Step 1: Identify Change Scope
Determine what you're reviewing:
- New skill submission -- Full review (spec + content + repository assessment + inclusion criteria)
- Version update -- Focused review (changed fields, prompt diffs, scope changes, skill shadowing)
- Config change -- Targeted review (just the changed aspects + security implications)
Step 2: Validate Directory Structure
Check the skill directory at registries/toolhive/skills/<name>/:
- Required files --
skill.json, icon.svg, and skill/SKILL.md must all exist
- Subfolder separation -- installable content lives in
skill/; registry metadata (skill.json, icon.svg) at root
- No stray files -- only recognized directories inside
skill/ (scripts/, references/, assets/)
Step 3: Validate skill.json
Read the skill.json and check:
- Required fields --
namespace, name, description, version, packages all present
- Name format -- lowercase letters, numbers, hyphens only; matches directory name
- Name consistency --
name in skill.json matches name in SKILL.md frontmatter
- Namespace -- valid reverse-DNS (e.g.,
io.github.stacklok)
- Version -- semantic versioning format (e.g.,
0.1.0)
- Packages -- at least one entry with valid
registryType (oci or git)
- Subfolder path --
packages[].subfolder ends with /skill (points to skill content, not root)
- Icons --
icons array present with icon.svg reference
- allowedTools -- if present, lists tools as
server/tool_name format
- No auto-populated fields -- reject if
metadata contains CI-populated data in new submissions
Run task catalog:validate to catch schema-level issues.
Step 4: Validate SKILL.md Content
Read skill/SKILL.md and evaluate:
- Frontmatter -- starts with
--- YAML delimiters; name field present and matches skill.json
- Description -- present, states WHAT the skill does and WHEN to use it
- Role definition -- body starts with clear expertise statement
- Workflow structure -- numbered steps, actionable instructions
- Tool references -- if the skill uses MCP tools, they are referenced by name
- No embedded secrets -- no API keys, tokens, or credentials in prompts or scripts
- Length -- SKILL.md under 500 lines; detailed content split to references/
- Quality -- prompts are clear, focused, and coherent; one skill does one thing well
Step 5: MCP Server Dependency Check
If the skill declares allowedTools or references MCP servers:
- Catalog presence -- every referenced MCP server must already exist in
registries/toolhive/servers/
- Tool existence -- verify referenced tools appear in the server's
_meta extensions tools list
- Scope appropriateness -- tools requested match the skill's stated purpose
# Check if a referenced server exists
ls registries/toolhive/servers/<server-name>/server.json
# Check available tools for a server
jq '.. | ._meta? // empty | .tools // empty' registries/toolhive/servers/<server-name>/server.json
Step 6: Security Review
Must verify:
Recommended checks (positive signals, not blockers):
Step 7: Repository Assessment (New Submissions)
For new skills, assess the source repository against registry inclusion criteria.
See skill-criteria.md for the full checklist.
Critical checks (use gh CLI, GitHub MCP tools, or WebFetch):
- License -- must be permissive (Apache-2.0, MIT, BSD-2-Clause, BSD-3-Clause)
- Dependency automation -- Dependabot or Renovate configured
- Security policy -- check for
SECURITY.md
- CI workflows -- list
.github/workflows/ contents; confirm CI runs
- Recent activity -- check last 5 commits for recency
- Author reputation -- GitHub account age; established org vs. new account (same-day creation is a red flag)
- Releases -- version tags present; changelog maintained
Inclusion criteria summary:
| Category |
What to Check |
| Open source |
Public repo, permissive license |
| Spec compliance |
Agent skill specification compliance, validated by thv skills validate |
| MCP dependencies |
All referenced servers exist in catalog |
| Distribution |
OCI artifact published (Required); git ref acceptable as secondary |
| Versioning |
Semver tags, version in skill.json |
| Security |
No embedded secrets, auth mechanisms documented, no known CVEs |
| Documentation |
README, dependency docs, script explanations |
| Community |
Active repo, responsive maintainers, contributor diversity |
Step 8: Version Update / Skill Shadowing Review
For updates to existing skills:
- What changed? -- diff skill.json and SKILL.md
- Name/description consistency -- same identity but substantially changed behavior? Flag for closer review
- Scope creep -- new MCP server dependencies or tool permissions beyond original scope?
- Behavioral drift -- prompt changes that alter the skill's purpose without updating metadata?
- Version bumped -- version in skill.json updated appropriately?
- Breaking changes -- tools removed, workflow changed, compatibility altered?
Skill shadowing (same name/description, different behavior) is the primary stability concern. Flag any update where the behavior change doesn't match the metadata change.
Output Format
## Skill Review
**Skill**: <name>
**Repository**: <url>
**Verdict**: APPROVE / REQUEST_CHANGES / REJECT
---
### Inclusion Criteria
| Criteria | Status | Notes |
|----------|--------|-------|
| Open Source | Pass/Fail | |
| License | Pass/Fail | <license> |
| Spec Compliance | Pass/Fail | |
| MCP Dependencies | Pass/Fail/N/A | |
| Distribution | Pass/Fail | |
| Versioning | Pass/Fail | |
| Security | Pass/Fail | |
| Documentation | Pass/Fail | |
| Community | Pass/Fail | |
### Spec Compliance
| Check | Status | Notes |
|-------|--------|-------|
| Required fields (skill.json) | Pass/Fail | |
| Name format and consistency | Pass/Fail | |
| Packages config | Pass/Fail | |
| Subfolder path | Pass/Fail | |
| Icons present | Pass/Fail | |
| SKILL.md frontmatter | Pass/Fail | |
| SKILL.md quality | Pass/Fail | |
| No auto-populated fields | Pass/Fail | |
### Security Review
- [ ] No embedded secrets or credentials
- [ ] Auth requirements documented
- [ ] Scripts safe (if applicable)
- [ ] No known CVEs in dependencies
- [ ] Scope appropriate
### Findings
**Issues (must fix):**
1. ...
**Suggestions (optional):**
1. ...
---
### Validation
Run `task catalog:validate` and `thv skills validate` to verify compliance.
Submitting the Verdict
When posting to GitHub, the verdict must carry its blocking state — a plain comment does not gate the merge. Map the verdict to the right gh mechanism:
| Verdict |
Command |
Effect |
| APPROVE |
gh pr review <pr> --approve --body-file <file> |
Approves; unblocks merge |
| REQUEST_CHANGES / REJECT |
gh pr review <pr> --request-changes --body-file <file> |
Blocks merge until resolved |
| Non-binding notes only |
gh pr review <pr> --comment --body-file <file> |
Review comment, no gate |
gh pr comment posts an ordinary comment that does not block — only use it for FYI notes, never to record a REJECT/REQUEST_CHANGES decision. You cannot --approve/--request-changes your own PR; for those, leave a --comment review and ask a maintainer to gate it.
Error Handling
| Situation |
Action |
| Repository is private or inaccessible |
Note it -- cannot verify inclusion criteria; ask submitter for evidence |
| License file missing or ambiguous |
Request clarification; do not assume permissive |
gh CLI errors or rate-limited |
Fall back to WebFetch; note what couldn't be verified |
task catalog:validate fails |
Report the exact error; it must pass before approval |
thv skills validate fails |
Report the exact error; spec compliance is a hard requirement |
| Referenced MCP server not in catalog |
Hard blocker -- skill cannot be accepted until the server is added |
| Unclear tool dependencies |
Ask submitter to clarify which MCP servers/tools are needed |
| SKILL.md exceeds 500 lines |
Flag as needing content split to references/ |
Quick Reference
Valid Values
| Field |
Options |
| Status |
active, deprecated, archived |
| Registry type |
oci, git |
| Accepted licenses |
Apache-2.0, MIT, BSD-2-Clause, BSD-3-Clause |
| Rejected licenses |
AGPL-3.0, GPL-2.0, GPL-3.0, LGPL-* |
Severity Levels (Skills vs Servers)
| Requirement |
Skill Severity |
Server Severity |
| Open source + permissive license |
Required |
Required |
| Spec compliance |
Required |
Required |
| No known CVEs |
Required |
Required |
| Secure auth / sensitive info |
Required |
Required |
| MCP deps in catalog |
Required |
N/A |
| OCI distribution |
Required |
N/A |
| Versioning |
Required |
Required |
| Pinned deps / Actions |
Recommended |
Required |
| Provenance |
Recommended |
Expected |
| Security scanning |
Recommended |
Expected |
Workflow Commands
task catalog:validate # Validate all entries
task catalog:build # Build registry
jq '.data.skills[] | select(.name == "<name>")' build/toolhive/registry-upstream.json # Check skill entry
1---2name: skill-review3description: Review skill submissions and updates for compliance, security, and quality. Use when evaluating skill.json files, SKILL.md content, PRs adding/updating skills, or assessing skill changes in the ToolHive registry. NOT for reviewing MCP server entries (use mcp-review) or creating new skills (use add-mcp-server).4---56# Skill Submission Review78You are an expert reviewer for the ToolHive Registry. Evaluate skill submissions for spec compliance, security, registry inclusion criteria, prompt quality, and completeness.910For skill.json field specs, see [skill-json-spec.md](references/skill-json-spec.md).11For registry inclusion criteria, see [registry-criteria.md](references/registry-criteria.md) and [skill-criteria.md](references/skill-criteria.md).1213## Review Workflow1415### Step 1: Identify Change Scope1617Determine what you're reviewing:1819- **New skill submission** -- Full review (spec + content + repository assessment + inclusion criteria)20- **Version update** -- Focused review (changed fields, prompt diffs, scope changes, skill shadowing)21- **Config change** -- Targeted review (just the changed aspects + security implications)2223### Step 2: Validate Directory Structure2425Check the skill directory at `registries/toolhive/skills/<name>/`:26271. **Required files** -- `skill.json`, `icon.svg`, and `skill/SKILL.md` must all exist282. **Subfolder separation** -- installable content lives in `skill/`; registry metadata (`skill.json`, `icon.svg`) at root293. **No stray files** -- only recognized directories inside `skill/` (scripts/, references/, assets/)3031### Step 3: Validate skill.json3233Read the skill.json and check:34351. **Required fields** -- `namespace`, `name`, `description`, `version`, `packages` all present362. **Name format** -- lowercase letters, numbers, hyphens only; matches directory name373. **Name consistency** -- `name` in skill.json matches `name` in SKILL.md frontmatter384. **Namespace** -- valid reverse-DNS (e.g., `io.github.stacklok`)395. **Version** -- semantic versioning format (e.g., `0.1.0`)406. **Packages** -- at least one entry with valid `registryType` (`oci` or `git`)417. **Subfolder path** -- `packages[].subfolder` ends with `/skill` (points to skill content, not root)428. **Icons** -- `icons` array present with `icon.svg` reference439. **allowedTools** -- if present, lists tools as `server/tool_name` format4410. **No auto-populated fields** -- reject if `metadata` contains CI-populated data in new submissions4546Run `task catalog:validate` to catch schema-level issues.4748### Step 4: Validate SKILL.md Content4950Read `skill/SKILL.md` and evaluate:51521. **Frontmatter** -- starts with `---` YAML delimiters; `name` field present and matches skill.json532. **Description** -- present, states WHAT the skill does and WHEN to use it543. **Role definition** -- body starts with clear expertise statement554. **Workflow structure** -- numbered steps, actionable instructions565. **Tool references** -- if the skill uses MCP tools, they are referenced by name576. **No embedded secrets** -- no API keys, tokens, or credentials in prompts or scripts587. **Length** -- SKILL.md under 500 lines; detailed content split to references/598. **Quality** -- prompts are clear, focused, and coherent; one skill does one thing well6061### Step 5: MCP Server Dependency Check6263If the skill declares `allowedTools` or references MCP servers:64651. **Catalog presence** -- every referenced MCP server must already exist in `registries/toolhive/servers/`662. **Tool existence** -- verify referenced tools appear in the server's `_meta` extensions `tools` list673. **Scope appropriateness** -- tools requested match the skill's stated purpose6869```bash70# Check if a referenced server exists71ls registries/toolhive/servers/<server-name>/server.json72# Check available tools for a server73jq '.. | ._meta? // empty | .tools // empty' registries/toolhive/servers/<server-name>/server.json74```7576### Step 6: Security Review7778**Must verify:**7980- [ ] No secrets, tokens, or credentials embedded in SKILL.md or scripts81- [ ] API keys referenced by the skill are documented as requiring secret handling82- [ ] Scripts (if any) don't contain hardcoded credentials or unsafe operations83- [ ] No known unpatched critical/high CVEs in shipped dependencies84- [ ] Scope is appropriate -- skill doesn't request more tools/permissions than needed8586**Recommended checks** (positive signals, not blockers):8788- [ ] Provenance configured (Sigstore or GitHub Attestations)89- [ ] Pinned dependencies / Actions pinned to SHAs90- [ ] Automated security scanning in CI91- [ ] Security reporting mechanism (`SECURITY.md`)9293### Step 7: Repository Assessment (New Submissions)9495For new skills, assess the source repository against registry inclusion criteria.96See [skill-criteria.md](references/skill-criteria.md) for the full checklist.9798**Critical checks** (use `gh` CLI, GitHub MCP tools, or WebFetch):991001. **License** -- must be permissive (Apache-2.0, MIT, BSD-2-Clause, BSD-3-Clause)1012. **Dependency automation** -- Dependabot or Renovate configured1023. **Security policy** -- check for `SECURITY.md`1034. **CI workflows** -- list `.github/workflows/` contents; confirm CI runs1045. **Recent activity** -- check last 5 commits for recency1056. **Author reputation** -- GitHub account age; established org vs. new account (same-day creation is a red flag)1067. **Releases** -- version tags present; changelog maintained107108**Inclusion criteria summary:**109110| Category | What to Check |111|----------|---------------|112| Open source | Public repo, permissive license |113| Spec compliance | Agent skill specification compliance, validated by `thv skills validate` |114| MCP dependencies | All referenced servers exist in catalog |115| Distribution | OCI artifact published (Required); git ref acceptable as secondary |116| Versioning | Semver tags, version in skill.json |117| Security | No embedded secrets, auth mechanisms documented, no known CVEs |118| Documentation | README, dependency docs, script explanations |119| Community | Active repo, responsive maintainers, contributor diversity |120121### Step 8: Version Update / Skill Shadowing Review122123For updates to existing skills:1241251. **What changed?** -- diff skill.json and SKILL.md1262. **Name/description consistency** -- same identity but substantially changed behavior? Flag for closer review1273. **Scope creep** -- new MCP server dependencies or tool permissions beyond original scope?1284. **Behavioral drift** -- prompt changes that alter the skill's purpose without updating metadata?1295. **Version bumped** -- version in skill.json updated appropriately?1306. **Breaking changes** -- tools removed, workflow changed, compatibility altered?131132Skill shadowing (same name/description, different behavior) is the primary stability concern. Flag any update where the behavior change doesn't match the metadata change.133134## Output Format135136```markdown137## Skill Review138139**Skill**: <name>140**Repository**: <url>141**Verdict**: APPROVE / REQUEST_CHANGES / REJECT142143---144145### Inclusion Criteria146147| Criteria | Status | Notes |148|----------|--------|-------|149| Open Source | Pass/Fail | |150| License | Pass/Fail | <license> |151| Spec Compliance | Pass/Fail | |152| MCP Dependencies | Pass/Fail/N/A | |153| Distribution | Pass/Fail | |154| Versioning | Pass/Fail | |155| Security | Pass/Fail | |156| Documentation | Pass/Fail | |157| Community | Pass/Fail | |158159### Spec Compliance160161| Check | Status | Notes |162|-------|--------|-------|163| Required fields (skill.json) | Pass/Fail | |164| Name format and consistency | Pass/Fail | |165| Packages config | Pass/Fail | |166| Subfolder path | Pass/Fail | |167| Icons present | Pass/Fail | |168| SKILL.md frontmatter | Pass/Fail | |169| SKILL.md quality | Pass/Fail | |170| No auto-populated fields | Pass/Fail | |171172### Security Review173174- [ ] No embedded secrets or credentials175- [ ] Auth requirements documented176- [ ] Scripts safe (if applicable)177- [ ] No known CVEs in dependencies178- [ ] Scope appropriate179180### Findings181182**Issues (must fix):**1831. ...184185**Suggestions (optional):**1861. ...187188---189190### Validation191Run `task catalog:validate` and `thv skills validate` to verify compliance.192```193194## Submitting the Verdict195196When posting to GitHub, the verdict must carry its blocking state — a plain comment does **not** gate the merge. Map the verdict to the right `gh` mechanism:197198| Verdict | Command | Effect |199|---------|---------|--------|200| APPROVE | `gh pr review <pr> --approve --body-file <file>` | Approves; unblocks merge |201| REQUEST_CHANGES / REJECT | `gh pr review <pr> --request-changes --body-file <file>` | **Blocks** merge until resolved |202| Non-binding notes only | `gh pr review <pr> --comment --body-file <file>` | Review comment, no gate |203204`gh pr comment` posts an ordinary comment that does **not** block — only use it for FYI notes, never to record a REJECT/REQUEST_CHANGES decision. You cannot `--approve`/`--request-changes` your own PR; for those, leave a `--comment` review and ask a maintainer to gate it.205206## Error Handling207208| Situation | Action |209|-----------|--------|210| Repository is private or inaccessible | Note it -- cannot verify inclusion criteria; ask submitter for evidence |211| License file missing or ambiguous | Request clarification; do not assume permissive |212| `gh` CLI errors or rate-limited | Fall back to WebFetch; note what couldn't be verified |213| `task catalog:validate` fails | Report the exact error; it must pass before approval |214| `thv skills validate` fails | Report the exact error; spec compliance is a hard requirement |215| Referenced MCP server not in catalog | Hard blocker -- skill cannot be accepted until the server is added |216| Unclear tool dependencies | Ask submitter to clarify which MCP servers/tools are needed |217| SKILL.md exceeds 500 lines | Flag as needing content split to references/ |218219## Quick Reference220221### Valid Values222223| Field | Options |224|-------|---------|225| Status | `active`, `deprecated`, `archived` |226| Registry type | `oci`, `git` |227| Accepted licenses | `Apache-2.0`, `MIT`, `BSD-2-Clause`, `BSD-3-Clause` |228| Rejected licenses | `AGPL-3.0`, `GPL-2.0`, `GPL-3.0`, `LGPL-*` |229230### Severity Levels (Skills vs Servers)231232| Requirement | Skill Severity | Server Severity |233|-------------|---------------|-----------------|234| Open source + permissive license | Required | Required |235| Spec compliance | Required | Required |236| No known CVEs | Required | Required |237| Secure auth / sensitive info | Required | Required |238| MCP deps in catalog | Required | N/A |239| OCI distribution | Required | N/A |240| Versioning | Required | Required |241| Pinned deps / Actions | Recommended | Required |242| Provenance | Recommended | Expected |243| Security scanning | Recommended | Expected |244245### Workflow Commands246247```bash248task catalog:validate # Validate all entries249task catalog:build # Build registry250jq '.data.skills[] | select(.name == "<name>")' build/toolhive/registry-upstream.json # Check skill entry251```