Concepts
Architecture
The three parts of ASMP and how they fit together.
ASMP has three parts. Each answers a different question.
The three parts
┌─────────────────────────────────────────────────────────┐
│ Host Profile │
│ ~/.asmp/host.yaml │
│ "What is this device? What is it allowed to do?" │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Service Manifests │
│ ~/.asmp/services/*.asmp.yaml │
│ "What runs here? What can it do? How do I reach it?" │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Registration Protocol │
│ http://127.0.0.1:7700 │
│ "How do agents register, discover, and extend?" │
└─────────────────────────────────────────────────────────┘
1. Host Profile
A single document describing the device: hardware, OS, host capabilities, registry location, policy constraints, and observability endpoints.
Path: ~/.asmp/host.yaml (personal) or /etc/asmp/host.yaml (system)
Policy fields control what agents can do:
agent_can_register— can agents add services?requires_approval— human review before provisioning?allowed_ports— port range agents may claimmax_services— ceiling on registered services
2. Service Manifest
One YAML file per service. Written by the agent that built it. Contains identity, runtime, network endpoints, capabilities, data sensitivity, mods, observability, and display metadata.
Path: ~/.asmp/services/{name}.asmp.yaml
3. Registration Protocol
A localhost HTTP API for CRUD on services, capability queries, mod attachment, and host profile access.
Default: http://127.0.0.1:7700
Registration flow
Agent builds service
→ writes .asmp.yaml manifest
→ POST /services
→ host validates (schema, ports, policy)
→ [optional] human approval
→ host provisions (plist, proxy route, logs)
→ service discoverable via GET /capabilities
→ other agents find it by capability
→ mods attach via POST /services/{name}/mods
Consumers
One inventory directory, many readers — each layer reads a different slice. See Three layers.
| Consumer | Reads |
|---|---|
| Registry server | Manifests + health state |
| MCP bridge | Capabilities → tool definitions |
| Dashboard (macdash) | Display metadata, health |
| Supervisor (launchd) | Generated plists |
| Reverse proxy (Caddy) | Endpoint declarations |
| Policy engine (Knox) | Data sensitivity, approval rules |
| Memory layer (Omni) | What exists to index |
Protocol stack
┌──────────────────────────────────────┐
│ Agents (Claude, Codex, custom) │
├──────────────────────────────────────┤
│ MCP (tools) │ A2A (agent comms) │
├──────────────────────────────────────┤
│ ASMP (host — declare & discover) │
├──────────────────────────────────────┤
│ launchd / systemd / Docker / k8s │
├──────────────────────────────────────┤
│ Hardware │
└──────────────────────────────────────┘