Versioning
protocol_version is a string "<major>.<minor>" matching ^\d+\.\d+$.
- Breaking changes bump the major (
"2.0"). - Backwards-compatible additions — new constraint types, new option
fields with defaults, new response extension fields — bump the minor
(
"1.1").
Changes by version
- 1.3 — the optional
ground_heightconstraint: points on the ground the character moves over, so a route can step or drop between levels. Opt-in: servers list"ground_height"insupported_constraints; a server that doesn't keeps refusing it withunsupported_constraint, and a 1.2 client never sends it. - 1.2 — references as prompts, each composing exactly like a text
segment: the
motion_referencesegment (a clip as the prompt) withlimits.max_reference_frames, and thevideo_referencesegment (a video as the prompt, byhttpsURL or inline base64) withlimits.max_video_bytesandlimits.max_video_seconds; and theinvalid_requesterror code. Opt-in per type: servers advertise"motion_reference"/"video_reference"insupported_segments(supports_motion_reference_mixedis then always true for a motion reference). A 1.0 client never sends either and sees no change; a server that doesn't list a type keeps refusing it withunsupported_segment. Clarified (1.0 meanings unchanged:rest_translation/rest_rotationare parent-local, andfill_mode: "rest"pins torest_rotation): clients SHOULD send identityrest_rotationon every joint, so parent frames are world-aligned at rest and rotations read as "turned from rest"; a server that cannot honour a non-identityrest_rotationMUST reject the request with400 invalid_skeletonrather than ignore it. See Rest rotations.
Comparison
Servers compare versions numerically, not lexicographically. So:
"1.10" > "1.2" ✓ (10 > 2)
"1.10" > "1.2" ✗ (string compare)
A v1.x server MUST accept any request protocol_version matching
^1\.\d+$ and SHOULD ignore unknown additive fields. A request with a
different major version MUST be rejected with version_unsupported.
Multi-major servers
A server MAY support multiple major protocol versions concurrently and
dispatch based on the request's protocol_version. The
extensions.MMCP_motion.version in the response always echoes the
version actually served.
What clients should do
- Read
Capabilities.protocol_versiononce at startup. - Send your request with the protocol version you implemented against.
- Treat unknown response fields as additive — log them, don't crash.
- On
version_unsupported, surface a clear error to the user with a pointer to upgrade the plugin.
Pin your client to the major version, not the exact minor. A v1.0
client should send "protocol_version": "1.0" and accept responses from
any v1.x server. New minor versions are opt-in via new request fields,
which old clients never send.