Package format
mog.yaml schema, package directory structure, lockfile format, and install targets.
A mog package is a .zip archive containing a manifest, a README, and your content files. This page documents everything you need to create and publish a valid package.
Directory structure
your-package/
mog.yaml # Required — distribution manifest
README.md # Required — displayed on the listing page
CHANGELOG.md # Optional — version history
content/
SKILL.md # Your main content (standard agentskills.io format)
reference.md # Additional content files
assets/
diagram.png # Images are supported
The archive can have any top-level directory name — the CLI strips it during extraction. The important thing is that mog.yaml and README.md exist at the root level of that top-level directory.
mog.yaml schema
mog.yaml is the package manifest. Every field is validated on upload. The scan worker will reject the release if mog.yaml is missing or invalid.
name: acme/router-eval # vendor/slug — see naming rules below
version: 1.0.0 # semver (major.minor.patch)
type: skill # skill | rule | bundle | template
description: >
Comprehensive router evaluation patterns for React applications.
Works with React Router v6 and TanStack Router.
targets:
- cursor
- claude-code
- generic
install_map: # optional — override default install paths
cursor: .cursor/skills/{slug}/
claude-code: .claude/skills/{slug}/
entrypoint: content/SKILL.md # optional — primary file for agent consumption
requires: # optional — tool requirements
tools:
- react-router
license: MIT # optional, defaults to MIT
readme: README.md # optional — path to readme (default: README.md)
Field reference
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Package identifier in vendor/slug format. Max 128 chars. |
version | string | Yes | Semantic version in major.minor.patch format. |
type | enum | Yes | skill, rule, bundle, template, or mcp. |
description | string | Yes | Short description. 1–1024 chars. Shown in search results. |
targets | array | Yes | At least one of: cursor, claude-code, codex, gemini-cli, windsurf, openclaw, generic. Use generic as the catch-all for any unlisted agent runtime. |
install_map | object | No | Override the default install path per target. Use {slug} as a placeholder. |
entrypoint | string | No | Path to the primary file, relative to the archive root. |
requires.tools | string[] | No | Tool names this package requires. Informational only in v0. |
license | string | No | SPDX license identifier. Defaults to MIT. |
Naming rules
- Format:
vendor/package-name - Both parts: lowercase letters, numbers, and hyphens only
- No dots, underscores, or uppercase letters
- Examples:
acme/react-testing-skill,my-org/gpt4o-rules
Package types
| Type | Description |
|---|---|
skill | A SKILL.md file following the agentskills.io specification. Teaches an agent a specific capability or workflow. |
rule | Configuration rules for an agent environment (e.g. Cursor rules, Claude instructions). |
bundle | A collection of multiple skills or rules packaged together. |
template | A starter template or scaffold that agents can use to initialize a project. |
mcp | A runnable MCP (Model Context Protocol) server. Installed by writing config to the client's MCP config (e.g. mcpServers in JSON clients, or mcp.servers for OpenClaw) rather than extracting files. See MCP Servers. |
Allowed file extensions (scan)
The upload scan applies different allowlists by package type so content-only packages stay tight while MCP packages can include source and config files.
skill, rule, bundle, template
These types are content-focused. Allowed extensions include Markdown, YAML, JSON, plain text, and common images. Executable or unexpected extensions cause the scan to fail. Text-like files are scanned for accidental secrets; images are not.
| Extension | Notes |
|---|---|
.md | Scanned for secrets |
.yaml, .yml | Scanned for secrets |
.json | Scanned for secrets |
.txt | Scanned for secrets |
.png, .jpg, .svg | Images — not scanned for secrets |
Extensions such as .js, .sh, .py, and .exe are not allowed for these package types.
mcp
MCP packages may include additional file types needed for runnable servers and tooling (for example TypeScript, JavaScript, Python, shell scripts, and lockfiles). See MCP Servers for the full MCP allowlist.
Install targets and paths
| Target | Detection | Default install path |
|---|---|---|
cursor | .cursor/ directory exists | .cursor/skills/{slug}/ |
claude-code | .claude/ directory exists | .claude/skills/{slug}/ |
codex | .codex/ directory exists | mog_modules/{slug}/ |
gemini-cli | .gemini/ directory exists | .gemini/skills/{slug}/ |
windsurf | .windsurf/ directory exists | .windsurf/skills/{slug}/ |
openclaw | .openclaw/ directory exists | skills/{slug}/ |
generic | fallback | mog_modules/{slug}/ |
To override the path for a specific target:
install_map:
cursor: .cursor/rules/{slug}/ # install to rules/ instead of skills/
claude-code: .claude/memory/{slug}/
gemini-cli: .gemini/rules/{slug}/
MCP packages (type: mcp) do not use install_map — their install location is always a client config file. See MCP Servers for the full mcp field reference.
The lockfile (mog.lock.json)
Every mog install or mog update writes to mog.lock.json in your project root. Commit this file to version control — it makes your installs fully reproducible.
{
"version": 1,
"lockfileVersion": "1.0.0",
"generatedAt": "2026-01-15T10:00:00.000Z",
"packages": {
"acme/router-eval": {
"name": "acme/router-eval",
"vendor": "acme",
"slug": "router-eval",
"version": "1.0.0",
"listingId": "uuid",
"releaseId": "uuid",
"entitlementId": "uuid",
"installedAt": "2026-01-15T10:00:00.000Z",
"target": "cursor",
"installPath": "/my-project/.cursor/skills/router-eval/",
"archiveSha256": "a3f8c2d1...",
"updateChannel": "minor",
"files": [
{
"path": "content/SKILL.md",
"sha256": "b1c9d2e3...",
"size": 4096
}
]
}
}
}
Creating a package
- Create a directory with your content files
- Write
mog.yamlwith the required fields - Write a helpful
README.md(shown on the listing page) - Zip the directory:
zip -r my-skill-1.0.0.zip my-skill/ - Upload via the seller dashboard or the API
- Wait for the scan to pass, then publish
See the seller guide for a full walkthrough including Stripe Connect setup and pricing.