Refs

4,100 launch videos measured shot by shot. Search references, pull blueprints, plan your film.

Sollte ich dies verwenden

Qualität und Sicherheit

A
Qualität der Beschreibung
100%
Vollständigkeit des Schemas
97%
Qualität der Benennung
97%
Risiko der Vergiftung
80%
Übereinstimmung der Berechtigungen
100%
Einhaltung des Protokolls
100%

Befunde (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin check_render

Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.

Kontextkosten

~8,813Tokens (Tool-Definitionen)
~7.1 KBTypische Antwortgröße
Erhebliche Auswirkung auf die Aufmerksamkeit (6.89% von 128k Kontext)

Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.

Installieren

Installation mit einem Klick

Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:

{
  "mcpServers": {
    "refs": {
      "url": "https://refs.video/mcp"
    }
  }
}

Remote-Endpunkte

https://refs.video/mcpstreamable-http

Was es kann

Tool-Inventar

Tools (12)

🟢 Nur lesen🟡 Schreiben🔴 Löschen⚪ Unbekannt
🟢search_videos(query, category, aspect, min_seconds, max_seconds, ...)

Search 4,000+ dissected top-performing videos (launch films, product demos, explainers, motion design, interactive/3D, film + music, teasers). Returns compact cards: REF id, link, a small still (thumb), length, aspect, views, measured metrics (shots, cuts per minute, voice, music) and why each works. Use it to find references before making a video; pass a ref to get_blueprint or plan_video.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Keywords, e.g. 'developer tool launch dark UI', 'founder to camera', 'kinetic type', 'terminal UI launch'. Films matching every word come first; if none does, films matching some of the words (the result then has a note). A REF id or a YouTube/X link finds that film.",
      "type": "string"
    },
    "category": {
      "type": "string",
      "enum": [
        "launch",
        "demo",
        "explainers",
        "motion",
        "interactive",
        "films",
        "teaser"
      ]
    },
    "aspect": {
      "description": "Frame shape, as cards name it: 16:9 (landscape), 9:16 (vertical/reels), 1:1 (square), 4:5 (portrait feed)",
      "type": "string",
      "enum": [
        "16:9",
        "9:16",
        "1:1",
        "4:5"
      ]
    },
    "min_seconds": {
      "type": "number",
      "minimum": 0
    },
    "max_seconds": {
      "description": "e.g. 30 for short films",
      "type": "number",
      "minimum": 0
    },
    "ai_made": {
      "description": "true = made with AI/code (Claude, Remotion, three.js); false = human-made",
      "type": "boolean"
    },
    "made_with": {
      "description": "Tool, e.g. claude, remotion, three.js, manim, after effects",
      "type": "string"
    },
    "brand": {
      "description": "A tracked brand, e.g. linear, higgsfield, runway, vercel, openai",
      "type": "string"
    },
    "sort": {
      "description": "recommended = only the films a digital product (SaaS, app, AI or dev tool) would copy for its launch film, best first; none = every film, with those recommended ones still first",
      "type": "string",
      "enum": [
        "recommended",
        "none",
        "added",
        "views",
        "shortest",
        "longest",
        "catalogue"
      ]
    },
    "limit": {
      "description": "Default 8",
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 2000
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡get_blueprint(id, include_recipe, format, context, llm_model)

The full reverse-engineered blueprint of one video: hook frame by frame, beat sheet with timestamps, shot list, style guide, voice and sound, script template, production plan, edit recipe, QA checklist, plus a runnable recipe prompt. Markdown by default; format "json" returns the plates, toolkit, recipe and measured timeline as one object. To see the film's frames, call get_frames. Accepts a REF id (REF-0005), a refs.video link, the source YouTube/X link, or the id from search_videos.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "REF-0005, a refs.video/v/… link, a YouTube/X link, an id from search_videos, or one of your brand films (brand:<import>:<film>, from get_brand)"
    },
    "include_recipe": {
      "description": "Default true",
      "type": "boolean"
    },
    "format": {
      "description": "Default markdown. \"json\": plates as an array, the toolkit, the measured timeline (shots, camera, type, audio grid) and the frame sheets on hand",
      "type": "string",
      "enum": [
        "markdown",
        "json"
      ]
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_frames(id, sheet, context, llm_model)

One video's labelled frame sheets as images, so you can see the reference instead of guessing from text: the hook (first 3 s at 0.25 s steps), one frame per shot, and the whole film at fixed steps where measured. sheet "transitions" adds every frame around each cut and in-shot change, for timing transitions to the frame. Each image follows a caption saying how its labels read. Accepts the same ids as get_blueprint.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "REF-0005, a refs.video/v/… link, a YouTube/X link, an id from search_videos, or one of your brand films (brand:<import>:<film>)"
    },
    "sheet": {
      "description": "Default all (hook, shots and timeline; ask for \"transitions\" separately)",
      "type": "string",
      "enum": [
        "hook",
        "shots",
        "timeline",
        "transitions",
        "all"
      ]
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_formulas(category, context, llm_model)

Formulas distilled across many videos of one format (e.g. 'the silent UI workflow', 'the delayed hardware reveal'). Returns ids, titles, summaries and their source films; fetch one with get_formula.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "enum": [
        "launch",
        "demo",
        "explainers",
        "motion",
        "interactive",
        "films",
        "teaser"
      ]
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_formula(id, context, llm_model)

The full cross-video formula for one format, as markdown: structure, timing ranges, what top performers share, mistakes to avoid, and a template prompt.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_collections(context, llm_model)

Your collections on refs.video (named sets of films you saved) and your favourites, with ids and film counts. Pass an id to get_collection to read the films and use them as references.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_collection(id, limit, context, llm_model)

Every film in a Refs collection as search cards (REF id, link, length, aspect, measured metrics, why it works). Takes a collection id or refs.video/c/… link: anyone's shared collection, or your own private one; "favourites" gives the films you hearted. Then use them as references: plan_video(brief, reference_ids) with up to 5 that fit the brief, get_blueprint for one film in full.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "A collection id like k3j9x2mq, a refs.video/c/… link, or \"favourites\""
    },
    "limit": {
      "description": "Default 50",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢list_brands(context, llm_model)

Your brand imports on refs.video (refs.video/saved → Brandprint): each X account you imported, with its progress and film count. Private to you. Pass an id or handle to get_brand for the brand kit and every film.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢get_brand(id, limit, context, llm_model)

One of your brand imports: the brand kit (the brand's house style across all its films: palette, type, logo and end card, motion and easing, pacing and cut rhythm, camera, transitions, sound and voice, recurring formats, written as rules to follow) plus each film's blueprint summary with its id (brand:<import>:<film>) for get_blueprint and get_frames. Private to you. To make a new film in this style, call plan_video(brief, brand: id).

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "An import id from list_brands, a refs.video/b/… link, or the X handle you imported (e.g. @yourbrand)"
    },
    "limit": {
      "description": "Films to include; default 20",
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡plan_video(brief, reference_ids, brand, context, llm_model)

Give a brief (product, audience, length, platform) and 1-5 references (REF ids, links or ids, or your brand films' brand:<import>:<film> ids), and optionally one of your imported brands (brand) to plan in its house style. Returns, per reference, the plates that carry its timing and look (format, hook, beat sheet, style, sound, edit recipe) plus its recipe prompt, and the one formula that best matches, with instructions to write a shot list and a build prompt for the user's own video. With several references it also says how to mix them: one spine for structure and timing, and one named job for each of the others. Name the spine first if you already know it. Then, like an editor, it storyboards before anything is built: you draft the storyboard (1 direction for a fixed brief, 2–4 for an open one), check it with the storyboard tool and lay it out as a Claude Design canvas, the user picks a direction, and only then do you write the build prompt. For every plate of one film, use get_blueprint.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "brief": {
      "type": "string",
      "description": "What the user wants to make"
    },
    "reference_ids": {
      "description": "REF-0005, refs.video/v/… or YouTube/X links, ids (get_collection lists a collection's films), or brand:<import>:<film> ids. Optional with brand: then the brand's own top films are the references",
      "minItems": 1,
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "brand": {
      "description": "One of your brand imports (id or @handle, from list_brands): its brand kit becomes the house-style constraint",
      "type": "string"
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "brief",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡storyboard(title, brief, aspect, length_s, fps, ...)

Before anything is built, storyboard the film the way an editor does. Send the storyboard you drafted from plan_video: 1 direction for a fixed brief, 2–4 when it's open. Each direction: logline, references (REF id + the one job each does), palette, type, sound, 2–3 style frames at full look, and 3–30 numbered panels in order, each with in/out seconds, shot size, camera move, action, VO, on-screen text, sound, the transition into the next panel, and its frame as layers (text, REF stills or the user's own captures by https URL, and shapes; positions in % of the frame). Mark a layer real only when it's a real capture of the user's product or a real result. This checks the timing and the REF ids and returns each REF's real still. While it returns ok: false it lists what to fix (fix it and call again); with ok: true it tells you how to lay the storyboard out as a Claude Design canvas (or as a text board where you can't make one). Free with Pro. Let the user pick a direction before you write any build prompt.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "brief": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1200
    },
    "aspect": {
      "type": "string",
      "enum": [
        "16:9",
        "9:16",
        "1:1",
        "4:5"
      ]
    },
    "length_s": {
      "type": "number",
      "minimum": 3,
      "maximum": 900
    },
    "fps": {
      "type": "integer",
      "minimum": 12,
      "maximum": 120
    },
    "bpm": {
      "type": "number",
      "minimum": 40,
      "maximum": 220
    },
    "brand": {
      "description": "Brandprint import used for the look, if any",
      "type": "string",
      "maxLength": 80
    },
    "directions": {
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "logline": {
            "type": "string",
            "minLength": 1,
            "maxLength": 280,
            "description": "the idea in one line"
          },
          "references": {
            "maxItems": 6,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ref": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 40,
                  "description": "REF id"
                },
                "contributes": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 140,
                  "description": "the one job it does, e.g. 'structure and timing', 'the hook', 'type treatment'"
                }
              },
              "required": [
                "ref",
                "contributes"
              ]
            }
          },
          "palette": {
            "maxItems": 8,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
            }
          },
          "type": {
            "type": "object",
            "properties": {
              "display": {
                "type": "string",
                "maxLength": 60
              },
              "body": {
                "type": "string",
                "maxLength": 60
              },
              "mono": {
                "type": "string",
                "maxLength": 60
              },
              "note": {
                "type": "string",
                "maxLength": 200
              }
            },
            "required": [
              "display",
              "body"
            ]
          },
          "sound": {
            "type": "string",
            "maxLength": 400,
            "description": "music and sound design in a line or two"
          },
          "motion": {
            "description": "how frames hand off to each other overall",
            "type": "string",
            "maxLength": 400
          },
          "style_frames": {
            "maxItems": 3,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80
                },
                "note": {
                  "type": "string",
                  "maxLength": 300
                },
                "frame": {
                  "type": "object",
                  "properties": {
                    "background": {
                      "type": "string",
                      "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                    },
                    "gradient": {
                      "description": "top to bottom; replaces background",
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "string",
                          "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        },
                        {
                          "type": "string",
                          "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        }
                      ],
                      "items": false,
                      "minItems": 2,
                      "maxItems": 2
                    },
                    "layers": {
                      "maxItems": 40,
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "text"
                              },
                              "text": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 400
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150,
                                "description": "left edge, % of frame width"
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150,
                                "description": "top edge, % of frame height"
                              },
                              "w": {
                                "description": "box width, % of frame width (text wraps inside it)",
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "size": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 80,
                                "description": "font size as % of frame height"
                              },
                              "weight": {
                                "type": "integer",
                                "minimum": 100,
                                "maximum": 900
                              },
                              "font": {
                                "description": "display = the direction's headline face, body = UI/sans, mono = data, serif = editorial",
                                "type": "string",
                                "enum": [
                                  "display",
                                  "body",
                                  "mono",
                                  "serif"
                                ]
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "align": {
                                "type": "string",
                                "enum": [
                                  "left",
                                  "center",
                                  "right"
                                ]
                              },
                              "italic": {
                                "type": "boolean"
                              },
                              "tracking": {
                                "description": "letter spacing in em",
                                "type": "number",
                                "minimum": -0.2,
                                "maximum": 0.6
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "real": {
                                "description": "true only when this is a real capture of the user's product or a real result; anything else is illustrative and is labelled so",
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "text",
                              "x",
                              "y",
                              "size"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "image"
                              },
                              "src": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 600,
                                "description": "\"REF-1234\" for that archive film's still, or an https URL of the user's own capture"
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "w": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "h": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "fit": {
                                "type": "string",
                                "enum": [
                                  "cover",
                                  "contain"
                                ]
                              },
                              "radius": {
                                "description": "corner radius, % of frame height",
                                "type": "number",
                                "minimum": 0,
                                "maximum": 50
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "grayscale": {
                                "type": "boolean"
                              },
                              "real": {
                                "description": "true only when this is a real capture of the user's product or a real result; anything else is illustrative and is labelled so",
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "src",
                              "x",
                              "y",
                              "w",
                              "h"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "shape"
                              },
                              "shape": {
                                "type": "string",
                                "enum": [
                                  "rect",
                                  "circle",
                                  "line"
                                ]
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "w": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "h": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "fill": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "stroke": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "stroke_width": {
                                "description": "% of frame height",
                                "type": "number",
                                "minimum": 0,
                                "maximum": 5
                              },
                              "radius": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 50
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              }
                            },
                            "required": [
                              "type",
                              "shape",
                              "x",
                              "y",
                              "w",
                              "h"
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "required": [
                    "layers"
                  ]
                }
              },
              "required": [
                "title",
                "frame"
              ]
            },
            "description": "2–3 key frames at full look"
          },
          "panels": {
            "minItems": 3,
            "maxItems": 30,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "shot": {
                  "description": "shot number; numbered 1, 2, 3… when left out",
                  "type": "string",
                  "maxLength": 12
                },
                "start": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 900,
                  "description": "in, seconds"
                },
                "end": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 900,
                  "description": "out, seconds"
                },
                "shot_size": {
                  "type": "string",
                  "enum": [
                    "extreme wide",
                    "wide",
                    "medium",
                    "close",
                    "extreme close",
                    "macro",
                    "insert",
                    "ui",
                    "full-frame type"
                  ]
                },
                "camera": {
                  "description": "the camera move, drawn as arrows on the panel",
                  "type": "string",
                  "enum": [
                    "static",
                    "push in",
                    "pull out",
                    "pan left",
                    "pan right",
                    "tilt up",
                    "tilt down",
                    "truck left",
                    "truck right",
                    "orbit",
                    "zoom in",
                    "zoom out",
                    "whip",
                    "handheld"
                  ]
                },
                "action": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 400,
                  "description": "what happens and what moves, in one or two sentences"
                },
                "vo": {
                  "description": "the spoken line over this panel",
                  "type": "string",
                  "maxLength": 400
                },
                "on_screen": {
                  "description": "text that appears on screen",
                  "type": "string",
                  "maxLength": 200
                },
                "sound": {
                  "description": "music cue or SFX",
                  "type": "string",
                  "maxLength": 200
                },
                "transition": {
                  "description": "how this panel becomes the next one",
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "enum": [
                        "cut",
                        "match cut",
                        "dissolve",
                        "morph",
                        "wipe",
                        "push",
                        "whip",
                        "fade to black",
                        "hold"
                      ]
                    },
                    "frames": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 240
                    },
                    "note": {
                      "description": "how this frame becomes the next, e.g. 'the caret stretches into the search bar'",
                      "type": "string",
                      "maxLength": 200
                    }
                  },
                  "required": [
                    "kind"
                  ]
                },
                "look_ref": {
                  "description": "REF id whose look this panel borrows",
                  "type": "string",
                  "maxLength": 20
                },
                "frame": {
                  "type": "object",
                  "properties": {
                    "background": {
                      "type": "string",
                      "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                    },
                    "gradient": {
                      "description": "top to bottom; replaces background",
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "string",
                          "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        },
                        {
                          "type": "string",
                          "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        }
                      ],
                      "items": false,
                      "minItems": 2,
                      "maxItems": 2
                    },
                    "layers": {
                      "maxItems": 40,
                      "type": "array",
                      "items": {
                        "oneOf": [
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "text"
                              },
                              "text": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 400
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150,
                                "description": "left edge, % of frame width"
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150,
                                "description": "top edge, % of frame height"
                              },
                              "w": {
                                "description": "box width, % of frame width (text wraps inside it)",
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "size": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 80,
                                "description": "font size as % of frame height"
                              },
                              "weight": {
                                "type": "integer",
                                "minimum": 100,
                                "maximum": 900
                              },
                              "font": {
                                "description": "display = the direction's headline face, body = UI/sans, mono = data, serif = editorial",
                                "type": "string",
                                "enum": [
                                  "display",
                                  "body",
                                  "mono",
                                  "serif"
                                ]
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "align": {
                                "type": "string",
                                "enum": [
                                  "left",
                                  "center",
                                  "right"
                                ]
                              },
                              "italic": {
                                "type": "boolean"
                              },
                              "tracking": {
                                "description": "letter spacing in em",
                                "type": "number",
                                "minimum": -0.2,
                                "maximum": 0.6
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "real": {
                                "description": "true only when this is a real capture of the user's product or a real result; anything else is illustrative and is labelled so",
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "text",
                              "x",
                              "y",
                              "size"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "image"
                              },
                              "src": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 600,
                                "description": "\"REF-1234\" for that archive film's still, or an https URL of the user's own capture"
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "w": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "h": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "fit": {
                                "type": "string",
                                "enum": [
                                  "cover",
                                  "contain"
                                ]
                              },
                              "radius": {
                                "description": "corner radius, % of frame height",
                                "type": "number",
                                "minimum": 0,
                                "maximum": 50
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "grayscale": {
                                "type": "boolean"
                              },
                              "real": {
                                "description": "true only when this is a real capture of the user's product or a real result; anything else is illustrative and is labelled so",
                                "type": "boolean"
                              }
                            },
                            "required": [
                              "type",
                              "src",
                              "x",
                              "y",
                              "w",
                              "h"
                            ]
                          },
                          {
                            "type": "object",
                            "properties": {
                              "type": {
                                "type": "string",
                                "const": "shape"
                              },
                              "shape": {
                                "type": "string",
                                "enum": [
                                  "rect",
                                  "circle",
                                  "line"
                                ]
                              },
                              "x": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "y": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "w": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "h": {
                                "type": "number",
                                "minimum": -50,
                                "maximum": 150
                              },
                              "fill": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "stroke": {
                                "type": "string",
                                "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "stroke_width": {
                                "description": "% of frame height",
                                "type": "number",
                                "minimum": 0,
                                "maximum": 5
                              },
                              "radius": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 50
                              },
                              "opacity": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              }
                            },
                            "required": [
                              "type",
                              "shape",
                              "x",
                              "y",
                              "w",
                              "h"
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "required": [
                    "layers"
                  ]
                }
              },
              "required": [
                "start",
                "end",
                "action",
                "frame"
              ]
            }
          }
        },
        "required": [
          "name",
          "logline",
          "references",
          "palette",
          "type",
          "sound",
          "style_frames",
          "panels"
        ]
      }
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "title",
    "brief",
    "aspect",
    "length_s",
    "directions",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢check_render(id, render, target, context, llm_model)

