Skip to content
kazma.
ع Star 6 Get Started

Skill Manifest Spec

Version: 1.0.0 | Status: Active | Last updated: 2026-06-20

This document defines the formal specification for Kazma skill manifests (skill_manifest.yaml). Every skill installed in Kazma MUST include a valid manifest file at its root directory.



A skill manifest is a YAML file (skill_manifest.yaml) located at the root of a skill directory. It declares the skill’s identity, capabilities, dependencies, permissions, and runtime configuration.

my-skill/
├── skill_manifest.yaml # This file
├── main.py # Entry point (optional)
└── ...

The validator looks for skill_manifest.yaml specifically (not manifest.yaml or manifest.yml).


# ─── Required Fields ────────────────────────────────────────────────
name: string # kebab-case identifier
version: string # semver X.Y.Z
description: string # human-readable description
author: string # author name or organization
license: string # SPDX license identifier
# ─── Optional Fields ────────────────────────────────────────────────
capabilities: [string] # list of capability tags
dependencies: # dependency constraints
core: string # minimum core version (semver range)
optional: [string] # optional Python package names
mcp_servers: # MCP server configurations
- name: string # server identifier
type: string # transport type (stdio|sse|streamable-http)
command: [string] # command to start server (for stdio)
url: string # server URL (for sse/streamable-http)
env: {string: string} # environment variables
permissions: # permission declarations
required: [string] # permissions needed for core functionality
optional: [string] # permissions for enhanced features
entry_point: string # dotted module path or file name (without .py)
config_schema: object # JSON Schema for skill configuration
min_core_version: string # minimum Kazma core version (semver)
tags: [string] # searchable tags
homepage: string # project homepage URL
repository: string # source repository URL

All five required fields MUST be present. Validation fails if any are missing.

  • Type: string
  • Pattern: ^[a-z][a-z0-9-]*$ (kebab-case)
  • Description: Unique identifier for the skill. Must start with a lowercase letter, contain only lowercase letters, digits, and hyphens.
  • Examples: drone-inspector, oil-pricing-v2, arabic-ocr

Validation errors:

  • Missing field → "Missing required field: name"
  • Invalid format → "Name must be kebab-case, got: 'MySkill'"
  • Type: string
  • Pattern: ^\d+\.\d+\.\d+$ (simple semver)
  • Description: Semantic version of the skill.
  • Examples: 1.0.0, 0.1.0, 2.3.1

Validation errors:

  • Missing field → "Missing required field: version"
  • Invalid format → "Version must be valid semver (X.Y.Z), got: 'v1.0.0'"

Note: Pre-release suffixes (1.0.0-beta) and build metadata (1.0.0+build) are NOT supported. Use simple X.Y.Z only.

  • Type: string
  • Description: A brief, human-readable description of the skill’s purpose.
  • Examples: "Read files from the filesystem", "Arabic OCR with RTL layout support"
  • Type: string
  • Description: Name of the skill author or organization.
  • Examples: "ALMuhalab International Holding Group", "Jane Doe"
  • Type: string
  • Description: SPDX license identifier.
  • Examples: MIT, Apache-2.0, GPL-3.0-only

Validation errors:

  • Empty or whitespace-only → "License must be a non-empty string"

These fields are not required but enhance skill functionality and discoverability.

  • Type: list[string]
  • Description: Tags describing what the skill can do. Used for conflict detection when two skills share capabilities.
  • Examples: ["drone_inspection", "trading_intelligence"], ["audio", "video"]
  • Type: object
  • Description: Python package dependencies.
  • Sub-fields:
    • core (string): Minimum Kazma core version required (e.g., ">=0.1.0")
    • optional (list[string]): Optional Python packages the skill uses
dependencies:
core: ">=0.1.0"
optional:
- numpy
- paho-mqtt
- opencv-python
  • Type: list[object]
  • Description: MCP (Model Context Protocol) servers this skill requires.
  • Each entry must have: name (string) and type (string)
  • See: MCP Server Configuration
  • Type: object or list[string]
  • Description: Permissions the skill requires. Can be a simple list or structured with required/optional sub-lists.
  • See: Permission Model
# Simple form
permissions:
- file_read
- network_outbound
# Structured form
permissions:
required:
- file_read
optional:
- camera_access
  • Type: string
  • Description: The Python module path or file name (without .py extension) that serves as the skill’s entry point.
  • Examples: "main", "my_skill.main:run", "src.plugin"

Warnings:

  • Relative paths (containing / or starting with .) generate a warning: use dotted module paths instead.
  • Type: object
  • Description: JSON Schema defining the skill’s configuration options. Used by the UI to generate configuration forms.
