Agent Manifest Documentation

Consuming a manifest

This page is for someone building software that could read an Agent Manifest. It goes from not knowing what this is to one decision in your program taking a different branch because a declaration said so — nothing further.

It asks you to publish nothing, adopt no tooling of ours beyond a reading library, and copy no schema.

What a manifest is

An Agent Manifest is a JSON document in which the operator of an autonomous system declares, before any interaction, what that system is for, what it will not do, how much autonomy it has, who can stop it and what it records. The normative definition is the specification and its JSON Schema.

It is a declaration, not a credential. It is not signed and proves nothing about who issued it. That single fact decides how it can be used, and the last section of this page says how.

Install the reading client

npm install @agent-manifest/client

Node.js 22.12 or later. The package reads, canonicalises, fingerprints, compares and structurally validates declarations. It ships no thresholds, no profiles and no recommended lists, and it emits no verdict about trust, safety or compliance.

Read one

Resolving by name takes two calls: a registry has to be discovered before a name can be looked up in it.

import { discoverRegistry, resolve } from '@agent-manifest/client/net';

const registry = await discoverRegistry('agent-manifest-spec.org');
const result = await resolve('the-diplomat', { registryUrl: registry.registryUrl });
const manifest = result.resolutions[0].document;

console.log(manifest.autonomy.level, manifest.forbidden_actions);

A URL resolves in one call. Passing a bare name with no registry returns a result whose absence.reason is no-registry-declared — the client reports what it could not conclude instead of guessing.

That reporting is why resolutions can be empty, and the line above takes resolutions[0] without checking. A name the registry does not list resolves to nothing, absence.reason is not-in-registry-index, and resolutions[0] is undefined. Check the length, or read absence, before reaching for a document: absence is an answer here, not an error.

Read one from disk

import { readFileSync } from 'node:fs';
import { parse } from '@agent-manifest/client';
import { validate } from '@agent-manifest/client/validate';

const { document } = parse(readFileSync('manifest.json', 'utf8'));
const { schemaValid, errors } = validate(document);

parse() returns { document, form }, not the document. form records whether it was read from text or from an already-parsed value. Passing the wrapper straight into validate() reports every required field as missing, which looks like a broken manifest and is not one — destructure it.

Change one decision

Four worked examples, one file each, in the client repository: examples/.

Example The decision, which you are already making today Field A B
CI gate a run passes or fails autonomy.level exit 0 exit 1
Gateway a call is forwarded or refused forbidden_actions 403, upstream never touched 200, upstream reached
MCP server which tools are advertised and which run forbidden_actions 1 advertised, call refused 2 advertised, call runs
Runtime which isolation a job is launched under risk_profile.level disk read allowed ERR_ACCESS_DENIED

Each one runs two inputs through the same code and produces two observable behaviours. That pair is the whole point: reading a manifest and printing it is not consuming it.

The MCP example is an explicit derivation of the gateway one rather than a case of its own, and says so in the file. The case that would be native to an MCP server — using a manifest to establish who is calling — is precisely the one a manifest cannot support.

The policy is yours

In all four examples the threshold sits in the example, marked to be edited. Nothing in the package decides what an acceptable autonomy.level is, and nothing will. The declaration layer stops at the declaration; the policy seat is left deliberately empty because it belongs to whoever is running the software.

The mapping between an action your software knows about and a string a manifest declares is part of that policy too: v1.0 defines neither a vocabulary nor a matching rule. See Known limits of v1.0.

Keep the trust questions separate

A manifest answers one question: what was declared? It does not, by itself, answer who issued the declaration, whether its claims are true, what a consumer should allow, how a decision is enforced, or what happened at runtime.

Question Concern Supplied by
What was declared? declaration Agent Manifest
Who issued it, and was it altered? provenance / integrity an external authenticated channel, signature, attestation, or other trust mechanism
What should this consumer allow? policy the consumer
How is that decision applied? enforcement a gateway, runtime, policy enforcement point, or equivalent
What actually happened? runtime evidence logs, traces, receipts, attestation, audit systems, or other evidence

Agent Manifest mandates none of the external mechanisms in that table. Keeping these questions separate prevents a structurally valid declaration from being mistaken for authenticated identity, proof of truthfulness, or runtime evidence.

Restrict, do not grant

Use what is declared to narrow authority that was established independently: refuse a run, block a call, narrow a tool list, or add confinement.

Conceptually, safe composition is:

effective authority = independently established authority ∩ manifest-derived restrictions

The intersection is a model, not syntax defined by v1.0. The important property is directional: a manifest-derived rule may remove something from the consumer’s existing baseline, but it must never add a privilege, establish who a caller is, or relax a control that came from an independent source.

A false or incomplete declaration can still evade a restriction that exists only because the consumer chose to derive that restriction from the declaration. An unsigned manifest is therefore not a security boundary. If a favourable decision depends on who made a claim or whether the claim is true, establish that provenance or evidence separately.

This is why nothing here authenticates an agent, treats a manifest as a credential, applies enforcement on anyone’s behalf, or issues badges, seals or certifications.

What is not being asked of you

Publishing your own manifest, adopting the CLI, the registration flow or any other tool of ours, copying the schema into your repository, or mentioning this project anywhere.