Superset of SKILL.md

ENACT.md

Executable AI tool definitions with containerized execution
and semantic versioning.

Think of ENACT.md as a SKILL.md that can actually run: a portable, verified format for defining AI tools that execute in isolated containers with full reproducibility.

ENACT.md
---
name: enact/firecrawl
version: 1.1.0
description: Scrape, crawl, and extract data from websites

# Containerized execution
from: python:3.12-slim
build: pip install requests
command: python firecrawl.py ${action} ${url}

# Environment & secrets
env:
  FIRECRAWL_API_KEY:
    secret: true

# MCP-compatible schema
inputSchema:
  type: object
  properties:
    action:
      type: string
      enum: [scrape, crawl, extract]
    url:
      type: string
---

# Firecrawl

Web scraping that just works. No curl escaping,
no dependency issues, no environment mismatch.

Why ENACT.md?

SKILL.md files describe what an AI tool does, but don't specify how to run it. You still need Python, Node, or the right libraries installed.

ENACT.md adds execution fields so tools bundle their own environment. Every tool runs the same way, everywhere—in an isolated container with full reproducibility.

📦

Containerized Execution

Tools bundle their runtime environment. No more installing Python 3.11 vs 3.12, no conflicting dependencies, no missing libraries.

🔐

Environment & Secrets

Define environment variables and mark secrets in your tool definition. Clients handle secure storage and injection at runtime.

🏷️

Semantic Versioning

Every tool has a version. Pin dependencies, track changes, and ensure reproducible results across teams and environments.

📝

Self-Documenting

The same file that defines execution also contains documentation. Markdown after the frontmatter describes usage, examples, and edge cases.

🤖

MCP Compatible

Native support for Model Context Protocol. AI agents can discover, understand, and invoke tools with typed inputs and outputs.

📋

SKILL.md Compatible

Every ENACT.md is a valid SKILL.md. Use the same format for documentation-only tools and executable tools.

ENACT.md vs SKILL.md

ENACT.md is a strict superset—every SKILL.md field works in ENACT.md

Feature
SKILL.md
ENACT.md
Tool name & description
Input/output schemas
Instructions & documentation
License & metadata
Container image (from)
Build steps (build)
Execution command (command)
Semantic versioning
Environment variables & secrets
Timeout configuration

One ENACT.md works across many tools

Your tool definitions work with AI coding agents, automation platforms, and more

Claude Code
by Anthropic
Cursor
AI-powered editor
Codex
by OpenAI
Gemini CLI
by Google
Aider
AI pair programming
Windsurf
by Codeium
Devin
by Cognition
MCP Servers
Any MCP-compatible tool

Examples

Real-world ENACT.md files from the community

ENACT.md
---
name: "enact/pdf-extract"
version: "2.1.0"
description: "Extract text and metadata from PDF files"
from: "python:3.12-slim"
build: "pip install pymupdf"
command: "python extract.py ${file_path}"
timeout: "2m"

inputSchema:
  type: object
  properties:
    file_path:
      type: string
      description: "Path to the PDF file"
  required: ["file_path"]

outputSchema:
  type: object
  properties:
    text:
      type: string
    page_count:
      type: integer
---

# PDF Extractor

Extracts text content and metadata from PDF files using PyMuPDF.
enact/pdf-extract Extract text and metadata from PDF files
ENACT.md
---
name: "enact/screenshot"
version: "1.3.0"
description: "Capture screenshots of web pages"
from: "mcr.microsoft.com/playwright:latest"
command: "npx playwright screenshot ${url} screenshot.png"

env:
  VIEWPORT_WIDTH:
    description: "Browser viewport width"
    default: "1280"

inputSchema:
  type: object
  properties:
    url:
      type: string
      format: uri
      description: "URL to capture"
---

# Web Screenshot Tool

Captures full-page screenshots using Playwright.
enact/screenshot Capture screenshots of web pages with Playwright
Browse all tools on enact.tools

How to use ENACT.md

1

Create an ENACT.md file

Add an ENACT.md file to your tool directory. Define your container image (from), build steps, and execution command in YAML frontmatter.

2

Define your schema

Specify inputSchema and outputSchema using JSON Schema. AI agents use this to understand your tool's inputs and outputs.

3

Add documentation

Write markdown after the frontmatter. Describe usage, examples, and edge cases. The same file documents and executes your tool.

4

Test locally

Run your tool in a container locally. It runs exactly as it will for everyone else—no surprises in production.

5

Share your tool

Publish to a registry or share the file directly. Others can run your tool with the same reproducible results.

6

Iterate with versions

Update your tool by bumping the version. Semantic versioning lets users pin to stable versions they trust.

Terminal
# Run any ENACT.md tool in a container
$ docker run -v ./ENACT.md:/tool/ENACT.md enact-runner

◐  Parsing ENACT.md...
◇  ✓ Found: enact/firecrawl@1.1.0
◐  Building python:3.12-slim container...
◐  Running: python firecrawl.py scrape https://example.com
◇  ✓ Execution complete

{"title": "Example Domain", "content": "This domain is for use in..."}

FAQ

How does ENACT.md relate to SKILL.md?

ENACT.md is a strict superset of SKILL.md. Every SKILL.md field works in ENACT.md. The difference is ENACT.md adds execution fields (from, build, command) so tools can actually run in containers.

Can I use my existing SKILL.md files?

Yes! Any valid SKILL.md works as-is since ENACT.md is a strict superset. You can optionally add execution fields if you want to make them runnable in containers.

Why containerized execution?

Containers solve the 'works on my machine' problem. Your tool runs the same way everywhere—same Python version, same dependencies, same behavior. No more debugging environment mismatches.

How do I handle secrets and API keys?

Define secrets in the env field with secret: true. The ENACT.md format specifies which values are secrets—client implementations handle secure storage and injection.

What container images can I use?

Any Docker-compatible image works—Docker Hub, GitHub Container Registry, or other OCI registries. Use python:3.12-slim, node:20-alpine, or bring your own.

What are the required fields?

For executable tools: name, from, and command are required. For schema validation, inputSchema is recommended. Everything else is optional.

Can tools have timeouts?

Yes! Use the timeout field to specify maximum execution time (e.g., '30s', '5m'). This helps prevent runaway processes and manage resource usage.

Is ENACT.md an open standard?

Yes! ENACT.md is open source under Apache-2.0. The specification is available on GitHub and we welcome contributions.