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

FieldTypeRequiredDescription
namestringYesPackage identifier in vendor/slug format. Max 128 chars.
versionstringYesSemantic version in major.minor.patch format.
typeenumYesskill, rule, bundle, template, or mcp.
descriptionstringYesShort description. 1–1024 chars. Shown in search results.
targetsarrayYesAt least one of: cursor, claude-code, codex, gemini-cli, windsurf, openclaw, generic. Use generic as the catch-all for any unlisted agent runtime.
install_mapobjectNoOverride the default install path per target. Use {slug} as a placeholder.
entrypointstringNoPath to the primary file, relative to the archive root.
requires.toolsstring[]NoTool names this package requires. Informational only in v0.
licensestringNoSPDX 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

TypeDescription
skillA SKILL.md file following the agentskills.io specification. Teaches an agent a specific capability or workflow.
ruleConfiguration rules for an agent environment (e.g. Cursor rules, Claude instructions).
bundleA collection of multiple skills or rules packaged together.
templateA starter template or scaffold that agents can use to initialize a project.
mcpA 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.

ExtensionNotes
.mdScanned for secrets
.yaml, .ymlScanned for secrets
.jsonScanned for secrets
.txtScanned for secrets
.png, .jpg, .svgImages — 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

TargetDetectionDefault install path
cursor.cursor/ directory exists.cursor/skills/{slug}/
claude-code.claude/ directory exists.claude/skills/{slug}/
codex.codex/ directory existsmog_modules/{slug}/
gemini-cli.gemini/ directory exists.gemini/skills/{slug}/
windsurf.windsurf/ directory exists.windsurf/skills/{slug}/
openclaw.openclaw/ directory existsskills/{slug}/
genericfallbackmog_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

  1. Create a directory with your content files
  2. Write mog.yaml with the required fields
  3. Write a helpful README.md (shown on the listing page)
  4. Zip the directory: zip -r my-skill-1.0.0.zip my-skill/
  5. Upload via the seller dashboard or the API
  6. Wait for the scan to pass, then publish

See the seller guide for a full walkthrough including Stripe Connect setup and pricing.

On this page