Skip to main content
Motion Model Context Protocol — v1.0-rc1

One protocol.
Any motion model.

A vendor-neutral HTTP contract for text- and constraint-driven motion generation. Send a skeleton and a prompt; get back a standard glTF 2.0 animation. Build motion-capable plugins for any DCC without locking yourself to a single AI vendor.

Wire formatJSON request, glTF 2.0 responsePython SDKpip install motionmcp-sdkStatusRelease candidate
The contract, in three verbs

Discover. Generate. Decode.

MMCP is two HTTP calls and a glTF document. No SDK to install. No vendor lock-in. The same wire format works for every backbone — diffusion, transformer, or hybrid.

01 — Discover

What can the model do?

Ask the server which models it hosts, which constraints they support, what fps they run at, and what canonical skeleton they expect.

GET /capabilities
02 — Generate

Hand it your skeleton.

Send the user's actual skeleton — joint names, parent links, rest pose. Add a prompt or a few constraints. The server returns a glTF document with one animation per sample.

POST /generate
03 — Decode

Apply the animation.

The response is standard glTF 2.0 — load it with any glTF parser. Optional extensions.MMCP_motion carries fps, foot-contact masks, and chunk boundaries.

model/gltf+json
Hand-writable

A minimal request fits in five lines.

No upload step. No buffers in the request. Just JSON — the character's skeleton plus a description of the motion you want.

Read the request schema for the full surface, or jump to the client quickstart to send your first request in under five minutes.

POST · /generateapplication/json
{
"protocol_version": "1.0",
"model": "kimodo-soma-rp",
"skeleton": { "joints": [ /* canonical or your own */ ] },
"segments": [
{
"type": "text",
"prompt": "a person walks forward, then waves",
"duration_frames": 120
}
]
}
Design principles

Built for studios, not demos.

The protocol surface is intentionally small. Implementation details — backbones, retargeters, post-processors — sit behind the contract where they belong.

⊕

Vendor-neutral

Any motion-generation backbone implements the same wire format. Swap models without rewriting your plugin.

{ }

Plain JSON in, glTF out

No proprietary formats. Inputs are a single JSON document; outputs load into any tool that reads glTF 2.0.

⌗

Skeleton-respectful

Send the user's skeleton verbatim. Servers retarget under the hood. No imposed canonical naming.

◐

Discoverable

One GET tells you which models, which constraints, which fps, and what limits. No surprises at runtime.

↻

Versioned for the long haul

Major versions for breaking changes. Minor versions add capabilities. Servers run both concurrently when needed.

✦

Hand-writable

A minimal request is five lines. The contract is small enough to reason about end-to-end in one sitting.

Building a server in Python?

There's an SDK so you don't have to start from scratch.

motionmcp is a thin Python package that handles the wire format, validation, error envelope, and glTF encoding. You write a Backbone subclass; it serves the protocol. The SDK is a convenience — the protocol stands alone, in any language.

pip install motionmcp-sdk
python · server.pymotionmcp 0.1
from motionmcp import (
Backbone, ModelSpec, GenerateRequest,
MotionResult, serve,
)

class MyBackbone(Backbone):
def capabilities(self) -> ModelSpec:
return ModelSpec(
id="my-model",
fps=30.0,
canonical_skeleton=load_skeleton(),
supported_constraints=["pose_keyframe"],
)

async def generate(self, req: GenerateRequest):
return MotionResult(
rotations=self.model.run(req),
root_translations=self.model.run_root(req),
)

if __name__ == "__main__":
serve(MyBackbone())

Read the protocol. Send a request. Ship.

The protocol surface is small enough to read end-to-end in one sitting. The quickstart sends a real request in under five minutes.