Early Access · All certifications are currently free. Learn more

What is it?

A single JSON file called sxm-manifest.json that you put in your project's root folder. It describes your AI skill so our evaluator knows how to test it.

Why do I need it?

Without the manifest, we don't know what your skill is supposed to do. We can't test inputs if we don't know what they are. We can't check security if we don't know what permissions it needs. The manifest is how your skill tells us "here's what I am, test me."

Do I need to be technical?

You need to know what your skill does. That's it. The manifest is just a structured way of writing that down. If you can describe your skill in plain English, you can write a manifest.

Quick Start (5 minutes)

  1. Create the file — Make a new file called sxm-manifest.json in your project root
  2. Copy the template below — Start with our minimal example and fill in your details
  3. Describe your inputs — What does your skill accept? A text prompt? A file? A URL?
  4. Describe your outputs — What does it return? A score? A report? A modified file?
  5. List failure modes — What happens when things go wrong? API timeout? Bad input?
  6. Submit for certification — Use the API or CI/CD integration to submit

Pro tip: Start with a minimal manifest (just the required fields). You can add optional fields later. A simple honest manifest scores better than a complex dishonest one.

Minimal Example

This is the absolute minimum you need. Copy it, change the values, done.

{
  "name": "My AI Skill",
  "version": "1.0.0",
  "description": "What your skill does in one sentence",
  "platform": "generic",
  "category": "other",
  "inputs": [
    {
      "name": "text",
      "type": "string",
      "required": true,
      "description": "The text to process"
    }
  ],
  "outputs": [
    {
      "name": "result",
      "type": "string",
      "description": "The processed output"
    }
  ],
  "failure_modes": [
    {
      "condition": "Invalid input",
      "behaviour": "Returns error message"
    }
  ],
  "data_handling": "No data stored. All processing in memory.",
  "author": "Your Name",
  "author_email": "you@example.com"
}

Complete Example

{
  "name": "My Threat Detector",
  "version": "1.2.0",
  "description": "Real-time prompt injection detection and content safety scoring",
  "platform": "claude",
  "category": "security",
  "inputs": [
    {
      "name": "prompt",
      "type": "string",
      "required": true,
      "description": "The user prompt to analyse"
    }
  ],
  "outputs": [
    {
      "name": "safety_score",
      "type": "number",
      "description": "0-100 safety rating"
    },
    {
      "name": "flagged_patterns",
      "type": "array",
      "description": "List of detected threat patterns"
    }
  ],
  "dependencies": [
    { "name": "@anthropic-ai/sdk", "version": "^0.30.0" }
  ],
  "permissions": [
    "network:api.anthropic.com",
    "filesystem:read:/tmp"
  ],
  "failure_modes": [
    {
      "condition": "API timeout",
      "behaviour": "Returns error with retry suggestion"
    },
    {
      "condition": "Malformed input",
      "behaviour": "Returns validation error with schema"
    }
  ],
  "data_handling": "No data persisted. All processing in-memory. No external logging.",
  "author": "Your Name",
  "author_email": "you@example.com",
  "source_url": "https://github.com/you/your-skill",
  "licence": "MIT"
}

Field Reference

Core Fields

FieldTypeRequiredDescription
namestringRequiredHuman-readable name of your skill. Maximum 200 characters.
versionstringRequiredSemantic version (e.g. 1.2.0). Must follow semver format.
descriptionstringRequiredWhat your skill does. Plain language, maximum 2000 characters.
platformstringRequiredTarget platform. One of: claude, openclaw, mcp, cursor, generic.
categorystringRequiredSkill category. One of: security, coding, automation, data, financial, research, content, other.

Input/Output Schema

FieldTypeRequiredDescription
inputsarrayRequiredArray of input definitions. Each must have name, type, required, and description.
outputsarrayRequiredArray of output definitions. Each must have name, type, and description.

Why inputs and outputs matter: The evaluator generates test cases from your declared inputs and validates responses against your declared outputs. Incomplete or inaccurate schemas will cause functional verification failures.

Dependencies and Permissions

FieldTypeRequiredDescription
dependenciesarrayOptionalExternal packages your skill uses. Each entry needs name and version. Used for dependency vulnerability scanning.
permissionsarrayOptionalResources your skill accesses. Format: type:target (e.g. network:api.anthropic.com, filesystem:read:/tmp). Used for permission scope validation.

Safety and Reliability

FieldTypeRequiredDescription
failure_modesarrayRequiredHow your skill handles errors. Each entry has condition and behaviour. The evaluator tests these failure scenarios.
data_handlingstringRequiredHow your skill handles data. Be specific: does it persist data? Log externally? Process in-memory only?

Live Testing (Optional)

FieldTypeRequiredDescription
test_endpointstringOptionalHTTPS URL of your skill’s test endpoint. The evaluator sends POST requests with JSON bodies here. Required for scores above 85.
test_auth_headerstringOptionalAuthentication header for test requests. Format: HeaderName: value (e.g. Authorization: Bearer xxx).
test_timeout_msnumberOptionalTimeout per request in milliseconds. Default: 10000. Maximum: 30000.
test_casesarrayOptionalAuthor-provided test cases. Each has name, input (JSON object), optional expected_status (HTTP status code), and optional expected_output_contains (array of strings that must appear in the response).

Why live testing matters: Skills without a test_endpoint are evaluated by manifest analysis only and capped at 85/100. Live testing verifies actual behaviour: functional correctness, security resistance (20+ attack payloads), and performance under load (p50/p95/p99 latency). Final score with live testing = 70% live + 30% static.

Author Information

FieldTypeRequiredDescription
authorstringRequiredAuthor or organisation name.
author_emailstringRequiredContact email. Used for certification notifications.
source_urlstringOptionalURL to the source repository. Required for CI/CD webhook integration (stale detection on push).
licencestringOptionalSoftware licence (e.g. MIT, Apache-2.0).

Validation Rules

CI/CD Integration Guide Download GitHub Action