WebMCP report
openreel-webmcp.pages.dev
https://openreel-webmcp.pages.dev/
15 tool(s) registered. 2 returned results and 8 returned an error when called. Visitors can't use them yet: the page has no origin trial token (see P2).
Registered tools
batch_actionsdocument.modelContextregisterTool · 936msDispatch a sequence of raw actions in order; stops on first failure.
readOnlyHint: false untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [
"actions"
],
"properties": {
"actions": {
"type": "array"
}
},
"additionalProperties": true
}create_projectdocument.modelContextregisterTool · 937msCreate a new blank project and make it active. Call this first when starting from scratch. Defaults to 1920x1080 at 30fps.
readOnlyHint: false untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"frameRate": {
"type": "number"
}
},
"additionalProperties": true
}execute_actiondocument.modelContextregisterTool · 937msEscape hatch: dispatch any underlying editor action by type + params. Use get_capabilities and the action catalog for valid types.
readOnlyHint: false untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"params": {
"type": "object"
}
},
"additionalProperties": true
}get_capabilitiesdocument.modelContextregisterTool · 891msValid enums + parameter ranges.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}get_clipdocument.modelContextregisterTool · 927msFull detail for one clip by id.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [
"clipId"
],
"properties": {
"clipId": {
"type": "string"
}
},
"additionalProperties": true
}get_editor_statedocument.modelContextregisterTool · 929msProject settings, durations, and counts.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}get_motion_compositiondocument.modelContextregisterTool · 930msFull detail for one Motion Creator composition: every layer with its id, type, transform, keyframes, and type-specific fields, plus variables, markers, beat markers, camera, and lights. Use this to recover auto-generated layer ids before animating or editing.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [
"compositionId"
],
"properties": {
"compositionId": {
"type": "string"
}
},
"additionalProperties": true
}list_clipsdocument.modelContextregisterTool · 933msCompact clip list. Optional filters: trackIndex, fromSec, toSec; paginate huge timelines with offset/limit.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number"
},
"toSec": {
"type": "number"
},
"offset": {
"type": "number"
},
"fromSec": {
"type": "number"
},
"trackIndex": {
"type": "number"
}
},
"additionalProperties": true
}list_mediadocument.modelContextregisterTool · 934msMedia library items (blob-free).
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}list_motion_compositionsdocument.modelContextregisterTool · 934msCompact list of Motion Creator scenes, layers, variables, and editor instances.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}list_projectsdocument.modelContextregisterTool · 935msList saved projects (id + name + modifiedAt). Use an id with open_project.
readOnlyHint: true untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}list_subtitlesdocument.modelContextregisterTool · 935msSubtitle/caption cues on the timeline (text + seconds, plus position/color). Includes captions made by the Auto Caption panel. Optional range filter: fromSec, toSec.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {
"toSec": {
"type": "number"
},
"fromSec": {
"type": "number"
}
},
"additionalProperties": true
}list_tracksdocument.modelContextregisterTool · 935msAll timeline tracks.
readOnlyHint: true untrustedContentHint: true
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}open_projectdocument.modelContextregisterTool · 937msOpen a saved project by id and make it active.
readOnlyHint: false untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
},
"additionalProperties": true
}save_projectdocument.modelContextregisterTool · 937msPersist the active project so it can be reopened later.
readOnlyHint: false untrustedContentHint: false
inputSchema
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}Registration
36/60- Pass
Tools registered with JavaScript R1
20/2015 tool(s) registered.
- Tools: batch_actions, create_project, execute_action, get_capabilities, get_clip, get_editor_state, get_motion_composition, list_clips, list_media, list_motion_compositions, list_projects, list_subtitles, list_tracks, open_project, save_project
- First tool registered 891ms after the page started loading.
- Pass
Tools registered through forms R2
5/5No form tools, and that's fine: your tools are registered with JavaScript. You only need one of the two.
- JavaScript tools: batch_actions, create_project, execute_action, get_capabilities, get_clip, get_editor_state, get_motion_composition, list_clips, list_media, list_motion_compositions, list_projects, list_subtitles, list_tracks, open_project, save_project
- Partial
Tools work when called R3
6/30We called 10 tool(s). 8 returned an error: • get_clip: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • get_editor_state: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • get_motion_composition: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • list_clips: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • list_media: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • list_motion_compositions: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • list_subtitles: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}" • list_tracks: returned an error: "{"ok":false,"summary":"No project is open","error":{"code":"TOOL_ERROR","message":"No project is open"}}"
An agent that calls a broken tool gets an error instead of an answer. Each tool that fails costs its share of the points.
Fix: Make each tool return a real answer for a simple call. If something goes wrong, return isError: true so the agent knows it failed.
async execute({ query }) { try { const results = await search(query); return { content: [{ type: "text", text: format(results) }] }; } catch (err) { return { isError: true, content: [{ type: "text", text: `Search unavailable: ${err.message}` }] }; } }- Working: get_capabilities, list_projects
- Pass
Tools registered within 5 seconds R4
5/5First tool registered 891ms after the page started loading.
- Within the 5 second limit.
Tool quality
10/15- Fail
Valid input schemas Q1
0/58 of 15 tool(s) have schema problems: • batch_actions: no description on actions. • create_project: no description on name, width, height, frameRate. • execute_action: no description on type, params. • get_clip: no description on clipId. • get_motion_composition: no description on compositionId. • list_clips: no description on trackIndex, fromSec, toSec, offset, limit. • list_subtitles: no description on fromSec, toSec. • open_project: no description on id.
Agents read the schema to know what to send. A type and a short description on each field help them send the right thing.
Fix: Give every field a type and a short description.
inputSchema: { type: "object", properties: { query: { type: "string", description: "What to search for" }, limit: { type: "integer", description: "How many results to return (default 10)" } }, required: ["query"] }- get_capabilities: takes no input.
- get_editor_state: takes no input.
- list_media: takes no input.
- list_motion_compositions: takes no input.
- list_projects: takes no input.
- list_tracks: takes no input.
- save_project: takes no input.
- Pass
Clear descriptions Q2
3/3All 15 tool(s) have a description.
- batch_actions: "Dispatch a sequence of raw actions in order; stops on first failure."
- create_project: "Create a new blank project and make it active. Call this first when starting from scratch. Defaults to 1920x1080 at 30fp… (122 chars total)"
- execute_action: "Escape hatch: dispatch any underlying editor action by type + params. Use get_capabilities and the action catalog for va… (130 chars total)"
- get_capabilities: "Valid enums + parameter ranges."
- get_clip: "Full detail for one clip by id."
- get_editor_state: "Project settings, durations, and counts."
- get_motion_composition: "Full detail for one Motion Creator composition: every layer with its id, type, transform, keyframes, and type-specific f… (259 chars total)"
- list_clips: "Compact clip list. Optional filters: trackIndex, fromSec, toSec; paginate huge timelines with offset/limit."
- list_media: "Media library items (blob-free)."
- list_motion_compositions: "Compact list of Motion Creator scenes, layers, variables, and editor instances."
- list_projects: "List saved projects (id + name + modifiedAt). Use an id with open_project."
- list_subtitles: "Subtitle/caption cues on the timeline (text + seconds, plus position/color). Includes captions made by the Auto Caption … (165 chars total)"
- list_tracks: "All timeline tracks."
- open_project: "Open a saved project by id and make it active."
- save_project: "Persist the active project so it can be reopened later."
- Pass
Clear names Q3
2/2All 15 tool name(s) are specific.
- Names: batch_actions, create_project, execute_action, get_capabilities, get_clip, get_editor_state, get_motion_composition, list_clips, list_media, list_motion_compositions, list_projects, list_subtitles, list_tracks, open_project, save_project
- Pass
Read-only hints Q4
3/3All 15 tool(s) say whether they only read information.
- batch_actions: readOnlyHint false
- create_project: readOnlyHint false
- execute_action: readOnlyHint false
- get_capabilities: readOnlyHint true
- get_clip: readOnlyHint true
- get_editor_state: readOnlyHint true
- get_motion_composition: readOnlyHint true
- list_clips: readOnlyHint true
- list_media: readOnlyHint true
- list_motion_compositions: readOnlyHint true
- list_projects: readOnlyHint true
- list_subtitles: readOnlyHint true
- list_tracks: readOnlyHint true
- open_project: readOnlyHint false
- save_project: readOnlyHint false
- Pass
Result size Q5
2/2Every tested tool returned between 1 and 20,000 characters.
- get_capabilities: 19,958 characters.
- get_clip: 104 characters.
- get_editor_state: 104 characters.
- get_motion_composition: 104 characters.
- list_clips: 104 characters.
- list_media: 104 characters.
- list_motion_compositions: 104 characters.
- list_projects: 65 characters.
- list_subtitles: 104 characters.
- list_tracks: 104 characters.
Ready for visitors
5/25- Pass
HTTPS with a valid certificate P1
5/5The page uses HTTPS with a valid certificate.
- Connected to openreel-webmcp.pages.dev over HTTPS.
- Issuer: Google Trust Services
- Valid until: Dec 1 10:45:27 2026 GMT
- Fail
Origin trial token P2
0/15No origin trial token, so your visitors can't use your tools yet.
WebMCP is still being tested in Chrome, and it only works on sites that signed up for the test. Signing up gives you a token to add to your pages. Your tools work in this report only because our scanner turns WebMCP on for itself.
Fix: Sign up for the WebMCP origin trial with your domain, then add the token to your pages.
<!-- Sign up: https://developer.chrome.com/origintrials --> <!-- In <head>, before the script that registers your tools: --> <meta http-equiv="origin-trial" content="YOUR_TOKEN">- Fail
No errors blocking tools P3
0/5• Console: [SW Manager] Registration failed: TypeError: Cannot read properties of undefined (reading 'addEventListener') at D2e.register (https://openreel-webmcp.pages.dev/assets/index-CPrSsfoN.js:7573:11475… (201 chars total)
If the code that registers your tools throws an error, or your Content Security Policy blocks it, no tools get registered. A policy that blocks inline scripts is the usual cause.
Fix: Allow the script that registers your tools. A nonce is safer than 'unsafe-inline'.
Content-Security-Policy: script-src 'self' 'nonce-RANDOM_PER_REQUEST' <script nonce="RANDOM_PER_REQUEST"> document.modelContext?.registerTool({ /* ... */ }); </script>
Scan details
- Requested
- https://openreel-webmcp.pages.dev/
- Final URL
- https://openreel-webmcp.pages.dev/
- HTTP status
- 200
- Page title
- OpenReel Video - Professional Video Editor
- Load time
- 2901ms
- Total scan time
- 5474ms
- User agent
- Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
Console errors mentioning WebMCP
- [SW Manager] Registration failed: TypeError: Cannot read properties of undefined (reading 'addEventListener') at D2e.register (https://openreel-webmcp.pages.dev/assets/index-CPrSsfoN.js:7573:11475)