motionspec
The MotionSpec MCP server is a trust-enforced UI animation compiler and accessibility checker for creating, validating, compiling, and auditing motion-safe animations in AI-generated web apps. It provides five tools:
motion_catalog— Retrieve the catalog of verified animation primitives (names, purposes, parameter schemas, defaults) plus authoring rules. Call this first before writing any spec.motion_validate— Pre-check a MotionSpec JSON against the schema, primitive allow-list, parameter bounds, and injection rules. Returns precise[MS-XXX]error codes on failure (fail-closed).motion_compile— Deterministically compile a validated MotionSpec into production-ready vanilla GSAP JavaScript + CSS, with enforcedprefers-reduced-motionfallbacks, WCAG 2.2.2 pause paths for loops, and a performance budget report. Identical input always yields identical output.motion_audit— Statically audit a live URL's HTML and linked stylesheets for motion accessibility issues: missing reduced-motion guards (WCAG 2.3.3), non-transform/opacity animations, infinite loops without pause paths (WCAG 2.2.2), and<marquee>/autoplay over 5 seconds. Returns findings and areduced-motion-safebadge for clean sites.motion_stats— View telemetry summaries of routing and compile outcomes, where escalation clusters indicate which new primitives the catalog should add next.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@motionspecCreate a parallax scrolling effect for the hero background"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MotionSpec
MotionSpec is an open-core trust layer that checks and compiles reduced-motion-safe, on-budget UI animation for AI-generated web apps. An LLM authors a schema-validated JSON spec; a deterministic compiler emits vanilla-GSAP JavaScript + CSS — injection-proof and catalog-validated by construction, with an enforced prefers-reduced-motion fallback and a performance budget, with WCAG 2.2.2 (Pause, Stop, Hide) pause-path candidates reported — reduced-motion guards map to WCAG 2.3.3 (Animation from Interactions), Level AAA.
Run it two ways: as a keyless MCP server any LLM host can call (npx motionspec), or as a CLI compiler in your build (motion compile spec.json). Either way you keep plain files: vanilla-GSAP JavaScript plus CSS. (A WAAPI/CSS lowering exists in the codebase, but it has no CLI flag, no MCP tool and no schema target yet — see below.) MIT core. Docs: https://motionspec.dev
The thesis: capability lives in the catalog, not the model. A bigger model can write more elaborate specs, but it can never emit a primitive, parameter, or selector the Trust Boundary hasn't approved. The compiler trusts only what passes.
request ──> Routing (small model, Stage A) ──> MotionSpec (JSON)
│ cache · 1 repair-retry · escalation │
▼ ▼
telemetry TRUST BOUNDARY (fail-closed)
│
┌─────────────┴─────────────┐
▼ ▼
Compiler (no model, Stage B) WAAPI lowering (internal — no CLI/MCP path yet)
│ │
out/*.motion.js + .css Element.animate / IO / @keyframesNot to be confused with
Not to be confused with: the Android Material Components
MotionSpecclass, the iOS material-motionMotionSpec, Motion.dev / Framer Motion, the usemotion.com calendar app, the Motion Specialties mobility brand, or text-to-video generators (Runway/Sora/Kling/Viggle). MotionSpec checks the UI animation inside web apps — it does not generate video.
60-second start
npx motionspec # stdio MCP server — no install needed
claude mcp add motionspec -- npx motionspec # register in Claude Code / any MCP host
npm install -g motionspec # or take the CLI:
motion compile spec.json # deterministic build → ./out in your cwdThe host LLM authors the spec; the Trust Boundary stays enforced either way. Listed on the MCP Registry as io.github.MasterPlayspots/motionspec. A hosted MCP endpoint is live: keyless motion_catalog + motion_validate at https://api.motionspec.dev/mcp (streamable-http; keyed tiers cover compile/audit/stats) — setup: https://motionspec.dev/docs.
Claude Code plugin
This repo is also a Claude Code plugin: it bundles the MCP server (npx motionspec, all five tools, local, keyless) with two skills — /motionspec:motion (the author→validate→compile workflow) and /motionspec:audit <url> (motion-accessibility check, WCAG 2.2.2/2.3.3). Try it directly from a clone with claude --plugin-dir ., or install it from the community marketplace once listed:
/plugin marketplace add anthropics/claude-plugins-community
/plugin install motionspec@claude-communityRelated MCP server: GSAP MCP Server
Status
Version | v1.2.7 · schema frozen at spec v1 (ADR-0001, signed) |
Published | npm |
Tests | 302 green — injection attacks, 6000-spec fuzz, golden determinism, schema parity, pause-controls, motion-a11y audit · CI on Node 18/20/22 + x86 Playwright e2e |
Catalog | 40 primitives, every one device-verified, reduced-motion-fallback mandatory; the 18 continuous loops also carry a WCAG-2.2.2 pause path |
Supply chain | 2 runtime deps (MCP SDK, zod — both pinned) · 0 vulnerabilities · CycloneDX SBOM committed · all permissive licenses · CI actions SHA-pinned |
Coverage | 99.06% lines / 99.09% functions / 79.05% branches of |
Last audit | 2026-07-03 — 17/17 integration handshakes evidenced, infra 8.1/10, security: 0 critical, full-git-history secret scan clean |
First client | CHS Computer — live on Vercel |
Hosted MCP | live — keyless |
Schema v1 is frozen: specVersion "1.0" is the stable public contract; "0.1" is deprecated and accepted until v1.2 (a tripwire test enforces the revisit). The [MS-XXX] error-code registry is public API — codes are never reused or redefined.
What the compiler guarantees
Allow-list — a primitive not in the catalog never reaches the compiler.
Injection-proof — ids, selectors, string params and triggers are charset-validated; every interpolation is a JS literal (
JSON.stringify) or a CSS-screened raw value through one shared safety gate (safety.js). Malicious model output is rejected fail-closed — tested and fuzzed over 6000 random specs.a11y by construction (motion) — safe defaults, enforced gates, and proof per build.
respectReducedMotionis default-on at the compiler level (fail-safe): omitting it still yields aprefers-reduced-motionguard. Opting out is possible but emitsMS-GLOBALS-RRM-OFF; a prompt-side instruction alone can never disable the guard.Pause/Stop for loops (WCAG 2.2.2) — every continuous loop primitive is tagged
a11y.persistent, and the compiler emits a pause path by construction: ananimation-play-state: pausedrule keyed onhtml[data-ms-paused](outside the reduced-motion guard, so it is always live) plus, underpauseControls: "auto"(the fail-safe default), one accessible pause/stop toggle (type="button",aria-pressedin sync, ≥24 px target, visible focus ring, not rendered under reduced motion).pauseControls: "api"keeps the CSS contract and leaves the control to the integrator;"off"opts out but emitsMS-GLOBALS-PAUSE-OFFwhen a persistent motion is present. The promote-gate refuses anyinfinite/repeat:-1primitive that is nota11y.persistent. A spec with no loops adds zero extra bytes.Determinism — same spec ⇒ byte-identical code (golden-file tests for the GSAP output and for the internal WAAPI lowering).
Versioned — schema frozen v1; catalog SemVer enforced by a diff-gate (a tightened bound shipped as a "patch" fails CI); specs may pin
catalogVersionfor reproducibility (MS-CATALOG-PIN-MISMATCHfail-closed).Observability — every request logs
model | model-repaired | cache-hit | escalate-*(local: JSONL sink · hosted: Cloudflare Analytics Engine, PII-scrubbed). Escalation clusters are the growth signal for new primitives.
One build target, one internal lowering
What you can get out of the compiler today, through the CLI or the MCP tools, is exactly one target:
vanilla-gsap— GSAP + ScrollTrigger.meta.targetaccepts nothing else (schema frozen at v1).
A second lowering exists in the codebase and is kept green by the test suite, but it is not reachable through any interface:
WAAPI/CSS lowering (
src/compiler/lower-waapi.js) — zero-GSAP output onElement.animate, IntersectionObserver, and@keyframes/position: sticky. Full catalog coverage, byte-identical golden per primitive, same accessibility guard, same CSS safety gate. This is the framework-decoupling hedge: the IR outlives any animation library. Internal — referenced only by the tests andbin/promote-gate.js; there is no CLI flag, no MCP tool and no schema target for it (ADR-0001 freezesmeta.targettovanilla-gsap; engine wiring is out of scope, ADR-0002). Do not plan a build on it until a release note says otherwise.
The catalog grows itself — humans keep the taste
The Catalog Forge (CI workflow, manual dispatch) picks the top telemetry-ranked gap, generates one candidate primitive, drives it through a multi-stage gauntlet — meta-schema, mandatory reduced-motion fallback, performance budget, output determinism (entropy tokens like Math.random/Date.now fail the gate), catalog-SemVer legality, golden creation — and opens a PR. It cannot merge, publish, or deploy: structurally (workflow permissions carry no packages/id-token, PR-only) and by regression test (forge-workflow-guard fails CI if anyone smuggles a publish step in). Gate 1 is always a human taste review.
MCP server
Tool | Contract |
| primitives + authoring rules + catalog version (16-hex pin) |
| fail-closed Trust Boundary; precise |
| deterministic spec → code; never emits on a failed validation |
| static motion-a11y check of a live URL (read-only, open-world) |
| telemetry summary (escalations = catalog growth signal) |
Input is size-capped (MS-INPUT-TOO-LARGE, 64 KB). The stdio server exposes one tool factory as the single source of truth, contract-tested in test/mcp.test.mjs. A hosted MCP endpoint is live: keyless motion_catalog + motion_validate at https://api.motionspec.dev/mcp; keyed tiers cover compile/audit/stats.
Motion-a11y checker
motion audit <url> (CLI, --json for the machine payload) and the motion_audit MCP tool run a static scan of a page's HTML and linked stylesheets — no headless browser, no new dependency. It reports four motion problems: CSS animation/transition without a prefers-reduced-motion guard (WCAG 2.3.3), animated properties other than transform/opacity, infinite animations with no pause path (animation-play-state/data-*), and <marquee>/autoplay motion over 5 s (WCAG 2.2.2). Each finding carries a selector, the WCAG reference, and a copy-paste fix. It is honest about its limits: runtime motion (WAAPI/GSAP/JS) is reported as not audited (V2) rather than silently passed. A page that clears every check earns the reduced-motion-safe badge — the exact output MotionSpec itself produces.
Use in CI
motion audit --json is stable enough to gate a pull request. examples/ci/motion-audit.yml is a copy-and-adapt GitHub Actions workflow that builds your site, serves the build directory on localhost, audits the paths you list with npx -y -p motionspec@1.2.7 motion audit <url> --json (local, MIT, no key, no hosted call), and compares each page with a checked-in baseline .motionspec/baseline.json.
The gate fails when a page got worse — the same rule MotionSpec's weekly re-scan uses: the score fell, or the number of Level-A findings (WCAG 2.2.2 Pause, Stop, Hide) rose. A page without a baseline entry never fails; that run is the baseline. Re-baselining is a deliberate manual run (workflow_dispatch with update_baseline: true) that uploads the new file as an artifact for you to commit — the workflow never commits on its own. Fixed findings are listed as - fixed: lines, new ones as + new finding:.
The machine payload is { ok, url, score, badge, findings: [{ selector, rule, wcag, fix }], summary, disclosures }; badge is the literal "reduced-motion-safe" only at zero findings. Note that audit takes a URL, not a directory — hence the local server step. And the scope caveat travels with it: this is a static CSS scan (no inline style="", @import, CSS-in-JS, external JS bundles, video/GIF/Canvas, or flashing checks); a green gate means "no regression in the loaded CSS", not "accessible".
Specification & conformance
MotionSpec is a governed format, not just a tool. The normative spec is SPEC.md (versioned 1.0, RFC-2119 MUST/SHOULD/MAY over the JSON Schema, with a documented ADR-based change process). CONFORMANCE.md defines the five checks (schema, diagnostics, output, determinism, accessibility) an implementation passes to call itself MotionSpec 1.0 compatible, run against the published test/golden corpus. Multiple implementations passing the same corpus is what makes it a standard.
Standards mapping
MotionSpec turns specific legal and normative accessibility requirements into compiler-enforced defaults. Each check maps to the frameworks that mandate it:
MotionSpec mechanism | WCAG 2.2 | EN 301 549 | U.S. Section 508 | EAA / BFSG |
Pause/stop path for every continuous loop ( | SC 2.2.2 Pause, Stop, Hide (Level A) | clause 9.2.2.2 (mirrors the WCAG SC) | incorporated (WCAG 2.0 A/AA baseline; 2.2.2 is Level A, in scope) | conformance presumed via EN 301 549 |
Reduced-motion guard on every motion ( | SC 2.3.3 Animation from Interactions (Level AAA) | clause 9.2.3.3 | beyond the AA baseline; provided anyway | supports the EAA "perceivable/operable" duties |
| 2.2.2 / 2.3.3 | clause 9 (web) | WCAG-incorporated success criteria | pre-market self-check for covered products |
Notes: EN 301 549 is the EU harmonised standard whose clause 9 adopts the WCAG success criteria by number. U.S. Section 508 (Revised) incorporates WCAG 2.0 Level A and AA — SC 2.2.2 is Level A and therefore in scope; SC 2.3.3 is Level AAA and is provided as a stronger guarantee than the baseline requires. The European Accessibility Act (EAA) and its German transposition (BFSG, applicable from 28 June 2025) require covered digital products and services to be accessible, with conformance commonly demonstrated against EN 301 549. MotionSpec enforces the motion subset of these obligations by construction; it does not by itself make an entire product conformant.
Quickstart (from a clone)
npm ci # install (0 runtime deps beyond MCP SDK + zod)
npm test # 302 tests: validator, goldens, router, fuzz, parity
node bin/motion.js catalog # primitives + catalog version
node bin/motion.js compile examples/hero.motionspec.json
node bin/motion.js pipeline "Hero headline fades in, cards staggered" --mock
node bin/motion.js stats # telemetry (model / repaired / cache-hit / escalate)Live model instead of --mock: set MOTION_API_KEY (or OPENROUTER_API_KEY); optional MOTION_MODEL (default anthropic/claude-haiku-4.5) and MOTION_BASE_URL (any OpenAI-compatible endpoint). See .env.example.
Gates (run these — they are the contract)
npm test # full suite, fail-closed trust boundary + golden determinism
npm run coverage # FAILS under 90/90/75 (lines/functions/branches)
npm run catalog-lock:check # ADR-0001 D2: a tightened bound shipped as a "patch" fails here
npm run sbom && npm run sbom:check && node bin/license-check.js
npm run e2e # real-browser Playwright (CI x86 runner)Releases run the whole chain plus a canonical-clone guard and finish with a registry truth check — a version is "live" when the npm dist-tag says so, not when a local run went green.
Security
Defense in depth on the hosted path: constant-time admin-secret comparison (no timing side channel on position or length) · customer keys stored hashed (SHA-256) in KV, fail-closed on any lookup error · pre-auth per-IP rate limiting closes the key-enumeration gap before auth work starts, per-key limiting after · throttled abuse alerts with zero PII · telemetry scrubbed before storage · strict CSP/X-Frame-Options/nosniff on the only ungated page (a data-free dashboard shell). Full posture incl. reporting: SECURITY.md. Last audit (2026-07-03): no critical findings, no secret ever committed across 197 commits of history.
Layout
schema/ MotionSpec JSON schema (static contract, parity-tested against the validator)
primitives/ catalog: 40 verified primitives (safe templates)
catalog.lock.json released catalog baseline (SemVer diff-gate)
src/compiler/ validate.js (Trust Boundary) · compile.js (GSAP) · lower-waapi.js (WAAPI/CSS)
safety.js (one shared CSS gate) · keyword-map.js · catalog.js · catalog-semver.js
src/router/ prompt.js · clients.js (openai-compat + mock) · route.js · cache.js · telemetry
src/mcp/ server.mjs (stdio) · register-tools.js (shared tool factory)
src/forge/ generate.js · prioritize.js — the gauntlet-verified catalog forge
src/discover/ gap analysis: request intents ↔ catalog coverage
src/demo/ device-verification demo pages (`?rm=1` simulates reduced motion)
bin/ motion.js (CLI) · promote-gate.js — dev/CI gate scripts stay repo-only
test/ 302 tests incl. injection, fuzz, goldens (GSAP + internal WAAPI lowering), parity; test/e2e (Playwright)
docs/ ADR records (docs/adr/) and per-primitive reference (docs/primitives/)Docs
AGENTS.md — what a coding agent should know: when to use MotionSpec, the commands, the three motion rules (reduced motion · pause path · no flashing), and what the audit does not check. The same rules in editor form:
.cursor/rules/motionspec.mdcand.github/copilot-instructions.md.SECURITY.md — security posture of the npm package and hosted endpoint.
docs/adr/0001-schema-freeze-v1.md— the frozen v1 contract and why.
Contributing
CONTRIBUTING.md covers setup, the gate-driven PR checklist, commit conventions, golden-file regeneration, and a short architecture tour. Issue templates live under .github/ISSUE_TEMPLATE/.
License
MIT.
Available Tools
5 toolsmotion_auditAudit a live URL for motion accessibility (WCAG 2.2.2 / 2.3.3)ARead-onlyInspect
Static motion-a11y checker: fetches a URL's HTML + linked stylesheets and scans the CSS for (1) animation/transition without a prefers-reduced-motion guard, (2) animated non-transform/opacity properties, (3) infinite animations with no pause path, (4) /autoplay >5s. Runtime motion (WAAPI/GSAP/JS) is disclosed as 'not audited (V2)'. Returns {ok, score, findings, summary, badge, disclosures, markdown}; a clean site earns the badge 'reduced-motion-safe'. Does network I/O (openWorldHint).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page URL to audit (http/https). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description adds significant behavioral context: fetches HTML+linked stylesheets, scans CSS for four categories, returns specific JSON structure including badge and disclosures. Discloses network I/O explicitly, aligning with openWorldHint. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is compact for the amount of detail, front-loading purpose and listing checks in a clear numbered list. Each sentence adds value. Slightly long but appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description specifies the return structure ({ok, score, findings, summary, badge, disclosures, markdown}) and the condition for the badge. It covers limitations (runtime not audited) and network behavior. Complete for a single-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter (url) with 100% description. Description adds meaning by explaining the tool fetches the URL's HTML and linked stylesheets, implying the URL is the target page. This adds context beyond the schema's basic type and format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'audit' with resource 'live URL', lists four concrete CSS checks, and explicitly distinguishes from runtime motion auditors by disclosing 'Runtime motion... not audited (V2)'. This differentiates from sibling tools (catalog, compile, stats, validate) clearly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly states use case for static motion accessibility checks on live URLs. Highlights that runtime motion is not covered, guiding agents to avoid this tool for JS-based motion. Could be more explicit about when to prefer sibling tools, but the limitation is clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
motion_catalogMotionSpec catalog & authoring rulesARead-onlyInspect
Returns the catalog of verified motion primitives (names, purpose, parameter schemas, defaults) plus the authoring rules for writing a MotionSpec. Call this FIRST, then write the spec yourself and validate it with motion_validate (motion_compile runs in the CLI or with a key on the hosted endpoint).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readonly and non-open-world, so the core safety profile is clear. The description adds useful behavioral context about what the tool returns and its intended position as the first step in an authoring workflow. It does not hide any mutation or side-effect risk, and no destructiveness is implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the core purpose and contents, and the second sentence efficiently provides the required workflow context and points to sibling tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only catalog tool with no output schema, the description is complete: it states what is returned, when to call it, how to proceed afterward, and how the compile step is accessed. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to clarify. The description compensates by explaining what the returned catalog includes and how to use it, meeting the baseline for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns the catalog of verified motion primitives...' and also explicitly includes 'authoring rules for writing a MotionSpec.' It distinguishes itself from the sibling validation, compilation, audit, and stats tools by describing exactly what this catalog tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct workflow guidance: 'Call this FIRST, then write the spec yourself and validate it with motion_validate.' It also explains when motion_compile is appropriate ('runs in the CLI or with a key on the hosted endpoint'), which helps the agent choose the right tool in the sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
motion_compileCompile a MotionSpec to GSAP/CSSARead-onlyIdempotentInspect
Validates (fail-closed) and deterministically compiles a MotionSpec into production-ready vanilla-GSAP JavaScript and CSS, with enforced prefers-reduced-motion fallbacks and a performance-budget report. Same spec always yields identical code. Returns {ok, js, css, report} or {ok:false, errors}.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | The MotionSpec JSON object | |
| specName | No | Optional name used in the artifact header |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant context beyond annotations: it discloses deterministic compilation (idempotent), fail-closed validation, enforcement of prefers-reduced-motion, and a performance report. Annotations already indicate idempotentHint and readOnlyHint, but the description elaborates with concrete behaviors and outputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the key action and outputs. Every sentence adds value: the first covers validation, compilation, and features; the second covers determinism and return shape. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description fully explains the return structure ({ok, js, css, report} or errors). It covers input, process, and output comprehensively for a compilation tool. Nested objects are described as MotionSpec JSON, and the behavioral details are complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with basic descriptions. The description enhances understanding by explaining that the spec is validated and compiled deterministically, and that specName is for artifact headers. This adds semantic value beyond the schema's minimal descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool validates (fail-closed) and compiles a MotionSpec into GSAP/CSS with deterministic output, specifying verb, resource, and output format. It distinguishes itself from siblings by focusing on compilation, while others like motion_validate and motion_audit handle different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (e.g., for production-ready code with reduced-motion fallbacks) but does not explicitly contrast with siblings or state when not to use it. The context is clear enough for an agent to infer, but lacks explicit exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
motion_statsMotionSpec usage telemetryARead-onlyInspect
Summary of routing/compile telemetry (counts per outcome). Escalation clusters indicate which new primitive the catalog needs next.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true (safe read) and openWorldHint=false. The description adds meaningful behavioral context: it returns aggregated counts per outcome and identifies escalation clusters for catalog needs. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences and no unnecessary words. It is front-loaded with the core purpose ('Summary of routing/compile telemetry') and efficiently conveys the key output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description adequately describes the return content (counts per outcome, escalation clusters). However, for a telemetry tool, it might be improved by clarifying the time period or data scope, though it is sufficient for basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters with 100% schema coverage (empty object). There are no parameters to document, so the description need not add parameter information. Baseline score of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides a summary of routing/compile telemetry with counts per outcome and escalation clusters indicating catalog needs. However, it does not explicitly differentiate from sibling tools like motion_audit or motion_catalog, which could share similar purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, limitations, or comparison with sibling tools. The description only states what it does without any usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
motion_validateValidate a MotionSpec (trust boundary)ARead-onlyInspect
Checks a MotionSpec against the schema, the primitive allow-list, parameter bounds and injection rules. Fail-closed: returns ok=false with precise errors. Returns {ok, errors, warnings, deprecations, catalogVersion}. IMPORTANT: warnings[] carries the WCAG 2.2.2 / reduced-motion findings and can be non-empty while ok=true — a spec that compiles is not automatically accessible. Use to pre-check a spec before compiling.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | Yes | The MotionSpec JSON object |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint and openWorldHint annotations by disclosing fail-closed behavior, the exact return shape, and the non-obvious fact that warnings can be non-empty while ok=true. It also explains the accessibility implication, which is critical for correct agent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core validation behavior stated first, followed by the return shape and the critical warning caveat. Every sentence earns its place, and the formatting highlights the most important behavioral nuance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only validation tool with no output schema, the description fully covers what the tool does, when to use it, what it returns, and the key failure and warning semantics. An agent has sufficient information to select and invoke it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single parameter is 100%, so the baseline is 3. The description adds meaningful semantics by clarifying that the spec parameter is a MotionSpec and by enumerating the validation dimensions applied to it, such as the primitive allow-list and injection rules, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Checks') and a specific resource ('MotionSpec'), then enumerates exactly what it validates against: schema, primitive allow-list, parameter bounds, and injection rules. It clearly distinguishes itself from the sibling motion_compile by positioning validation as a pre-compile safety check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use to pre-check a spec before compiling,' which gives clear guidance on when to call this tool. It also explains the important warning behavior so an agent knows this is the right tool for accessibility checks before compilation, though it does not explicitly name or exclude alternatives beyond the pre-compile framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
motion_audit - First observed
motion_catalog - First observed
motion_compile - First observed
motion_stats - First observed
motion_validate
TDQS
Scored across 5 tools
Most tools have clearly distinct roles: catalog, audit, and stats are unambiguous, while validate and compile overlap because compile also performs fail-closed validation. The descriptions mitigate this by positioning validate as a pre-check and compile as the production step, leaving only minor ambiguity.
All tools share a consistent motion_ prefix and usesnake_case, which makes the set predictable. However, the second element mixes nouns like catalog, audit, and stats with verbs like validate and compile, deviating slightly from a strict verb_noun convention.
Five tools is a compact, deliberate set that covers authoring, validation, compilation, accessibility auditing, and telemetry. Each tool has a clear role in the workflow with no apparent redundancy or bloat.
The core pipeline of fetching the catalog, validating a spec, and compiling it into production assets is fully supported, with audit and stats as complementary capabilities. The only notable gap is that motion_audit cannot inspect runtime JavaScript animation, though it explicitly discloses this as a V2 limitation.
Maintenance
Related MCP Connectors
Turn any LLM multimodal; generate images, voices, videos, 3D models, music, and more.
Live React design-system APIs, patterns, and code validation so AI agents build real UI, not slop.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Design, save, and run outcome-aligned AI workflows and verifiers, with reliable image output.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI models to generate production-ready, 60fps-optimized GSAP animation code from natural language requests. It provides expert-level tools for creating complex sequences, debugging performance issues, and setting up GSAP within modern web frameworks.6355 npm4MIT
- FlicenseCqualityDmaintenanceGenerate GSAP animation code through natural language descriptions and integrate with Claude Desktop for easy animation development.435-
- AlicenseNot gradedqualityFmaintenanceTransforms Claude into a GSAP animation expert with AI-powered natural language animation creation, complete API coverage, and production-ready patterns for all GSAP features and plugins.92 npm122MIT
- FlicenseBqualityDmaintenanceAnalyzes scroll-triggered animations on any webpage using Playwright, extracting GSAP, ScrollTrigger, Lenis, and CSS code via AST and runtime detection.16-