MSR JSON Protocol Specification
Version 2.0.0 — An Open Standard for Decentralized Software Publishing and Automated Registry Synchronization
1. Abstract & Status
For over two decades, the Association of Shareware Professionals maintained the PAD (Portable Application Description) XML standard. PAD enabled developers to publish software once and have download portals (such as Tucows, Download.com, and Softpedia) ingest updates automatically without proprietary APIs.
However, legacy XML architectures present fundamental constraints in the modern software landscape: verbose CDATA sections, XXE vulnerabilities, lack of first-class internationalization, floating-point currencies, and total inability to represent SaaS backends, Model Context Protocol (MCP) servers, or autonomous AI agents.
The MSR JSON (Metadata for Software Registry) protocol v2.0 solves these challenges while preserving the decentralized ethos: software publishers remain the sole source of truth by hosting their metadata on their own domain, discoverable over standardized HTTP endpoints (RFC 8615).
2. Conformance & Key Words
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC 2119] [RFC 8174] when, and only when, they appear in all capitals.
An implementation is non-conformant if it fails to satisfy one or more of the MUST or REQUIRED statements for the sections it claims to support. Every conformant MSR JSON manifest MUST be a valid JSON document conforming to RFC 8259 and MUST validate without errors against the canonical JSON Schema (Draft 2020-12).
3. Core Architectural Principles
Decentralized Authority
Vendors host their manifest at https://<domain>/.well-known/msr.json per RFC 8615.
Registries, indexers, and AI engines crawl this authoritative location.
Deterministic Minor Units
All monetary values MUST be expressed as integer minor units (cents) per ISO 4217 (e.g. 1999
for $19.99), completely eliminating floating-point rounding errors.
Cryptographic Verification
Manifests support Ed25519 signatures, domain verification through DNS-TXT challenges or HTTP well-known proofs, and SHA-256 binary artifact checksums.
First-Class AI & MCP Tooling
Dedicated interfaces block for Model Context Protocol (MCP) servers, OpenAPI 3.1 definitions, and runtime execution boundaries.
4. Document Anatomy
An MSR JSON document consists of five mandatory top-level objects and two optional objects:
{
"$schema": "https://msr-standard.org/schemas/msr-2.0.json",
"protocol": { ... }, // REQUIRED: Standard provenance and SemVer
"entity": { ... }, // REQUIRED: Machine identity, FQDN, localized descriptions
"capabilities": { ... }, // REQUIRED: Interfaces (MCP, OpenAPI), deployment, pricing
"releases": { ... }, // REQUIRED: Latest version, changelog, and artifacts
"trust": { ... }, // OPTIONAL: DNS-TXT proof, Ed25519 manifest signature
"telemetry": { ... } // OPTIONAL: Status page URL and push synchronization webhooks
}
4.1 Protocol Object (protocol)
Declares adherence to the specification and transparent provenance.
| Field | Type | Req | Description |
|---|---|---|---|
name |
string |
Yes | MUST be the exact string "MSR JSON". |
version |
string |
Yes | SemVer string conforming to ^2\.[0-9]+(?:\.[0-9]+)?$ (e.g. "2.0.0"). |
author |
string |
Yes | Specification author or organization (e.g., "Antonio Santos"). |
specification_license |
string |
Yes | SPDX license identifier for the specification (MUST be "CC-BY-4.0"). |
reference_implementation_license |
string |
Yes | SPDX identifier for reference tooling (MUST be "MIT"). |
canonical_url |
string (URI) |
No | Authoritative public HTTPS URI where this manifest is fetched. |
4.2 Entity Object (entity)
Describes the identity, categorization, publisher entity, and localized descriptions.
| Field | Type | Req | Description |
|---|---|---|---|
name |
string |
Yes | Official title of the application, API, or tool (1–120 characters). |
slug |
string |
Yes | Unique lowercase kebab-case slug matching ^[a-z0-9]+(?:-[a-z0-9]+)*$. |
domain |
string |
Yes | Primary authoritative FQDN (e.g., "example.org"). |
type |
string (enum) |
Yes | One of: "saas", "ai-agent", "mcp-server", "api",
"software", "open-source", "framework", "library",
"plugin", "extension", "desktop", "mobile". |
descriptions |
map[string, object] |
Yes | Map keyed by BCP 47 language tags (e.g. "en", "pt-BR", "es").
Each item MUST contain summary (max 256 chars), and MAY contain tagline and
text. |
license |
object |
No | License object with type (open-source, proprietary, freeware, commercial),
spdx_id, and commercial_terms. |
vendor |
object |
No | Legal organization details: name, website, country_code (ISO
3166-1 alpha-2), and support_url. country_code is where the vendor is
based, not where the product is offered. |
4.3 Capabilities Object (capabilities)
Declares deployment targets, functional interfaces (OpenAPI, MCP, gRPC), pricing, and ecosystem integrations.
| Field | Type | Req | Description |
|---|---|---|---|
deployment |
array[string] |
Yes | Non-empty array: "cloud", "self-hosted", "on-premise",
"hybrid", "desktop", "mobile", "edge",
"docker". |
interfaces.mcp |
object |
No | Model Context Protocol definition: version, transport ("sse",
"stdio", "streamable-http"), endpoint,
tools_count, and schema_url. |
interfaces.openapi |
object |
No | OpenAPI definition: version (e.g. "3.1.0") and spec_url. |
pricing |
object |
No | Pricing model ("free", "freemium", "subscription",
"usage", "one-time", "quote"), integer
starting_price_cents, and ISO 4217 currency. |
integrations |
array[string] |
No | List of supported integrations (e.g., ["kubernetes", "claude", "slack"]). |
Not in 2.0: where a product may be bought and used, its interface and support languages,
its billing currencies and where customer data is stored are proposed in
RFC 0006 as capabilities.availability. It is a working draft,
present only in msr-2.1-draft.json; a 2.0 manifest that carries it fails validation.
4.4 Releases Object (releases)
Details regarding active and historical distribution artifacts.
| Field | Type | Req | Description |
|---|---|---|---|
latest.version |
string |
Yes | Release version string (e.g. "2.4.0"). |
latest.published_at |
string (date-time) |
Yes | ISO 8601 UTC timestamp (e.g., "2026-09-15T14:30:00Z"). |
latest.release_type |
string (enum) |
No | One of: "major", "minor", "patch", "security",
"initial". |
latest.changelog_url |
string (URI) |
No | Direct URL to release notes or changelog. |
latest.artifacts |
array[object] |
No | Array of downloadable binaries: platform, uri, sha256 (64 hex
characters), and size_bytes. |
4.5 Trust Object (trust)
Cryptographic proof, domain ownership attestations, and security audits.
| Field | Type | Req | Description |
|---|---|---|---|
domain_verification |
object |
No | Verification method: dns-txt, well-known-http, or tls-alpn;
status: verified, pending, revoked. |
signatures |
object |
No | Cryptographic manifest signature: algorithm (ed25519,
ecdsa-p256), public_key, and manifest_signature. |
audit_receipt |
object |
No | Security audit record: auditor, audit_url, audit_date, and
status. |
4.6 Telemetry Object (telemetry)
Availability endpoints and bi-directional event notifications.
| Field | Type | Req | Description |
|---|---|---|---|
status_page |
string (URI) |
No | Public system uptime URL (e.g. "https://status.example.org"). |
webhook.url |
string (URI) |
No | HTTPS push receiver on the vendor's domain for real-time registry events. |
webhook.events |
array[string] |
No | Subscribed event triggers (e.g., ["release.published", "status.incident"]). |
5. Verification Standard
5.1 Domain Ownership Proof
Aggregators MUST NOT allow arbitrary third-party accounts to claim authority over external domains. Conformance requires one of two verification channels:
-
RFC 8615 Well-Known HTTP Proof: The manifest is fetched directly over HTTPS from
https://<domain>/.well-known/msr.jsonusing an SSRF-hardened HTTP client (strictly rejecting private/loopback IP blocks). -
DNS-TXT Challenge: A DNS TXT record on
_msr-challenge.<domain>containing the registry token.
5.2 Webhook Signature Verification
When registries send event notifications to telemetry.webhook.url, they MUST include two HTTP
request headers:
X-MSR-Timestamp: Integer Unix epoch timestamp.X-MSR-Signature: Hex-encoded HMAC-SHA256 signature calculated overtimestamp + "." + raw_body.
import hmac, hashlib
def verify_msr_webhook(secret: bytes, timestamp: str, raw_body: bytes, header_sig: str) -> bool:
signed_payload = f"{timestamp}.".encode("utf-8") + raw_body
computed = "sha256=" + hmac.new(secret, signed_payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(computed, header_sig)
6. Compatibility & Migration Guides
MSR JSON v2.0 is designed as an upgrade path for existing metadata standards:
-
Migrating from PAD XML: Use the official CLI utility
msr convert --from-pad <file.xml>to automatically transform legacy XML fields into normalized MSR v2.0 structures. Floating-point prices are automatically converted to minor currency units. -
Migrating from MSR v1.x: Top-level
softwareandvendorblocks are consolidated intoentity, andpad_versionis replaced byprotocol.version. -
OpenAPI 3.1 Linkage: Simply declare your existing OpenAPI specification inside
capabilities.interfaces.openapito enable automatic API indexing.
7. Developer Examples
Review complete, validated manifests for various deployment archetypes:
8. Specification Changelog
| Version | Date | Status | Key Changes |
|---|---|---|---|
v2.0.0 |
2026-09-17 | Current Stable | RFC 0001: Consolidation of entity archetype, native MCP & AI descriptors, integer minor currencies, Ed25519 trust signatures. |
v1.1.0 |
2025-11-20 | Legacy Bridge | Added webhook synchronization headers and JSON Schema validation. |
v1.0.0 |
2024-04-10 | Deprecated | Initial JSON translation of legacy ASP PAD XML standard. |