You built five local services last month. Your new AI session doesn't know any of them exist. ASMP is the inventory — three files, one localhost API, every session starts there instead of a scavenger hunt.
You ask your AI a vague question. It checks the phone book instead of digging through old setups.
No manual filing. Put a manifest at the repo root — the registry scans your machine every five minutes and introduces new services to every agent session.
Add asmp.yaml beside your code. List real capabilities.provides values.
POST /discover/scan walks configured paths and syncs into ~/.asmp/services/.
Running services can announce on start. Agents query by capability — not by grepping ports.
One curl sets up ~/.asmp/, a registry on :7700, and a reference server you can swap
out later.
# bootstrap ASMP on this machine curl -fsSL https://raw.githubusercontent.com/agent-service-manifest-protocol/agentservicemanifest.io/main/scripts/bootstrap-asmp.sh | bash MCP lists tools. A2A lists agents. ASMP lists what's installed on this machine — and how to register something new. Same stack, different question.
One file describing this device: OS, hardware, what it can do, and the rules for registering services.
One YAML per service, written by whatever built it. Name, port, capabilities, how to start it.
Localhost API on :7700. Register, search by capability, attach mods — the inventory every session reads.
Three protocols. Three questions. Use them together.
One YAML file at a fixed path: hardware, capabilities, where manifests live, and who gets to register services.
~/.asmp/host.yaml — personal scope/etc/hmp/host.yaml — system scopeasmp: "0.1" kind: host host_id: "daniels-macbook-2026" device_class: personal_compute os: name: macOS version: "15.3.1" arch: arm64 hardware: cores: 12 ram_gb: 36 gpu: "Apple M4 Pro" capabilities: - files.local - email.local - calendar.local - networking - containers - gpu.inference registry: path: ~/.asmp/services/ api: http://127.0.0.1:7700 policy: agent_can_register: true requires_approval: false max_services: 100 allowed_ports: "7000-9999" data_sensitivity_default: medium # written by the agent that built it asmp: "0.1" kind: service identity: name: inbox-triage author: "agent://reeves/mail" version: "1.2.0" runtime: exec: "python -m inbox_triage" restart: on-failure network: port: 7821 bind: 127.0.0.1 capabilities: - email.local - files.local mods: - name: spam-scorer author: "agent://eidos/filter" observability: log_dir: ~/.asmp/logs/inbox-triage display: label: "Inbox Triage" icon: mail
Each file in ~/.asmp/services/. Short on purpose — enough to wire ports and restarts, not
enough to fill a wiki.
HTTP on 127.0.0.1:7700 only. List services, search by capability, attach mods, remove
cleanly. Nothing past localhost.
The agent doesn't guess ports or grep your repos. It asks the registry what's already here — by name or capability — and moves on.
Vague question in the terminal — "use whatever handles email."
GET /capabilities?provides=email.local on :7700.
Registry returns manifests — names, ports, capabilities.
Agent calls the right service. No port lottery.
Same inventory. No rediscovery. ~250ms, not ~45s.
Whoever builds the service declares it. The inventory outlives the session.
Tied to a device — your Mac, your homelab, your box.
launchd, systemd, Docker, k8s — ASMP is the input, not the runner.
Tools above, agents beside, inventory underneath.
Every field does a job. No manifest the size of a novel.
Services can be extended by agents that didn't build them.
Formalize the manifest schema for validation and tooling.
The registration API server in Python, bound to localhost.
Convert 35+ existing services to ASMP manifests.
Extract as a framework-agnostic, open-source package.
Auto-generate MCP tool manifests from ASMP service capabilities.