Skip to main content
Every custom skill starts with a SKILL.md file. This file has two parts: a YAML frontmatter header (between --- markers) that describes the skill, and a Markdown body that contains the instructions or code. This page documents every field available in the frontmatter. The authored frontmatter carries exactly six top-level fieldsname, description, license, compatibility, allowed-tools, and metadata. Every platform-specific extension rides under one metadata.comis key (documented below); nothing else is authored at the top level.

Required Fields

Every manifest must include these two fields: Here is a minimal SKILL.md that only uses the required fields:
That is all you need to create a valid skill. Everything below is optional.

Optional Fields

These four top-level fields give you more control over how the skill behaves:

Example with Optional Fields

Platform Extensions (metadata.comis)

Fields that only apply within Comis ride under a single metadata.comis key. Its value is a JSON string — so metadata stays a plain string→string map — that parses and then validates by the same rules as every other manifest field. The carrier moves, the semantics do not. Hosts that implement only the skill spec ignore this key. The metadata.comis JSON object may carry: The version is authored as metadata.version (a string in the metadata map), not inside the JSON carrier. Here is a skill that carries a couple of extensions through metadata.comis:
Malformed metadata.comis JSON fails to load with an error that names the key — fix the JSON string, do not remove the metadata map.

Permissions

The permissions object declares what system resources this skill needs. By default, skills have no access to the filesystem, network, or environment variables. Each permission you add opens a specific door. It is carried inside the metadata.comis JSON string:
Only grant the permissions your skill actually needs. Start with none and add them one at a time as required. This follows the principle of least privilege — the less access a skill has, the less damage a bug or malicious skill can cause.

Comis namespace

The comis object controls runtime requirements and platform-level behavior. It is carried inside the metadata.comis JSON string:
The comis.requires fields are checked at startup by the runtime eligibility system. If a required binary or environment variable is missing, the skill is skipped with a warning — it does not crash the system. You can disable this check with skills.runtimeEligibility.enabled: false in your config, but that is not recommended.

Input Schema

For skills that expect structured input, attach a JSON Schema under inputSchema inside the metadata.comis carrier. The schema is stored alongside the manifest and surfaced as documentation — agents can read it to understand what arguments the skill expects:
inputSchema is currently advisory: it documents the expected shape but is not enforced at invocation time. Treat it as a contract you and the agent agree to honor in the skill body, not a runtime guard.

Complete Example

Here is a full SKILL.md using the six top-level fields plus a metadata.comis carrier that bundles several extensions:

Read Compatibility

The legacy top-level form — extension fields authored directly at the top level (type, version, userInvocable, disableModelInvocation, allowedTools, argumentHint, permissions, inputSchema, comis, mcpServers) — still loads, emitting a deprecation warning that names each moved key and its new home:
  • version maps to metadata.version
  • userInvocable / disableModelInvocation / argumentHint / permissions / inputSchema / comis / mcpServers map to metadata.comis
  • allowedTools (array) maps to allowed-tools (space-separated string)
  • type is dropped — skills are prompt-only
It is read for compatibility only and is never written back. Author new skills in the spec-pure six-field form above.

Foreign-Frontmatter Mapping

When you import a skill authored for another ecosystem — or in the legacy Comis form above — its frontmatter is first converged onto the spec-pure shape, then validated. The internal manifest schema is closed, so an unmapped foreign key would otherwise reject the whole skill outright. The mapper never silently reinterprets a field. It assigns only a fixed set of known keys and drops everything else with a warning that names the exact key — so an operator can see precisely what was carried across and what was left behind.
Mapping is a format-compatibility step, not a trust decision. A mapped skill still runs through the fail-closed import scan and installs at the imported trust tier like any other import.

Template Substitution

Prompt skill bodies support placeholder syntax for dynamic content:
  • Named placeholders: {placeholder} — mapped by name from the input parameters
  • Positional arguments: $1, $2 (1-indexed), $@ or $ARGUMENTS (all arguments), ${@:N} (arguments from position N onwards)
Named placeholders are recommended for clarity. Positional arguments are available for quick one-off skills.

Prompt Skills

Step-by-step guide to creating your first prompt skill

Security Scanning

What Comis checks before loading your skill

Examples

Complete skill examples with walkthroughs