Skip to content

Skills system

Author SKILL.md/SKILL.toml skills, run them via MCP meta-tools, and sync the open-skills library.

Skills are reusable, user-defined or community-built capabilities that extend your agent without recompiling Revka. A skill bundles markdown instructions, optional tool definitions (shell commands or HTTP calls), and metadata into a single directory on disk. Revka discovers skills at startup, injects them into the agent’s context, and exposes them to external MCP clients through three compact meta-tools instead of registering every skill as its own tool.

Use this page to understand the on-disk skill model, run skills over MCP, sync the community open-skills library, and configure autonomous skill creation and improvement. For installing, auditing, and testing skills from the command line, see revka skills, workflows & sop. For managing skills over HTTP, see the Agents, skills & teams API.

A skill lives in its own directory under your workspace:

~/.revka/workspace/skills/
release-notes/
SKILL.toml # or SKILL.md — the manifest (required)
PROMPT.md # optional external prompt content
TEST.sh # optional validation cases (see CLI page)

At startup Revka scans <workspace>/skills/ (and, when enabled, the open-skills directory) and loads every directory whose root contains a SKILL.md or SKILL.toml manifest. Each loaded skill contributes two things to the running agent:

  • Prompt content — the markdown body or prompts array, injected so the agent knows when and how to use the skill.
  • Tools — any [[tools]] entries, exposed to the agent as <skill_name>.<tool_name> (dot-separated). For example, a list_merged tool in the release-notes skill becomes release-notes.list_merged.

A manifest can be written in either of two formats.

A structured manifest with a [skill] table and an optional [[tools]] array:

[skill]
name = "release-notes"
description = "Summarize merged PRs into release notes."
version = "1.0.0" # defaults to "0.1.0" if omitted
author = "[email protected]" # optional
tags = ["git", "writing"] # optional
content_file = "PROMPT.md" # optional: external markdown used as prompt content
# Optional embedded prompt content (ignored when content_file is set)
prompts = [
"You write concise, accurate release notes.",
]
[[tools]]
name = "list_merged"
description = "List merged PRs since a tag."
kind = "shell" # "shell" | "script" | "http"
command = "gh pr list --state merged --search 'merged:>{{since}}'"
# args is a string→string map of named template parameters
[tools.args]
since = "v1.0.0"
FieldTypeDefaultMeaning
skill.namestring— (required)Unique skill name
skill.descriptionstring— (required)Human-readable purpose
skill.versionstring"0.1.0"Semantic version
skill.authorstringOptional author label
skill.tagsstring[][]Classification tags
skill.content_filestringPath (relative to the manifest) to a markdown file used as prompt content; when set, the embedded prompts array is ignored
promptsstring[][]Embedded prompt content injected into the agent
tools[]table[][]Tool definitions (see below)

A markdown file with YAML front matter for metadata and the body as prompt content. Use this form for instruction-only (“markdown-only”) skills, or add a [[tools]]-style section for tools:

---
name: code-review-checklist
description: A reusable checklist for reviewing pull requests.
version: 1.0.0
tags: [review, quality]
---
When reviewing a pull request, walk through this checklist:
1. Does every changed line trace to the stated intent?
2. Are error paths and edge cases covered by tests?
3. Are there secrets, credentials, or PII in the diff?

A markdown-only skill has no tools — its entire value is the instructions in the body, which the agent reads and follows.

Each [[tools]] entry declares a kind:

kindWhat it doesLimits
"shell" / "script"Executes a shell command via sh -c; supports {{arg_name}} template substitution60s timeout, 1 MB output cap, runs in a sandboxed environment (safe vars only)
"http"Performs a GET against a URL template30s timeout, 1 MB response cap, only http:// and https:// URLs allowed
FieldTypeMeaning
namestringTool name; exposed to the agent as <skill_name>.<tool_name>
descriptionstringWhat the tool does
kindstring"shell", "script", or "http"
commandstringThe shell command, script, or URL to run; supports {{arg_name}} substitution
argsmapOptional string→string map of named template parameters

Exposing every skill as a separate MCP tool would balloon a client’s tool list — a workspace can easily hold 50+ skills. Instead, Revka’s MCP server registers three compact meta-tools that let any external client (Claude Desktop, Claude Code, Codex, and so on) discover and run all your skills. These tools appear in the extended tool registry.

Lists every visible skill. Takes no parameters.

// tools/call → skills_list
{}

Returns a JSON array of skill summaries:

[
{
"id": "release-notes",
"name": "release-notes",
"description": "Summarize merged PRs into release notes.",
"version": "1.0.0",
"tags": ["git", "writing"],
"tool_count": 1,
"location": "workspace"
}
]

Returns the full body and metadata for a single skill, including its tools array.

// tools/call → skills_describe
{ "skill_id": "release-notes" }

Runs a skill’s sub-tool, or returns the body for a markdown-only skill.

// tools/call → skills_execute
{
"skill_id": "release-notes",
"tool": "list_merged", // optional; defaults to the first [[tools]] entry
"arguments": { "since": "v2.0.0" }
}
  • If tool is omitted, the skill’s first [[tools]] entry runs.
  • For a markdown-only skill, skills_execute returns the markdown body verbatim so the calling LLM can follow the instructions directly.

When the agent runs in compact prompt mode (prompt_injection_mode = "compact"), skill bodies are not pre-injected into the system prompt — only the skill names appear. The built-in read_skill tool loads a single skill’s source file on demand by name:

ParameterTypeMeaning
namestring (required)The exact skill name as listed in <available_skills>
// tool call → read_skill
{ "name": "release-notes" }

It returns the full file content (markdown or TOML). This keeps the system prompt small on low-context models while still letting the agent pull in a skill’s full instructions exactly when it needs them.

Open Skills is an optional community library synced from the besoeasy/open-skills GitHub repository. When enabled, Revka syncs the repository to a local directory on a 7-day interval and merges those skills into the agent’s visible skill set alongside your workspace skills.

[skills]
open_skills_enabled = true
open_skills_dir = "~/.revka/open-skills" # optional override
allow_scripts = false # keep scripts blocked

The [skills] section in ~/.revka/config.toml controls skill loading, the community library, and the autonomous create/improve behavior. Every key also has an environment-variable override.

[skills]
open_skills_enabled = false # opt-in community library
open_skills_dir = "~/open-skills"
prompt_injection_mode = "full" # "full" (inline) or "compact" (on-demand)
allow_scripts = false # allow script files in skills
[skills.skill_creation]
enabled = false # auto-create skills from successful tasks
max_skills = 500 # LRU eviction limit
similarity_threshold = 0.85 # dedup threshold
[skills.skill_improvement]
enabled = true # auto-improve skills after successful use
cooldown_secs = 3600 # min interval between improvements per skill
KeyDefaultEnv overrideMeaning
open_skills_enabledfalseREVKA_OPEN_SKILLS_ENABLEDEnable the open-skills community library
open_skills_dir~/open-skillsREVKA_OPEN_SKILLS_DIRLocal path for synced open skills
prompt_injection_mode"full"REVKA_SKILLS_PROMPT_MODEfull (inline) or compact (on-demand via read_skill)
allow_scriptsfalseREVKA_SKILLS_ALLOW_SCRIPTSAllow .sh/.ps1/shebang shell files in skills
skill_creation.enabledfalseAuto-create skills from successful multi-step tasks
skill_creation.max_skills500Cap on auto-generated skills; oldest evicted (LRU)
skill_creation.similarity_threshold0.85Embedding similarity above which a new skill is skipped as a duplicate
skill_improvement.enabledtrueAuto-improve a skill after it is used successfully
skill_improvement.cooldown_secs3600Minimum interval between improvements for the same skill

When skill_creation.enabled = true, Revka can autonomously create a new skill after a successful multi-step task, capturing the procedure for reuse. New skills are deduplicated against existing ones by embedding similarity (similarity_threshold, default 0.85), and the library is bounded by max_skills (default 500) with LRU eviction of the oldest auto-generated skills.

When skill_improvement.enabled = true (the default), Revka improves existing skills after they are used successfully, refining their instructions over time. A cooldown_secs (default 3600) prevents a single skill from being rewritten more than once per interval.

Both behaviors are opt-in-tunable and safe to leave at their defaults: improvement on, creation off.

Beyond disk-based skills, the Operator MCP maintains a versioned skill store in Kumiho graph memory. Operator skills are stored as SKILL.md artifacts under <memory_project>/Skills/ and carry effectiveness scores, so the system prompt builder can rerank skills by recency-weighted success. The operator exposes these MCP tools:

ToolPurpose
capture_skillCapture or update a skill as a Kumiho revision artifact
list_skillsList skills from Kumiho (optionally including legacy disk skills)
load_skillLoad a skill’s SKILL.md content by name or kref (tag defaults to "published")
get_skill_effectivenessRolling success rate from recorded outcomes
record_skill_outcomeRecord whether a skill use succeeded or failed
search_clawhubSearch the ClawHub marketplace
install_from_clawhubInstall a community skill by slug
browse_clawhubList trending ClawHub skills

The "published" tag marks the current active version of a skill. Skill effectiveness scoring (record_skill_outcomeget_skill_effectiveness) feeds back into prompt construction so well-performing skills surface first.

ClawHub is the skill marketplace for browsing and installing community skills. Anonymous browsing and installing work without a token; a token is only needed for publishing.

[clawhub]
enabled = true
api_url = "https://clawhub.ai"
api_token = "clh_..." # only needed for publishing

The dashboard surfaces ClawHub under its Skills view, backed by the gateway endpoints GET /api/clawhub/search, GET /api/clawhub/trending, GET /api/clawhub/skills/{slug}, and POST /api/clawhub/install/{slug}. See the Skills, tools & integrations dashboard pages.

The Revka dashboard’s skills UI is backed by the /api/skills gateway endpoints (all require bearer auth). Skills are stored as items of kind "skill" in the <memory_project>/Skills Kumiho space, with the content held as a SKILL.md artifact pointing at ~/.revka/workspace/skills/<slug>.md.

Method + pathPurpose
GET /api/skillsList skills; query params: include_deprecated, q (fulltext), page, per_page (max 50)
GET /api/skills/:krefFetch a single skill with full content
POST /api/skillsCreate a skill; body { name, description, content, domain, tags? }201 with { skill }
PUT /api/skills/:krefUpdate a skill (creates a new revision)
POST /api/skills/deprecateEnable/disable a skill; body { kref, deprecated: bool }
DELETE /api/skills/:krefPermanently delete a skill

The :kref is the path after kref://, for example CognitiveMemory/Skills/my-skill.skill. Responses are served from a 30-second in-process cache that is invalidated on any write. Full request and response shapes are documented on the Agents, skills & teams API page.