After rendering a video from a reference, check it against that film's measured timeline and get concrete fixes: cut timing to the frame, pace, brightness curve, motion per shot, loudness for the platform, and format. First measure your render: run `node scripts/measure.mjs <file>` from the Refs starter kit (curl -sL https://refs.video/starter.zip -o refs-starter.zip && unzip refs-starter.zip; it unpacks to refs-starter/) and pass the JSON it prints as `render`. Returns a score out of 100, a table of checks and a numbered fix list (frames at your render's frame rate), then the same as JSON. Costs 2 credits, so fix, re-measure and check again.

Eingabe-Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The reference you built from: REF-0005, a refs.video/v/… link, a YouTube/X link, or an id from search_videos"
    },
    "render": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "refs-render-measure"
            },
            "version": {
              "type": "number"
            },
            "file": {
              "type": "string"
            },
            "duration_s": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "fps": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 1000
            },
            "width": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            "height": {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            "cuts": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "t": {
                    "type": "number",
                    "minimum": 0
                  },
                  "frame": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  },
                  "score": {
                    "type": "number"
                  }
                },
                "required": [
                  "t",
                  "frame",
                  "score"
                ]
              }
            },
            "luma": {
              "type": "object",
              "properties": {
                "step_s": {
                  "type": "number",
                  "exclusiveMinimum": 0
                },
                "mean": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  }
                },
                "p95": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  }
                }
              },
              "required": [
                "step_s",
                "mean",
                "p95"
              ]
            },
            "motion": {
              "type": "object",
              "properties": {
                "step_s": {
                  "type": "number",
                  "exclusiveMinimum": 0
                },
                "diff": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  }
                }
              },
              "required": [
                "step_s",
                "diff"
              ]
            },
            "audio": {
              "type": "object",
              "properties": {
                "has_audio": {
                  "type": "boolean"
                },
                "integrated_lufs": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "true_peak_dbtp": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "range_lu": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "has_audio",
                "integrated_lufs",
                "true_peak_dbtp",
                "range_lu"
              ]
            }
          },
          "required": [
            "kind",
            "version",
            "duration_s",
            "fps",
            "width",
            "height",
            "cuts",
            "luma",
            "motion",
            "audio"
          ]
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        {
          "type": "string"
        }
      ],
      "description": "The JSON printed by `node scripts/measure.mjs <your video>`, as an object (or that JSON as text)"
    },
    "target": {
      "description": "Where it will be posted; sets the loudness target: x and youtube −14 LUFS, tiktok −14 to −10, web −16, true peak ≤ −1 dBTP. Default: the reference's platform",
      "type": "string",
      "enum": [
        "x",
        "youtube",
        "tiktok",
        "web"
      ]
    },
    "context": {
      "type": "string",
      "description": "Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\""
    },
    "llm_model": {
      "type": "string",
      "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess."
    }
  },
  "required": [
    "id",
    "render",
    "context",
    "llm_model"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Diesen Server bewerten

Nachweis

Aktuelle Beobachtungen

verifiziertVersion nicht aufgezeichnet12 Tools