Matrix logo

Agent Manifests

The JSON agent manifest format: schema_version, agent DID, allowed_side_effects, the servers array with transport, command, args, env, package_digest, version, and tools.

An agent manifest is a JSON file that describes what tools a Matrix agent has access to. The executor loads it at boot, spawns each declared MCP server, and verifies that the server's advertised tools match the manifest exactly. The canonical Go types live in executor/tool/manifest.go.

Manifest files

FilePurpose
agents/default.jsonThe per-user baseline agent. Starting point for fork-and-customize.
agents/neo.jsonNeo's conversational-agent manifest with the full Paxeer chain surface, embedded-wallet writes, media generation, browser automation, and more.
agents/mcp-server-templates.jsonA catalog of ready-to-copy MCP server definitions for popular integrations.

Schema

{
  "schema_version": 1,
  "agent": "matrix://agent/default",
  "description": "...",
  "allowed_side_effects": ["read", "write", "network", "shell"],
  "servers": [
    {
      "alias": "fs",
      "transport": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"],
      "env": [],
      "package_digest": "sha256:0000...",
      "version": "2026.1.14",
      "tools": [
        {
          "name": "read_text_file",
          "description": "Read the contents of a text file",
          "side_effect_class": "read"
        },
        {
          "name": "write_file",
          "description": "Write content to a file",
          "side_effect_class": "write"
        }
      ]
    }
  ],
  "native_tools": []
}

Field reference

FieldMeaning
schema_versionManifest schema version (currently 1).
agentThe agent's matrix://agent/<name> DID.
descriptionHuman-readable summary of the agent's role and scope.
allowed_side_effectsThe side-effect classes this agent may perform: read, write, network, shell.
servers[].aliasShort name used in tool URIs (matrix://tool/mcp/<alias>/...).
servers[].transportstdio or http.
servers[].command / argsHow to spawn a stdio server.
servers[].envCredential refs ($env:NAME).
servers[].headersHTTP headers for http servers (also uses $env:NAME refs).
servers[].versionServer version string, forms the tool URI pin.
servers[].package_digestsha256 of the published package (sha256:<64-hex>).
servers[].tools[]The exhaustive list of tools the server advertises.
servers[].tools[].nameTool identifier, must match what the server reports.
servers[].tools[].descriptionHuman-readable tool summary.
servers[].tools[].side_effect_classread, write, network, or shell.
servers[].tools[].timeout_msOptional per-tool timeout.
native_tools[]Reserved slot for chain-level tools that bypass MCP (v1.1+).

The exhaustive-tools rule

The tools array in each server entry must list every tool the server advertises, no more, no less. At boot, the manager spawns the server, calls tools/list, and compares the result against the manifest. Any mismatch (a tool the server advertises but the manifest omits, or a tool the manifest declares but the server does not provide) causes a fatal boot error.

This bijection check prevents two failure modes:

  • An agent calling a tool the manifest did not authorize.
  • A stale manifest referencing tools that no longer exist on the server.

Side-effect classes

Every tool declares exactly one side_effect_class:

ClassMeaning
readPure reads with no external side effects (file reads, directory listings, status checks).
writeMutating operations (file writes, commits, deployments).
networkOutbound network calls (HTTP fetches, API requests, chain queries).
shellArbitrary code execution (shell commands, browser evaluate).

A tool call only executes if its class appears in the manifest's allowed_side_effects. An agent that only allows read and network will refuse any shell or write tool, even if the server provides it.

Locked design rules

RuleDescription
Transportsstdio and http (streamable HTTP) only.
Tool URImatrix://tool/mcp/<server-alias>/<tool-name>@<version>.
CredentialsVia $env:NAME refs in env or headers; never literal values.
Bijectiontools[] must exhaustively enumerate what the server advertises.
Package digestpackage_digest must be the sha256 of the published package.
Native toolsnative_tools is the placeholder slot for chain tools.

The placeholder digests in default.json are zero-filled (sha256:0000...) for bootstrap testing only. Before any production deployment, install the pinned package, compute its real sha256, and replace the placeholder.

Verify a manifest

mcl-tools verify checks the declared/discovered tool bijection.