Status: Implemented. /manifest.json is the root discovery endpoint for SkillServer-aware clients.
The native manifest is SkillServer's versioned, HATEOAS-style sync feed. It must not replace the Cloudflare Agent Skills Discovery RFC feed (/.well-known/agent-skills/index.json). Instead, it provides a linked catalog for SkillServer-aware clients that need version negotiation, search, version history, sub-agent definitions, and additional metadata.
- Add
/manifest.jsonas a native entry point for SkillServer-aware clients. - Use HATEOAS-style links with versioned path prefixes.
- Support API version negotiation: client picks the most recent version it supports.
- Expose search endpoints for discovery without full enumeration.
- Publish sub-agents as first-class native resources.
- Let clients follow links instead of constructing URLs.
- Do not list sub-agents in the Cloudflare RFC skill feed.
- Do not include the RFC feed in the native manifest (it exists independently).
- Do not create a separate skill install format for native clients.
- Do not define a general transitive dependency resolver in the first version.
The manifest declares which API versions are available. Clients should:
- Know which versions they support (e.g.,
["v1"]). - Fetch
/manifest.json. - Find the most recent version from the intersection of client-supported and server-available versions.
- Use that version's links for all subsequent requests.
- If no supported version is found, throw
NotSupportedExceptionor fall back to the oldest available version.
When a new API version ships, older clients continue to work against their supported version. New clients automatically use the newest version they understand.
The stable entry point is:
GET /manifest.json
The manifest tree uses versioned path prefixes for collection and page navigation:
/manifest.json
/skills/v1/index.json
/skills/v1/pages/all.json
/skills/v1/{skillName}/index.json
/skills/v1/{skillName}/versions/{version}.json
/subagents/v1/index.json
/subagents/v1/pages/all.json
/subagents/v1/{subagentName}/index.json
/subagents/v1/{subagentName}/versions/{version}.json
Clients must follow returned href values. The path structure is readable and stable, but the server owns pagination boundaries.
/manifest.json links to the native collections exposed by the registry, organized by API version.
{
"$schema": "https://schemas.netclaw.dev/skillserver/manifest/0.1.0",
"apiVersion": "v1",
"versions": {
"v1": {
"self": { "href": "/manifest.json" },
"skills": { "href": "/skills/v1/index.json" },
"subagents": { "href": "/subagents/v1/index.json" },
"skillSearch": { "href": "/api/v1/skills" },
"subagentSearch": { "href": "/api/v1/subagents" }
}
}
}The apiVersion field indicates the currently recommended version. The versions object contains all available versions, keyed by version tag. When v2 ships, a "v2": { ... } entry is added.
The RFC feed (/.well-known/agent-skills/index.json) is a separate standard and is not included in the manifest.
A collection index links to one or more server-defined pages.
{
"kind": "skill-index",
"links": {
"self": { "href": "/skills/v1/index.json" }
},
"pages": [
{
"range": "all",
"href": "/skills/v1/pages/all.json"
}
]
}The range value is informational. The server may replace a single "all" page with multiple pages in the future without breaking clients.
A collection page lists identities and coarse version bounds.
{
"kind": "skill-page",
"range": "all",
"items": [
{
"name": "support-triage",
"latestVersion": "1.2.0",
"versionRange": {
"min": "1.0.0",
"max": "1.2.0",
"count": 4
},
"href": "/skills/v1/support-triage/index.json"
}
],
"links": {
"self": { "href": "/skills/v1/pages/all.json" }
}
}If a page grows too large, the server may replace it with links to smaller child pages in a future schema version.
An identity index lists all versions for one skill or sub-agent.
{
"kind": "skill",
"name": "support-triage",
"latestVersion": "1.2.0",
"versions": [
{
"version": "1.2.0",
"publishedAt": "2026-06-29T12:00:00Z",
"digest": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"href": "/skills/v1/support-triage/versions/1.2.0.json"
}
],
"links": {
"self": { "href": "/skills/v1/support-triage/index.json" }
}
}Skill version details wrap the exact artifact object that the RFC feed exposes for the same skill version.
Resourceful skill artifacts use SkillServer's canonical .zip archive route, /api/v1/skills/{skillName}/{version}/archive.zip.
{
"kind": "skill-version",
"artifact": {
"name": "support-triage",
"version": "1.2.0",
"type": "archive",
"description": "Triage support tickets and produce a concise diagnostic plan.",
"url": "/api/v1/skills/support-triage/1.2.0/archive.zip",
"digest": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
},
"routesToSubagent": {
"name": "technical-support-diagnostician",
"href": "/subagents/v1/technical-support-diagnostician/index.json"
},
"links": {
"self": { "href": "/skills/v1/support-triage/versions/1.2.0.json" }
}
}The routesToSubagent value is derived from metadata.subagent in SKILL.md. It is a runtime route hint, not a package dependency.
Sub-agent version details use the same content-addressed artifact semantics, but are native-only resources.
{
"kind": "subagent-version",
"name": "technical-support-diagnostician",
"version": "1.0.0",
"type": "agent-md",
"description": "Diagnose incomplete technical support tickets and identify missing evidence.",
"url": "/api/v1/subagents/technical-support-diagnostician/1.0.0/agent.md",
"digest": "sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
"links": {
"self": { "href": "/subagents/v1/technical-support-diagnostician/versions/1.0.0.json" }
}
}The manifest exposes search endpoints that clients can use for discovery without full enumeration:
{
"skillSearch": { "href": "/api/v1/skills" },
"subagentSearch": { "href": "/api/v1/subagents" }
}Clients append query parameters:
?q={query}— full-text search?skip={skip}&take={take}— pagination
The search endpoint is the primary discovery mechanism. Full enumeration via the collection index is supported but may be slower for large registries.
Native clients should:
- Fetch
/manifest.json. - Resolve the best supported API version.
- Follow collection links for supported resource kinds.
- Follow page links to identity indexes.
- Compare version and digest with local sync state.
- Download changed artifacts from
url. - Verify
digestbefore installing any artifact. - Keep existing local artifacts when a network request fails.
- Prune server-synced artifacts only after a successful collection sync confirms removal.
Clients must ignore unsupported resource kinds and unknown fields.
The native manifest describes what artifacts exist and where to download them. It does not prescribe where a client must install them.
Each client owns its local sync policy:
- NetClaw may install server-synced skills and sub-agents under managed directories inside its configured home directory.
- A non-NetClaw client may sync the same artifacts into its own skills, commands, agents, plugins, or cache directories.
- A client may expose configuration for per-feed destination roots, per-resource-kind destination roots, or both.
- A client must keep enough local state to avoid overwriting user-authored files and to prune only artifacts it previously synced from that feed.
Manifest url, digest, name, version, kind, and type fields are portable. Local filesystem layout is intentionally out of scope for the server protocol.
Non-NetClaw clients should consume the native manifest through an adapter layer rather than requiring SkillServer to publish client-specific feeds.
The recommended split is:
- SkillServer publishes canonical, verified artifacts.
Netclaw.SkillClientfetches manifests and artifact bytes without choosing local paths or target client formats.- CLI sync commands provide unopinionated download/update primitives for supported resource kinds.
- A client-specific adapter maps each supported artifact into that client's local format and destination.
This is the same contract SkillServer should use for skills and sub-agents: sync tooling can fetch, verify, compare, and stage artifacts, but the consuming client decides how those artifacts become local runtime configuration.
For sub-agents, an adapter should implement this flow:
- Follow the
subagentscollection from/manifest.json. - Traverse to each
subagent-versiondetail. - Download the
agent-mdartifact fromurl. - Verify the artifact bytes against
digest. - Parse the markdown frontmatter and body.
- Convert the definition to the target client's local agent format.
- Write only into the adapter's configured managed sync location.
- Record source feed, name, version, digest, and generated local file path for pruning and updates.
If the target client can consume NetClaw-style markdown directly, the adapter can install agent-md without conversion. If the target client has a different format, the adapter owns the mapping.
Minimum portable fields for adapters are:
| Source Field | Adapter Use |
|---|---|
name |
Local agent identity or filename. |
description |
Discovery text shown by the target client. |
| Markdown body | System prompt or agent instructions. |
tools |
Advisory capability metadata when the target client supports it. |
modelRole |
Optional model/profile hint when the target client supports it. |
timeoutSeconds |
Optional execution timeout when the target client supports it. |
visibility |
Whether the adapter exposes or hides the agent when the target client supports visibility. |
Adapters must ignore unsupported fields rather than rejecting otherwise valid artifacts. A target client that needs additional metadata should use namespaced extension fields and document how its adapter interprets them.
The server protocol should remain one manifest with portable artifact types. It should not grow separate /manifest/opencode, /manifest/claude-code, or similar feeds unless a client has a hard incompatibility that cannot be solved by an adapter.
The first-party CLI and library should make OpenCode, Claude Code, and other future consumers supportable by composition rather than hard-coding their paths into the server protocol. A future OpenCode sync command, for example, should be able to use the same manifest traversal and verified artifact download helpers, then apply an OpenCode-specific destination and format adapter.
Read access may be open for public registries. Private registries may require the same bearer API key already used by SkillServer write endpoints and NetClaw feed configuration.
Clients should send configured credentials to both manifest and artifact URLs for the same feed origin.
See the Security And Trust Model for the full trust boundaries, digest-verification requirements, archive-extraction responsibilities, and sync-safety behavior that apply to native sync.
The RFC feed remains the compatibility contract for generic AgentSkills.io clients.
The native manifest must not change the meaning of RFC fields:
nameidentifies the same skill.descriptionhas the same activation meaning.typehas the same artifact distribution meaning.urlpoints to the same bytes for a version.digestverifies the same bytes aturl.
For sub-agents, native resources should mimic those artifact semantics without pretending to be RFC skills.