_ registry / mcp streamable-http · checked 1h ago

motion

https://motion.frapea.com

Registry code: 52aee86bccce87cf

api record

Motion makes animated graphic videos from code, rendered in the user's browser tab. Start by calling connect with the token shown on the Motion page, then read_skill {topic:"motion"} before writing any composition. Unless they ask for plain, aim for something people would stop for — think well beyond a PowerPoint of titles and bullets; the story, its moments and the look are yours to decide. Build UI-like parts (buttons, pills, progress bars, cards) first on a parts board and check them in one large frame, then compose scenes from them. Someone is watching that tab while you work: build one…

endpoint
https://motion.frapea.com/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is motion live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is motion free to use?
No — it asks for a key or a login before it will serve.
What tools does motion have?
19 tools: list_compositions, set_props, get_problems, get_composition, close_composition, check_playback, get_media, connect, ….
Is motion safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
62ms

last good check

priced tools
0

of 19 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 19 tools
19 auth-required 19 of 19 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_compositions auth-required never probed

    The compositions open in the tab, and which one is on screen.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • set_props auth-required never probed

    Sets prop values on a composition — the same values the user's controls change. Merged, so you can send one key.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "props"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "props": {
          "type": "object"
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 20 lines
  • get_problems auth-required never probed

    WHAT WENT WRONG in the user's tab: frames that failed to render (with the frame and the engine's own words), a preview that stopped moving (and at which frame, and why), compositions that would not load, clips that will not decode, missing footage, failed exports, a page the browser killed — plus warnings (notes about unread styles and the like). Call it FIRST when the user says something is broken or looks wrong. Works while the tab is hidden or closed: the tab sends what it saw to the session as it happens. `current` belongs to the composition as it is now; `earlier` counts problems an edit has since left behind. New problems also arrive on their own: any tool result may carry a `problems` list of what is new since you last heard. An empty list only covers what the tab has actually played — run check_playback for a full pass.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Only this composition. Omit for all of them."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "includeWarnings": {
          "type": "boolean",
          "description": "Include warnings (default true)."
        }
      },
      "additionalProperties": false
    }
    arguments 21 lines
  • get_composition auth-required 1h ago

    One composition in full: manifest, every source file, and current prop values. Read this before update_composition so you edit what is actually there.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Omit for the active one."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • close_composition auth-required never probed

    Closes a composition and removes it from the user's tabs. Use it to clear up attempts you made along the way — an agent that leaves ten of them behind has handed the user the tidying. Needs an explicit id; it will never guess the active one.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "The composition to close. Required."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 18 lines
  • check_playback auth-required 1h ago

    PLAY IT THROUGH. Puts the composition on the user's stage and plays it from frame 0 through the real preview — the path a person watches, which inspect_composition does not take — from the first frame to the last. Buffering is fine; any error ends it. Answers within about 20 s: {status:"running", at, total} means call again with the same id to keep waiting (it continues the same run). Then {status:"done", verdict:"ok"|"problems", problems, warnings} or {status:"incomplete", reason} — hidden (ask the user to bring the tab to the front), interrupted, edited. A piece is not finished until this says ok. It takes over the stage while it runs, so tell_user first.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Omit for the active one."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • get_media auth-required 1h ago

    The raw bytes of one file, base64. Capped at about 600 KB — for anything larger, and for every video, use inspect_media instead: it answers what is IN the file for a fraction of the size.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • connect auth-required never probed

    Pairs you with a Motion browser tab. The user has an eight-character code on screen, under the Connect MCP button — something like K7M4-P2Q9. Call this once at the start. It returns a session token; pass that token to every other tool. The code itself stops working the moment it is used, so keep the token, not the code.

    mcp-tool

    {
      "type": "object",
      "required": [
        "code"
      ],
      "properties": {
        "code": {
          "type": "string",
          "description": "The eight-character pairing code shown on the Motion page."
        }
      },
      "additionalProperties": false
    }
    arguments 13 lines
  • create_session auth-required never probed

    Starts a Motion session WITHOUT the user having a tab open. Use this when they have no pairing code — you can create and edit compositions immediately, and give them the returned link when they want to watch. Anything needing to SEE the result (inspect_composition) or touching their media still requires them to open it: send them the link, then call wait_for_tab rather than asking them to report back. The scene is kept for 24 hours after the last change.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • wait_for_tab auth-required never probed

    WAIT UNTIL THEY HAVE MOTION OPEN. Everything that has to SEE a composition — inspect_composition, and anything touching their media — runs in their browser, so it needs the tab. Ask them to open the session link, then call this instead of asking them to tell you when it is ready. It returns as soon as the tab connects, or after about 25 seconds with tabConnected false — in which case call it again, or give up and say so. Do not spin on it: two or three waits, then tell them you are waiting and stop.

    mcp-tool

    {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    }
    arguments 5 lines
  • tell_user auth-required never probed

    PUT A SENTENCE ON THEIR SCREEN, as you work. They are watching the Motion tab while you build, and between your tool calls it shows nothing — a busy agent and a hung one look identical from there. Call this at every step that takes more than a few seconds: what you are about to do, what just landed, what you had to fix. Write like a person talking to someone over their shoulder, one sentence, no jargon. kind:'done' when the whole job is finished and kind:'problem' the moment you are stuck — those are the two endings they are waiting for. Read read_skill {topic:'motion-workflow'} for how this fits the rest.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "text"
      ],
      "properties": {
        "of": {
          "type": "number",
          "description": "How many there are in total, e.g. 5 — draws a progress bar. Send both or neither, and only when you genuinely know the total; a bar that goes backwards is worse than none."
        },
        "kind": {
          "enum": [
            "working",
            "done",
            "problem"
          ],
          "type": "string",
          "description": "Omit while working. 'done' ends the job, 'problem' flags a blocker."
        },
        "step": {
          "type": "number",
          "description": "Which one you are on, e.g. 2."
        },
        "text": {
          "type": "string",
          "description": "One friendly sentence, first person. Not a log line."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 35 lines
  • read_skill auth-required never probed

    Motion's authoring guides. Read {topic:'motion'} first — it is the API contract: what compiles, what resolves, what renders. Then {topic:'motion-craft'} ALWAYS before writing a line, because the API guide alone produces compositions that render correctly and look generated. 'motion-text' for typography, 'motion-effects' for named looks, 'motion-transitions' for sequencing scenes inside one composition. 'motion-examples' before choosing a look: two whole pieces that look nothing alike. 'motion-workflow' is about working while someone watches: showing progress, and checking your own frames for overflow — read it before a job of more than one scene. 'motion-review' is the argument that makes a piece better than its first draft: a creative director, a designer and a marketer judge your frames in rounds — read it for anything with an audience and a purpose.

    mcp-tool

    {
      "type": "object",
      "required": [
        "topic"
      ],
      "properties": {
        "topic": {
          "enum": [
            "motion",
            "motion-craft",
            "motion-text",
            "motion-effects",
            "motion-transitions",
            "motion-examples",
            "motion-workflow",
            "motion-review"
          ],
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 22 lines
  • list_media auth-required never probed

    The user's media library: folders, and files with id, name, kind, size and folder. `storage` says whether a file is 'linked' (still on their disk) or 'copied' (held by the browser) — a linked file can need the user to re-grant access after a reload.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "path": {
          "type": "string",
          "description": "Folder to list. Omit for all."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 17 lines
  • put_media auth-required never probed

    Adds a file to the library from a URL — the BROWSER fetches it, so nothing travels through this connection, but it only works on https hosts that send CORS headers. TO UPLOAD A FILE YOU ALREADY HAVE ON DISK, DO NOT USE THIS: run `curl -X POST --data-binary @FILE 'BRIDGE/media/upload?token=TOKEN&name=NAME'` from your shell instead (up to 10 MB). Reading a file into `data` costs hundreds of thousands of tokens for something curl streams for free; `data` is for small generated assets only.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "name"
      ],
      "properties": {
        "url": {
          "type": "string",
          "description": "http(s) URL for the browser to fetch."
        },
        "data": {
          "type": "string",
          "description": "Base64 bytes, for small assets."
        },
        "name": {
          "type": "string",
          "description": "Filename, including extension."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "folder": {
          "type": "string",
          "description": "Folder to put it in. Omit for the root."
        }
      },
      "additionalProperties": false
    }
    arguments 30 lines
  • inspect_media auth-required never probed

    Looks INSIDE a file. Returns ONE contact sheet — every requested moment as a labelled cell in a single grid image. Pass atSec (up to 12 timestamps, seconds); omit it for an even spread across the whole clip. This is how you analyse a video second by second without paying for a dozen separate images.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "atSec": {
          "type": "array",
          "items": {
            "type": "number"
          },
          "description": "Up to 12 timestamps."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        }
      },
      "additionalProperties": false
    }
    arguments 24 lines
  • organize_media auth-required never probed

    Library housekeeping. action: 'move' (ids + toFolder), 'delete' (ids), 'createFolder' (name + optional parent), 'deleteFolder' (folder — the files inside move up one level, nothing is lost).

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "action"
      ],
      "properties": {
        "ids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "name": {
          "type": "string"
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "action": {
          "enum": [
            "move",
            "delete",
            "createFolder",
            "deleteFolder"
          ],
          "type": "string"
        },
        "folder": {
          "type": "string"
        },
        "parent": {
          "type": "string"
        },
        "toFolder": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
    arguments 41 lines
  • create_composition auth-required never probed

    Writes a new composition and opens it as a tab in front of the user. `files` maps path to TSX source and must include the entry (default composition.tsx). Read read_skill {topic:'motion'} and {topic:'motion-craft'} first — this API is not guessable and the craft guide is what stops the result looking generated. Aim well beyond a slide deck. With UI-like parts, write them in their own file with a partsBoard prop (default false) and check the board before building scenes.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token",
        "name",
        "width",
        "height",
        "fps",
        "durationInFrames",
        "files"
      ],
      "properties": {
        "fps": {
          "type": "number"
        },
        "name": {
          "type": "string"
        },
        "entry": {
          "type": "string",
          "description": "Defaults to composition.tsx."
        },
        "files": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "width": {
          "type": "number"
        },
        "height": {
          "type": "number"
        },
        "schema": {
          "type": "object",
          "description": "Props schema; drives the editable controls."
        },
        "durationInFrames": {
          "type": "number"
        }
      },
      "additionalProperties": false
    }
    arguments 48 lines
  • update_composition auth-required never probed

    Edits an existing composition. `files` is MERGED by path, so send only what changed. Changing the schema keeps any prop values that still have a home.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Omit for the active one."
        },
        "fps": {
          "type": "number"
        },
        "name": {
          "type": "string"
        },
        "files": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "width": {
          "type": "number"
        },
        "height": {
          "type": "number"
        },
        "schema": {
          "type": "object"
        },
        "durationInFrames": {
          "type": "number"
        }
      },
      "additionalProperties": false
    }
    arguments 41 lines
  • inspect_composition auth-required never probed

    LOOK AT WHAT YOU MADE. Renders frames of a composition and returns them as one labelled contact sheet. Pass atFrames (up to 12), or omit them: the sheet is then an even spread PLUS the joins between your scenes (labelled "end of a scene", "start of a scene", "mid transition") — where a card caught half-way or an empty gap hides. ONE frame comes back large (1560 px), two at 960 — ask for one when you need to see detail: padding, a label off centre, a fill over its border. `props` are merged over the composition's for this picture only — {partsBoard:true} draws the parts board without changing anything. Each frame reports its content share (how much is not background) — compare frames of one piece: one far below its neighbours is usually a gap between scenes. Use it after every create or update — timing, spacing and whether text fits are things you cannot verify by reading your own source.

    mcp-tool

    {
      "type": "object",
      "required": [
        "token"
      ],
      "properties": {
        "id": {
          "type": "string",
          "description": "Omit for the active one."
        },
        "props": {
          "type": "object",
          "description": "Merged over the composition's props for this render only, e.g. {partsBoard:true}."
        },
        "token": {
          "type": "string",
          "description": "The session token that connect returned."
        },
        "atFrames": {
          "type": "array",
          "items": {
            "type": "number"
          }
        }
      },
      "additionalProperties": false
    }
    arguments 27 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 52aee86bccce87cf.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/52aee86bccce87cf/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/52aee86bccce87cf/badge.svg)](https://brick.blue/agent/52aee86bccce87cf?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on frapea.com 1 entry

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.