config_schema:
type: object
properties:
api_key:
type: string
description: "API key for external service"
max_retries:
type: integer
default: 3
required:
- api_key
  • Type: string
  • Pattern: ^\d+\.\d+\.\d+$ (semver)
  • Description: Minimum Kazma core version required to run this skill. If the installed core version is lower, the skill will not be loaded.
  • Examples: "0.5.0", "1.0.0"
  • Type: list[string]
  • Description: Searchable tags for skill discovery in the hub.
  • Examples: ["testing", "example"], ["data", "oil-gas"]
  • Type: string (URL)
  • Description: Project homepage URL.
  • Example: "https://example.com/my-skill"
  • Type: string (URL)
  • Description: Source code repository URL.
  • Example: "https://github.com/example/my-skill"

FieldRequiredTypeDefaultDescription
nameYesstring (kebab)—Unique skill identifier
versionYesstring (semver)—Semantic version
descriptionYesstring—Human-readable description
authorYesstring—Author or organization
licenseYesstring (SPDX)—License identifier
capabilitiesNolist[string][]Capability tags
dependenciesNoobject{}Python package dependencies
mcp_serversNolist[object][]MCP server configurations
permissionsNoobject/list[]Permission declarations
entry_pointNostringNoneModule entry point
config_schemaNoobjectNoneJSON Schema for config
min_core_versionNostring (semver)NoneMinimum core version
tagsNolist[string][]Searchable tags
homepageNostring (URL)NoneProject homepage
repositoryNostring (URL)NoneSource repository

Permissions declare what system resources the skill needs access to. Kazma validates permissions against an allowlist and scores unknown permissions.

PermissionDescription
file_readRead files from the filesystem
file_writeWrite/create files on the filesystem
network_outboundMake outbound network requests
network_inboundAccept inbound network connections
camera_accessAccess device camera
mqtt_brokerConnect to MQTT brokers
database_readRead from databases
database_writeWrite to databases

Simple list (all required):

permissions:
- file_read
- network_outbound

Structured (required + optional):

permissions:
required:
- file_read
- network_outbound
optional:
- camera_access
- mqtt_broker
  • Each permission is checked against the allowlist
  • Unknown permissions generate a warning and deduct -5 from the security score
  • Permissions do not cause validation failures (they are advisory)

MCP servers provide external tool capabilities to skills. Each server entry requires name and type.

FieldTypeDescription
namestringServer identifier (unique)
typestringTransport type (see below)
TypeDescriptionAdditional Fields
stdioLocal process via stdin/stdoutcommand, env
sseServer-Sent Events HTTP endpointurl
streamable-httpStreamable HTTP endpointurl
mcp_servers:
- name: oil-pricing-api
type: stdio
command: ["python", "-m", "oil_pricing_server"]
env:
API_KEY: "${OIL_API_KEY}"
mcp_servers:
- name: remote-analytics
type: sse
url: "https://analytics.example.com/mcp"
  • Missing name → error
  • Missing type → error
  • Invalid type → error (must be stdio, sse, or streamable-http)
  • Non-list mcp_servers → error

Kazma uses strict semver (X.Y.Z) for all version fields.

MAJOR.MINOR.PATCH
  • MAJOR (X): Breaking changes
  • MINOR (Y): New features, backward-compatible
  • PATCH (Z): Bug fixes, backward-compatible
  1. All three parts MUST be present: 1.0 is invalid, 1.0.0 is valid
  2. Parts MUST be non-negative integers: 1.0.0 is valid, -1.0.0 is not
  3. No pre-release suffixes: 1.0.0-beta is invalid
  4. No build metadata: 1.0.0+build123 is invalid
  5. No v prefix: v1.0.0 is invalid

The min_core_version field uses semver comparison:

# Pseudo-code
skill_version >= min_core_version

Example: A skill with min_core_version: "0.5.0" requires core version 0.5.0 or higher.

When installing a new skill:

  • Same name: Replacement (with warning)
  • Same capabilities: Warning (potential conflict)
  • Cross-version: Compatibility check via min_core_version

Validation is performed by SkillValidator (in kazma-core/kazma_core/hub/validator.py) which runs five checks:

Check 1: Manifest Exists and Is Valid YAML

Section titled “Check 1: Manifest Exists and Is Valid YAML”
  • skill_manifest.yaml must exist in the skill root
  • Must be a valid YAML mapping (not a list or scalar)
  • Penalty: -30 points if missing or invalid
  • If entry_point is declared, the corresponding .py file must exist
  • Example: entry_point: main requires main.py
  • Penalty: -10 points if missing
  • Each permission is checked against the allowlist
  • Unknown permissions generate warnings
  • Penalty: -5 points per unknown permission
  • Each server must have name and type
  • type must be one of: stdio, sse, streamable-http
  • Penalty: validation failure (errors list)

