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 claim
  • max_services — ceiling on registered services

Host profile spec →

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

Service manifest spec →

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 API →

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.

ConsumerReads
Registry serverManifests + health state
MCP bridgeCapabilities → 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                             │
└──────────────────────────────────────┘

Composability with MCP and A2A →