Skip to content

Access Model

ACP’s access model uses three independent, composable axes. Each controls a different dimension of access. They do not imply each other.


Who can find and view the object in a user interface or search.

ValueMeaning
publicVisible to anyone. Discoverable in search and listings.
privateVisible only to the owner. Not discoverable. Default.
restrictedVisible to specific users or groups defined by the implementation.

Whether AI agents can access this object via transport protocols like MCP.

ValueMeaning
trueAI agents can reach and read this object
falseAI agents cannot access this object. Default.

This field is transport-agnostic. It does not specify MCP specifically — it controls whether agents can reach the object, regardless of which protocol they use.

What consumers are allowed to do with the content. Informational in ACP v0.2.

rights: "CC-BY-4.0"

Recommended: SPDX license identifiers (e.g., "CC-BY-4.0", "CC0-1.0", "MIT", "proprietary"). Free-text also accepted.

Rights enforcement is NOT required in v0.2 — this field signals intent. Machine-readable enforcement is a future capability.


The three axes are fully independent and composable. Any combination is valid:

visibilityagent_accessibleUse case
publictrueFully open — discoverable by humans and agents
publicfalseHuman-visible only — a public post you do not want crawled by agents
privatetruePrivate but agent-accessible — your own AI can read your private notes
privatefalseFully private — visible only to the owner, no agent access
restrictedtrueTeam-restricted but agent-accessible to team agents

This separation matters because AI access and human access have fundamentally different risk profiles. Controlling them independently gives implementations and users precise control.


Two additional access-adjacent fields:

FieldTypeDescription
statusstring enum"draft", "final", "archived". Default: "draft".
expirationstring (ISO 8601) / nullIf set, the object is ephemeral. null or absent = permanent.

status is informational — it signals the editorial state of the object. Implementations MAY use it to filter results (e.g., exclude archived objects from default search).


An ACO with an expiration field set to a future timestamp is ephemeral. When that timestamp is reached:

The ACO MUST be removed from all search results, listings, and agent endpoints. It must not be discoverable or reachable after expiration.

The content body SHOULD be deleted. Implementations MAY retain the frontmatter (metadata only) for audit purposes, but MUST NOT serve the content body after expiration.

References to the expired ACO in any Container’s objects array MUST be removed. The Container itself is not affected — only the specific reference to the expired ACO.

Relationship edges pointing to the expired ACO from other ACOs become dangling references. Implementations SHOULD clean these up (remove or tombstone the edge) but are not required to do so synchronously at expiration time.

The protocol does not mandate a specific deletion mechanism. Implementations MAY use:

  • Tombstones: Metadata retained, content purged. Useful for audit trails.
  • Hard deletes: Full removal of all data.

The only protocol-level requirement is that expired objects are not discoverable, not served to agents, and removed from Container membership.


api_readable was removed in v0.2. It was redundant with agent_accessible and created ambiguity about what “API” meant.

  • Use agent_accessible for agent access control.
  • Human API access is governed by visibility and implementation-level authentication.

The old mcp_connectable field name (used in pre-v0.3 drafts) was renamed to agent_accessible. The rename makes the field transport-agnostic — it controls agent access regardless of whether the transport protocol is MCP, HTTP, or anything else.