Appearance
ChatGPT App
Create a ChatGPT app for Motion by connecting ChatGPT to the public Motion MCP server:
| Field | Value |
|---|---|
| App name | Motion |
| Description | Create and refine videos with Motion. Use this app for launch videos, explainers, promos, ads, trailers, motion graphics, product demos, social clips, article-to-video, and turning docs, sites, products, or ideas into videos. |
| MCP URL | https://mcp.motion.so/mcp |
| Authentication | OAuth 2.1 with PKCE via Dynamic Client Registration or Client ID Metadata Documents |
Motion is a streaming HTTP MCP server. It serves ChatGPT Apps widgets as ui://motion/*.html resources with text/html;profile=mcp-app, and links video and billing tools to those widgets through _meta.ui.resourceUri plus the ChatGPT compatibility alias _meta["openai/outputTemplate"].
Connect in ChatGPT Developer Mode
- Open Settings -> Apps -> Advanced settings and enable Developer mode.
- Return to Settings -> Apps and choose Create app.
- Enter the app name, description, and MCP URL above.
- Choose OAuth. ChatGPT can use CIMD when the authorization server advertises
client_id_metadata_document_supported: true, or DCR throughhttps://mcp.motion.so/oauth/register. - Authorize Motion in the browser and approve the requested scopes.
- In a conversation, choose Developer mode from the composer and enable Motion.
Production Settings
The backend environment should include:
dotenv
MOTION_APP_DOMAIN=https://motion.so
MCP_PUBLIC_URL=https://mcp.motion.so
MCP_RESOURCE_URL=https://mcp.motion.so/mcp
MCP_WIDGET_DOMAIN=https://motion.so
OAUTH_DCR_ENABLED=true
OAUTH_CIMD_ENABLED=trueMCP_WIDGET_DOMAIN is the dedicated widget origin advertised to ChatGPT through _meta["openai/widgetDomain"]. The standard _meta.ui.domain field is host-specific and intentionally omitted so Claude can choose its own *.claudemcpcontent.com sandbox origin.
Widgets
| Tool | Widget | Behavior |
|---|---|---|
create_video | ui://motion/generation.html | Starts an async render and shows a live video card that polls job_status from the iframe. |
create_followup | ui://motion/generation.html | Refines an existing completed Motion job and reuses the live video card. |
get_session_status | ui://motion/generation.html | Reopens a job in the video widget and exposes output.download_url when complete. |
show_plans_and_credits | ui://motion/plans.html | Shows plan cards, credit balance, top-ups, and payment setup. |
The widget CSP allows rendered videos and downloads from Google Cloud Storage and S3, and allowlists Motion, Stripe, and storage URLs as ChatGPT openExternal destinations.
Review Checklist
/.well-known/oauth-protected-resourcedeclareshttps://mcp.motion.so/mcpas the MCP resource./.well-known/oauth-authorization-serveradvertisesauthorization_endpoint,token_endpoint,registration_endpoint,client_id_metadata_document_supported: true, andS256.- Every tool has accurate annotations:
- read-only tools use
readOnlyHint: true. - write tools use
readOnlyHint: false. - payment, auto-top-up, subscription, and revoke actions use
destructiveHint: true. - private Motion-only mutations use
openWorldHint: false.
- read-only tools use
- Widget resources include
_meta.ui.csp,_meta["openai/widgetCSP"], and_meta["openai/widgetDomain"]; they do not set_meta.ui.domain. - Run test cases on ChatGPT web and mobile:
- "Create a 30 second launch video for a new AI video editor."
- "Show my Motion credit balance and plans."
- "Check the status of job
<job_id>." - "Buy 200 Motion credits" with a test account, verifying checkout or saved-card behavior.
See the OpenAI Apps SDK docs for the current ChatGPT setup and review flow: