Skip to main content

Manifest Reference

The Skill Manifest File is the JSON document that describes a skill: its name, version, license, the per-host materializations (targets) it ships, and optional dependency, taxonomy, and provenance metadata.

When a skill is registered onchain, the manifest's keccak256 hash is stored in manifestHashes(skillId) on the SkillRegistry. Clients fetch the manifest from tokenURI(skillId), verify that hash, then dereference and verify each target body against its declared integrity. Any byte-level change to the manifest invalidates the onchain commitment.

This page documents the schema implemented by asrpm. See the ERC-8239 specification for the normative definition.

Top-Level Fields

FieldTypeRequiredDescription
typestringoptionalManifest type discriminator (e.g. skill)
namestringrecommendedShort, human-readable skill name. Used as the install directory name (sanitized).
descriptionstringrecommendedOne-line description of what the skill does
imagestringoptionalURL to an icon or banner image
versionstringrecommendedSemver string for this skill release
licensestringrecommendedSPDX license identifier (e.g. MIT, Apache-2.0)
keywordsstring[]optionalTags for discovery
homepagestringoptionalProject homepage URL
repositorystringoptionalSource repository URL
authorAuthoroptionalAuthor identification
targetsTarget[]requiredPer-host materializations of the skill
requirementsobjectoptionalFree-form host or runtime requirements
taxonomyobjectoptionalFree-form classification metadata
dependenciesSkillReference[]optionalOther skills this skill depends on
supersedesSkillReferenceoptionalSkill this release supersedes
statusstringoptionalLifecycle status. deprecated triggers a client warning.

Unknown fields are tolerated by asrpm and ignored on unmarshal.

Target

A Target describes one way the skill is materialized for a particular host — a Claude Code SKILL.md, a Cursor rule, an MCP server, a CLI binary, etc. A skill manifest must include at least one target.

FieldTypeRequiredDescription
kindstringrequiredHost identifier (e.g. claude-code-skill, cursor-rule, mcp-server). Clients pick a target by matching their host's expected kind.
versionstringoptionalPer-target version, if it diverges from the manifest's version
runtimestringoptionalRuntime hint for the host (e.g. interpreter version)
installationstringoptionalFree-form installation notes for hosts that need them
uristringrequiredURI to the target body. Supported schemes: https://, http://, data:. (ipfs:// is intentionally not supported.)
integritystringrequired<algorithm>:<hex> digest of the body bytes (see Integrity Format)
formatstringoptionalHow to interpret the fetched content (default: file)

Target Kinds

asrpm v1 installs targets with kind = "claude-code-skill" into ~/.claude/skills/<name>/SKILL.md. Other kinds are recognized by the manifest format and may be referenced in dependency graphs, but writing them to disk is not yet implemented.

Author convention is to use a stable, hyphenated, host-prefixed identifier:

KindDescription
claude-code-skillClaude Code SKILL.md body
cursor-ruleCursor rules file
mcp-serverManifest pointing to an MCP server bundle
cli-binaryPre-built CLI binary

The list is not normative — hosts and authors may define new kinds. asrpm matches by exact string equality on the configured --target flag.

Author

FieldTypeRequiredDescription
namestringoptionalHuman-readable author name
urlstringoptionalAuthor homepage
agentIdnumberoptionalERC-8004 agent identifier, if the author is itself an onchain agent
agentRegistrystringoptionalAddress of the agent registry, qualified with the chain (e.g. eip155:1:0x...)

SkillReference

A SkillReference points to another skill in the registry (or a different registry). Used by dependencies[] and supersedes.

FieldTypeRequiredDescription
skillIdnumberrequiredToken ID of the referenced skill
skillRegistrystringoptionalChain-qualified registry address (e.g. eip155:11155111:0x8239…). Defaults to the current registry.
versionstringoptionalPinned version of the referenced skill

Integrity Format

The integrity field uses an OCI-style algorithm-prefixed hex digest:

<algorithm>:<hex>
AlgorithmNotes
keccak256Recommended for EVM-native skills; matches the manifestHash commitment algorithm
sha256Recommended for interoperability with non-EVM tooling

Examples:

keccak256:97837f988678ef34cf4ea778f062a25e334d896d73bcf70bf81bfd7c9243f01e
sha256:4a8b1d8e3c2b6f5a0c9e1f2d3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b

asrpm verifies the digest by recomputing the hash over the exact bytes returned from the target's URI and comparing to the declared value. Any mismatch aborts the install or verify operation.

URI Schemes

The manifest URI (written to tokenURI) and each target's uri must use one of the following schemes:

SchemeNotes
https://Recommended for hosted content. Subject to gateway availability.
http://Supported but discouraged.
data:Inline content (base64 or URL-encoded). Recommended for small bodies — the URI is self-contained and does not depend on a gateway.

The ipfs:// scheme is intentionally not supported by asrpm. Use the HTTPS gateway URL your pinning provider serves (e.g. https://gateway.pinata.cloud/ipfs/<cid>).

Status

The status field is a lifecycle marker. Recognized values:

ValueEffect
(unset)Standard skill, no warning
deprecatedasrpm emits a warning before installing or invoking

Other values are tolerated but have no client-side effect.

Example Manifest

A minimal manifest with one claude-code-skill target served from a data: URI:

{
"type": "skill",
"name": "asrpm",
"description": "Use the Agent Skill Registry (ERC-8239) to discover, install, and publish onchain agent skills.",
"version": "0.1.0",
"license": "MIT",
"keywords": ["asr", "erc-8239", "agent-skill", "claude-code"],
"homepage": "https://github.com/vorpalengineering/asrpm",
"repository": "https://github.com/vorpalengineering/asrpm",
"author": {
"name": "Vorpal Engineering",
"url": "https://vorpalengineering.com"
},
"targets": [
{
"kind": "claude-code-skill",
"version": "0.1.0",
"uri": "data:text/markdown;charset=utf-8;base64,LS0tCm5hbWU6IGFzcnBtCi4uLg==",
"integrity": "keccak256:97837f988678ef34cf4ea778f062a25e334d896d73bcf70bf81bfd7c9243f01e",
"format": "file"
}
]
}

A manifest with multiple targets and dependencies:

{
"name": "example-skill",
"version": "1.2.0",
"license": "Apache-2.0",
"author": {
"name": "Example Author",
"agentId": 42,
"agentRegistry": "eip155:1:0xAgentRegistry..."
},
"targets": [
{
"kind": "claude-code-skill",
"uri": "https://example.com/skill.md",
"integrity": "keccak256:abc123...",
"format": "file"
},
{
"kind": "cursor-rule",
"uri": "https://example.com/rule.mdc",
"integrity": "sha256:def456...",
"format": "file"
}
],
"dependencies": [
{
"skillId": 0,
"skillRegistry": "eip155:11155111:0x8239AAbaa1A44338bEeFAAf4C3a373d2a18D5DC4",
"version": "^0.1.0"
}
],
"supersedes": {
"skillId": 17,
"version": "1.1.0"
}
}

Authoring Tips

  • The manifest URI must serve byte-identical content to the local file you hashed. Any change — trailing newline, key reordering, whitespace — invalidates the onchain commitment and causes integrity verification to fail for downstream clients.
  • Prefer data: URIs for small manifests and target bodies. They are self-contained and avoid gateway availability issues.
  • When hosting on IPFS, register the gateway HTTPS URL (e.g. https://gateway.pinata.cloud/ipfs/<cid>) rather than ipfs://<cid>. Integrity verification works regardless of gateway choice.
  • Use the asrpm-prepare.sh helper to handle the body-encoding, hashing, and manifest-splicing steps in one pass.

See Also