All .py files in the skill directory are scanned for dangerous patterns:

PatternDetectionPenalty
eval()eval\s*\(-20
exec()exec\s*\(-20
__import__\b__import__\b-15
os.system()os\.system\s*\(-25
Hardcoded secretsVarious patterns-10/file

Secret patterns detected:

  • api_key = "..." or api_secret = "..."
  • password = "..." or passwd = "..."
  • secret = "..." or secret_key = "..."
  • token = "..." or access_token = "..."
  • Base score: 100
  • Each check returns a delta (0 or negative)
  • Final score: max(0, min(100, 100 + sum(deltas)))
  • Validation passes only if there are zero errors
  • Warnings are advisory (do not block installation)

The security score (0-100) reflects the skill’s safety profile:

Score RangeRatingMeaning
90-100ExcellentNo issues, safe to install
70-89GoodMinor warnings, generally safe
50-69CautionSeveral issues, review before installing
0-49RiskySignificant security concerns

A skill receives the Kazma-Certified badge when:

  1. Validation passes (zero errors)
  2. Security score >= 90
  3. All required fields are present
  4. MCP servers use valid types
  5. No hardcoded secrets detected

name: hello-world
version: 1.0.0
description: "A simple hello world skill"
author: "Example Author"
license: MIT
name: drone-inspection
version: 2.1.0
description: "AI-powered drone inspection with YOLO detection and telemetry"
author: "ALMuhalab International Holding Group"
license: Apache-2.0
capabilities:
- drone_inspection
- computer_vision
- telemetry_analysis
dependencies:
core: ">=0.5.0"
optional:
- numpy
- opencv-python
- paho-mqtt
mcp_servers:
- name: oil-pricing-api
type: stdio
command: ["python", "-m", "oil_pricing_server"]
- name: mqtt-broker
type: sse
url: "mqtt://broker.local:1883"
permissions:
required:
- file_read
- file_write
- network_outbound
- mqtt_broker
optional:
- camera_access
entry_point: main
config_schema:
type: object
properties:
broker_url:
type: string
default: "mqtt://localhost:1883"
yolo_model:
type: string
default: "yolov11"
required:
- broker_url
min_core_version: "0.5.0"
tags:
- drone
- inspection
- oil-gas
- computer-vision
homepage: "https://example.com/drone-inspection"
repository: "https://github.com/example/drone-inspection"

Enterprise Skill with Division Permissions

Section titled “Enterprise Skill with Division Permissions”
name: trading-intelligence
version: 1.0.0
description: "Market data analysis and trading intelligence for general trading division"
author: "ALMuhalab International Holding Group"
license: MIT
capabilities:
- trading_intelligence
- market_analysis
dependencies:
core: ">=0.1.0"
optional:
- pandas
- requests
mcp_servers:
- name: market-data-api
type: stdio
command: ["python", "-m", "market_data_server"]
- name: news-aggregator
type: sse
url: "https://news-api.example.com/mcp"
permissions:
required:
- network_outbound
- database_read
entry_point: intelligence_loop
min_core_version: "0.1.0"
tags:
- trading
- finance
- market-data
name: arabic-doc-processor
version: 1.0.0
description: "Process Arabic documents with RTL layout and diacritics support"
author: "Kazma Community"
license: MIT
capabilities:
- arabic_nlp
- document_processing
mcp_servers:
- name: arabic-ocr
type: stdio
command: ["npx", "-y", "@anthropic-ai/arabic-ocr-mcp"]
permissions:
required:
- file_read
- file_write
entry_point: processor
min_core_version: "0.1.0"
tags:
- arabic
- nlp
- rtl
- ocr

The manifest file MUST be named exactly skill_manifest.yaml (not manifest.yaml, manifest.yml, or any other variation).

# Lines starting with # are comments (YAML standard)
# Top-level keys are case-sensitive
# Use double quotes for strings containing special characters
name: my-skill
version: 1.0.0
description: "Description here"
author: "Author Name"
license: MIT
# ... optional fields ...
  • File MUST be valid UTF-8
  • YAML must parse without errors
  • Unicode characters are allowed (e.g., Arabic text in descriptions)
  • Maximum file size: 64 KB
  • Maximum number of MCP servers: 20
  • Maximum number of capabilities: 50
  • Maximum number of tags: 20