Skip to main content

SKILL.md

SKILL.md is a standard file format that describes an agent skill using YAML frontmatter and a Markdown body. The KnowledgePulse SDK adds an optional kp: extension block to the frontmatter, enabling knowledge capture configuration while remaining fully backward-compatible with non-KP tools.

Functions

parseSkillMd(content)

Parses a SKILL.md string into its structured components.

function parseSkillMd(content: string): ParsedSkillMd

Parameters:

ParameterTypeDescription
contentstringThe raw SKILL.md file content

Returns: ParsedSkillMd

interface ParsedSkillMd {
frontmatter: SkillMdFrontmatter; // Standard YAML fields
kp?: SkillMdKpExtension; // KnowledgePulse extension (if present)
body: string; // Markdown content after frontmatter
raw: string; // Original input string
}

Throws: ValidationError if the frontmatter is missing, the YAML is malformed, or required fields are absent.

Example:

import { parseSkillMd } from "@knowledgepulse/sdk";

const content = `---
name: code-reviewer
description: Reviews pull requests for code quality issues
version: "1.0.0"
author: acme-corp
tags:
- code-review
- quality
allowed-tools:
- github_pr_read
- github_pr_comment
kp:
knowledge_capture: true
domain: code-review
quality_threshold: 0.8
privacy_level: aggregated
visibility: network
reward_eligible: true
---

## Instructions

You are a code review assistant. Analyze the given pull request
and provide actionable feedback on code quality, security, and
best practices.
`;

const parsed = parseSkillMd(content);

console.log(parsed.frontmatter.name); // "code-reviewer"
console.log(parsed.frontmatter.tags); // ["code-review", "quality"]
console.log(parsed.kp?.knowledge_capture); // true
console.log(parsed.kp?.quality_threshold); // 0.8
console.log(parsed.body); // "\n## Instructions\n\nYou are a ..."

generateSkillMd(frontmatter, body, kp?)

Generates a SKILL.md string from structured components.

function generateSkillMd(
frontmatter: SkillMdFrontmatter,
body: string,
kp?: SkillMdKpExtension,
): string

Parameters:

ParameterTypeDescription
frontmatterSkillMdFrontmatterStandard YAML frontmatter fields
bodystringMarkdown body content
kpSkillMdKpExtension(optional) KnowledgePulse extension fields

Returns: A complete SKILL.md string with YAML frontmatter delimiters (---).

Example:

import { generateSkillMd } from "@knowledgepulse/sdk";

const skillMd = generateSkillMd(
{
name: "data-analyst",
description: "Analyzes datasets and produces insights",
version: "0.2.0",
tags: ["analytics", "data"],
"allowed-tools": ["sql_query", "chart_render"],
},
"## Instructions\n\nAnalyze the provided dataset and generate a summary report.",
{
knowledge_capture: true,
domain: "data-analysis",
quality_threshold: 0.7,
visibility: "org",
},
);

console.log(skillMd);
// ---
// name: data-analyst
// description: Analyzes datasets and produces insights
// version: "0.2.0"
// tags:
// - analytics
// - data
// allowed-tools:
// - sql_query
// - chart_render
// kp:
// knowledge_capture: true
// domain: data-analysis
// quality_threshold: 0.7
// visibility: org
// ---
//
// ## Instructions
//
// Analyze the provided dataset and generate a summary report.

validateSkillMd(content)

Validates a SKILL.md string without throwing. Runs both sanitization and schema validation, collecting all errors.

function validateSkillMd(content: string): {
valid: boolean;
errors: string[];
}

Parameters:

ParameterTypeDescription
contentstringThe raw SKILL.md file content

Returns: An object with valid (boolean) and errors (array of human-readable strings). When valid is true, the errors array may still contain non-fatal warnings (e.g., "Warning: Removed HTML comments").

Example:

import { validateSkillMd } from "@knowledgepulse/sdk";

// Valid document
const good = validateSkillMd(`---
name: my-skill
description: A helpful skill
---

Instructions here.
`);
console.log(good.valid); // true
console.log(good.errors); // []

// Invalid document (missing required fields)
const bad = validateSkillMd(`---
name: my-skill
---

No description field.
`);
console.log(bad.valid); // false
console.log(bad.errors);
// [
// "Invalid SKILL.md frontmatter",
// " description: Required"
// ]

SKILL.md Format

A SKILL.md file consists of two sections separated by YAML frontmatter delimiters (---):

---
<YAML frontmatter>
---

<Markdown body>

Standard Frontmatter Fields

FieldTypeRequiredDescription
namestringYesUnique skill identifier
descriptionstringYesHuman-readable description
versionstringNoSemantic version
authorstringNoAuthor or organization
licensestringNoSPDX license identifier
tagsstring[]NoSearchable tags
allowed-toolsstring[]NoMCP tools this skill may invoke

KnowledgePulse Extension (kp:)

The kp: block is an optional nested object within the frontmatter. It configures how the KnowledgePulse protocol interacts with this skill.

FieldTypeDefaultDescription
knowledge_captureboolean--Enable automatic knowledge capture for this skill
domainstring--Task domain used for knowledge classification
quality_thresholdnumber--Minimum quality score (0.0-1.0) for captured knowledge to be contributed
privacy_levelPrivacyLevel--Privacy level for captured knowledge
visibilityVisibility--Visibility scope for captured knowledge
reward_eligibleboolean--Whether contributions from this skill are eligible for token rewards

Backward Compatibility

The kp: extension is designed to be fully backward-compatible:

  • Tools that do not understand the kp: key will simply ignore it during YAML parsing.
  • The kp: fields are all optional; a SKILL.md file works without them.
  • Standard fields (name, description, tags, etc.) remain unchanged.

This means you can add KnowledgePulse configuration to any existing SKILL.md file without breaking tools that consume the standard format.

Error Handling

When parseSkillMd encounters invalid input, it throws a ValidationError with a structured issues array:

import { parseSkillMd, ValidationError } from "@knowledgepulse/sdk";

try {
parseSkillMd(invalidContent);
} catch (err) {
if (err instanceof ValidationError) {
console.error(err.message);
// "Invalid SKILL.md frontmatter"

for (const issue of err.issues) {
console.error(` ${issue.path}: ${issue.message}`);
// "description: Required"
// "kp.quality_threshold: Number must be less than or equal to 1"
}
}
}

Each entry in the issues array contains:

FieldTypeDescription
pathstringDot-delimited path to the invalid field (e.g., "kp.quality_threshold")
messagestringHuman-readable description of the validation failure

For kp: extension errors, paths are prefixed with kp. to distinguish them from standard frontmatter errors.