--- 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 fields — name, 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:
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
Thepermissions 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:
Comis namespace
Thecomis 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 underinputSchema 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 ametadata.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:
versionmaps tometadata.versionuserInvocable/disableModelInvocation/argumentHint/permissions/inputSchema/comis/mcpServersmap tometadata.comisallowedTools(array) maps toallowed-tools(space-separated string)typeis dropped — skills are prompt-only
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)
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
