open manifest spec · v0.4

A manifest spec for personal, stateful agents.

Long-running agents — memory, schedules, federation. Open spec, AGENTS.md-aligned.

Toolspace is an open manifest spec for personal, stateful AI agents — the long-running kind that hold memory, schedule themselves, learn their operator's preferences over weeks and months, and act on their own initiative between conversations.

It's a structured JSON layer that sits on top of AGENTS.md: where AGENTS.md gives an agent prose context about a repo or workspace, toolspace gives it a machine-readable contract for the tools, memories, schedules, and behaviors that make up a personal agent's surface. AGENTS.md tells an agent what this place is for. Toolspace tells an agent what this agent is made of.

Not a registry for coding-assistant plugins. Different consumers, different lifecycle, different trust model. The canonical demo is Yep and its federated counterpart Vi — every primitive lands in production there before it lands in the spec.

Get started

pip install install-manifest
install-manifest install <url-or-path>

shape

What a manifest looks like.

Full reference: /examples/gmail.v0.3.json (validates unmodified against v0.4). Every field is documented in the v0.4 schema.

{
  "manifest_version": "0.4",
  "tool":    { "id": "gmail", "version": "1.0.0", "name": "Gmail", "...": "..." },
  "scopes":  [ { "resource": "gmail", "actions": ["read", "send"], "...": "..." } ],
  "actions": [
    { "name": "send", "input_schema": {"...":"..."}, "side_effects": "write",
      "docs": { "goal": "Send an outbound email." } }
  ],
  "verify":        { "suite": {"...":"..."}, "sla": { "p95_latency_ms": 2000 } },
  "data_boundary": { "reads": ["gmail.messages"], "transmits": [], "persists": [] },
  "smoke":         { "kind": "action-call", "...": "..." },
  "kill_switch":   { "kind": "url",         "...": "..." }
}

for agents

Three surfaces an agent can fetch.

Schema, index, example. All CORS-enabled, cached, public.

Schema v0.4 · current

install-manifest-v0.4.json — closes two structural gaps surfaced by community consumer tests: runtime.install.method: "preinstalled" with a required locator, and data_boundary.transmits[].to_kind: "agent-supplied" for runtime-supplied destinations. All v0.3.1 manifests validate unmodified against v0.4 — drop-in upgrade.

Superseded: v0.3.1, v0.3. Frozen: v0.2. Legacy: v0.1.

Manifest index

/manifests.json — list of curated manifests with capability tags. The versions[] array lists every supported schema version.

Example manifest

gmail.v0.3.json — reference manifest with five Gmail actions, the verify contract, full data_boundary, per-action docs. Validates unmodified against v0.4 — the template when authoring new manifests.

For v0.4-only surfaces, see vi-federation.v0.4.json. Earlier shapes still served: v0.2, v0.1.

for humans

Two ways to get your tools listed.

The spec is open and the registry is public. Browse, or publish your own catalog.

Browse/registry/ is a marketplace view of every manifest in the index. Each tool gets a product page with its scopes, data boundary, kill switch, smoke test, and action catalog laid out for humans. Filter by capability, status, or schema version.

Publish — host a .well-known/install-manifests.json index at your repo or domain, get added to publishers.json once, and every tool you ship, bump, or deprecate flows in automatically on the next daily sync — no PR-per-tool coordination. Muninn did exactly this — see how →

Three identity kinds: github, https, atproto (v2). Full walkthrough: FEDERATION.md. Single tool or preview drop? You can still open a one-off PR adding an entry to manifests.json directly.

cli

Validate, lint, diff, install.

The install-manifest CLI ships with the schema bundled, so it works offline. Network is only used for the manifest itself. lint and diff ship in 0.5.0 — non-fatal by default; lint --strict turns warnings into a non-zero exit so CI can gate on a clean result.

pip install install-manifest
install-manifest validate <url-or-path>
install-manifest lint     <url-or-path>       # style + best-practice warnings
install-manifest diff     <url-a> <url-b>     # breaking / additive / cosmetic
install-manifest install  <url-or-path>