PrePublish - YouTube script QA
Audit a YouTube script before recording: hook, pacing, drop-off risk, copy-paste rewrites.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"script-audit": {
"url": "https://prepublish.ai/mcp"
}
}
}Puntos de conexión remotos
https://prepublish.ai/mcpstreamable-httphttps://mcp.prepublish.aistreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (6)
🟢audit_script(video_title, script_text, email, video_duration_seconds, category, ...)
Run Prepublish's full audit on a YouTube script the user has already written. Returns hook, structure and pacing scores, a script-level attention-risk map naming the passages most likely to lose viewers, and a copy-paste rewrite for each flagged passage. Choose this when the user has a finished or near-finished draft and wants to know what is weak before they record. Do not use it to generate a script, to review a published video, or to check grammar. A free result is released by email, so ask the user for an address rather than guessing one. This is a text-only check of an unrecorded script. It maps relative attention risk inside the draft. It does not measure or predict published YouTube retention, and it cannot account for delivery, editing, thumbnail, topic or distribution.
Esquema de entrada
{
"type": "object",
"properties": {
"video_title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "The title the user plans to publish under. The audit checks whether the script delivers this promise."
},
"script_text": {
"type": "string",
"minLength": 50,
"maxLength": 250000,
"description": "The script text as the user wrote it. Paste it verbatim; do not rewrite, summarise or clean it first."
},
"email": {
"type": "string",
"format": "email",
"description": "Where the free result is sent. Required for every anonymous audit: the backend rejects the request without it. Ask the user; never invent it. When the caller is authenticated with a Prepublish API key the result comes back in the conversation instead, so do not ask for an address in that case."
},
"video_duration_seconds": {
"type": "integer",
"minimum": 1,
"description": "Intended runtime in seconds, only if the user stated one. Used for pacing; never assumed."
},
"category": {
"type": "string",
"description": "Video category, only if the user said it."
},
"audience": {
"type": "string",
"description": "Target audience, only if the user said it."
}
},
"required": [
"video_title",
"script_text"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"description": "The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it."
},
"analysis_id": {
"type": "string",
"description": "Prepublish id for this audit. Pass it to get_audit to re-read the result later."
},
"analysis": {
"type": "object",
"description": "The settled audit as Prepublish returned it: status, overall, hook, structure and pacing scores, the attention-risk map, improvements and, where the plan allows, rewrites. Absent while the audit is still running."
},
"open_in_browser": {
"type": "string",
"description": "Permalink to the same audit on prepublish.ai."
},
"status": {
"type": "string",
"description": "Present only when the audit had not settled inside this call; the value is \"running\"."
},
"next_step": {
"type": "string",
"description": "Present only when the audit is still running: what to do to collect it."
}
},
"required": [
"notice",
"analysis_id",
"open_in_browser"
]
}🟢get_audit(analysis_id)
Fetch the current state of an audit that was started earlier, using the analysis_id that audit_script returned. Use this when a previous audit was still running, or when the user refers back to an audit from earlier in the conversation. It performs no new analysis and costs nothing. This is a text-only check of an unrecorded script. It maps relative attention risk inside the draft. It does not measure or predict published YouTube retention, and it cannot account for delivery, editing, thumbnail, topic or distribution.
Esquema de entrada
{
"type": "object",
"properties": {
"analysis_id": {
"type": "string",
"minLength": 1,
"description": "The analysis_id returned by audit_script."
}
},
"required": [
"analysis_id"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"description": "The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it."
},
"analysis_id": {
"type": "string",
"description": "The id that was requested, echoed back."
},
"analysis": {
"type": "object",
"description": "The audit as Prepublish returned it, at whatever state it has reached. Read its \"status\" field: an audit that is not yet settled has no scores."
},
"open_in_browser": {
"type": "string",
"description": "Permalink to the same audit on prepublish.ai."
}
},
"required": [
"notice",
"analysis_id",
"open_in_browser"
]
}🟢audit_hook(hook_text, niche, email)
Score just the opening lines of a YouTube script: how much attention each sentence pulls, whether it opens a curiosity gap, how far away the payoff sits, plus the top issues and rewritten alternatives. Choose this when the user shares only a hook or opening paragraph, or wants a fast second opinion before auditing a whole draft. Cheaper and narrower than audit_script. This is a text-only check of an unrecorded script. It maps relative attention risk inside the draft. It does not measure or predict published YouTube retention, and it cannot account for delivery, editing, thumbnail, topic or distribution.
Esquema de entrada
{
"type": "object",
"properties": {
"hook_text": {
"type": "string",
"minLength": 10,
"maxLength": 5000,
"description": "The opening lines exactly as written, ideally the first 15 to 30 seconds of speech."
},
"niche": {
"type": "string",
"description": "Channel niche, only if the user said it. Sharpens the comparison."
},
"email": {
"type": "string",
"format": "email",
"description": "Only needed once the free anonymous hook check for the day is used. Ask the user; never invent it. When the caller is authenticated with a Prepublish API key the result comes back in the conversation instead, so do not ask for an address in that case."
}
},
"required": [
"hook_text"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"description": "The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it."
},
"hook": {
"type": "object",
"description": "The hook evaluation.",
"properties": {
"evaluation_id": {
"type": "string",
"description": "Prepublish id for this hook evaluation."
},
"hook_text": {
"type": "string",
"description": "The opening lines that were scored, echoed back."
},
"niche": {
"type": "string",
"description": "The niche the hook was compared against, when one was supplied."
},
"overall_score": {
"type": "integer",
"description": "Score for the opening as a whole."
},
"grade": {
"type": "string",
"description": "Letter grade for the opening."
},
"one_sentence_verdict": {
"type": "string",
"description": "The single-sentence read on the hook."
},
"sentences": {
"type": "array",
"description": "Per-sentence breakdown: the quote, its attention pull, its curiosity gap, how far off the payoff sits, and a note.",
"items": {
"type": "object"
}
},
"top_issues": {
"type": "array",
"description": "The problems worth fixing first, each with a headline, the quote it applies to, and why it costs attention.",
"items": {
"type": "object"
}
},
"rewrites": {
"type": "array",
"description": "Alternative openings, each with its style and why that version works.",
"items": {
"type": "object"
}
},
"model_used": {
"type": "string",
"description": "Which model produced this evaluation."
},
"created_at": {
"type": "string",
"description": "When the evaluation was produced."
}
}
}
},
"required": [
"notice",
"hook"
]
}🟢check_authenticity(video_title, script_text)
Check a script against YouTube's inauthentic-content expectations: whether it reads as mass-produced, templated or repetitive, which signals fire, and what to change. Returns a score, a risk level, the firing signals with quotes, and remediation steps. Choose this when the user worries about reused content, AI-sounding scripts, or a channel that repeats a formula. This reports text-level signals only; it is not a monetisation decision and does not speak for YouTube.
Esquema de entrada
{
"type": "object",
"properties": {
"video_title": {
"type": "string",
"minLength": 1,
"maxLength": 255,
"description": "The planned title."
},
"script_text": {
"type": "string",
"minLength": 50,
"maxLength": 250000,
"description": "The script text as the user wrote it. Paste it verbatim; do not rewrite, summarise or clean it first."
}
},
"required": [
"video_title",
"script_text"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"description": "The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it."
},
"authenticity": {
"type": "object",
"description": "The inauthentic-content read on this script.",
"properties": {
"analysis_id": {
"type": "string",
"description": "Prepublish id for this check."
},
"score": {
"type": "integer",
"description": "Authenticity score for the script."
},
"risk_level": {
"type": "string",
"description": "Banded risk level behind the score."
},
"verdict": {
"type": "string",
"description": "The short verdict in words."
},
"signals": {
"type": "array",
"description": "Each signal that fired, with its name, severity, reasoning and the quote that triggered it.",
"items": {
"type": "object"
}
},
"remediation": {
"type": "array",
"description": "What to change, each with the current passage, the fix, and why it matters.",
"items": {
"type": "object"
}
},
"override_note": {
"type": "string",
"description": "Present when the banded result was overridden, explaining why."
},
"heuristic_report": {
"description": "The deterministic layer behind the score, passed through as the backend produced it."
},
"created_at": {
"type": "string",
"description": "When the check was produced."
}
}
}
},
"required": [
"notice",
"authenticity"
]
}🟢policy_preflight(script, title)
Check a script before recording for the YouTube policy categories it may touch: which category families are implicated, the consequence family for each, a verdict and flag counts. Each category cites YouTube's own published policy page. Choose this when the user is writing about sensitive subject matter and asks whether it is safe to monetise. The quoted passages and their suggested rewrites are part of the paid audit, so the free result may return counts with locked quotes. It reports risk against published policy text; it is not a monetisation guarantee and does not speak for YouTube.
Esquema de entrada
{
"type": "object",
"properties": {
"script": {
"type": "string",
"minLength": 200,
"maxLength": 250000,
"description": "The script text as written, at least 200 characters. Below that there is not enough context for a policy read."
},
"title": {
"type": "string",
"maxLength": 255,
"description": "The planned title, if the user has one. Titles are checked too."
}
},
"required": [
"script"
],
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"notice": {
"type": "string",
"description": "The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it."
},
"policy_preflight": {
"type": "object",
"description": "The policy read on this script.",
"properties": {
"preflight_id": {
"type": "string",
"description": "Prepublish id for this pre-flight."
},
"title": {
"type": "string",
"description": "The title that was checked, when one was supplied."
},
"preflight": {
"type": "object",
"description": "The result itself: a verdict of \"no_matches\", \"review_suggested\" or \"high_matches\", the flags, counts_by_category, total_flags, whether the passages are locked, the rubric version it was scored against, the full category rubric with its citations, and the scope statement that must be shown with it."
},
"cached": {
"type": "boolean",
"description": "True when this exact script and title had already been checked and the stored result was replayed."
},
"created_at": {
"type": "string",
"description": "When the pre-flight was produced."
}
}
},
"note": {
"type": "string",
"description": "Says which parts of the result are paid-only, so a locked field is not read as a clean pass."
}
},
"required": [
"notice",
"policy_preflight",
"note"
]
}🟢script_runtime(script_text, word_count, target_minutes)
Convert a word count, or a pasted script, into a spoken runtime range, and convert a target runtime back into a word budget. Rates come from Prepublish's own measurement of 349 videos: 25th percentile 160 words per minute, median 181, 75th percentile 201. Choose this for "how long will this script run" or "how many words for a ten-minute video". It is arithmetic on speaking rate only: it excludes pauses, B-roll and demonstrations, so a finished edit usually runs longer.
Esquema de entrada
{
"type": "object",
"properties": {
"script_text": {
"type": "string",
"description": "A script to count. Provide this or word_count or target_minutes."
},
"word_count": {
"type": "integer",
"minimum": 1,
"description": "A word count, if the user already knows it."
},
"target_minutes": {
"type": "number",
"minimum": 0.1,
"description": "A target runtime in minutes, to convert into a word budget."
}
},
"additionalProperties": false
}Esquema de salida
{
"type": "object",
"properties": {
"speaking_rates_words_per_minute": {
"type": "object",
"description": "The measured rates used, in words per minute: slow is the 25th percentile, median the 50th, fast the 75th.",
"properties": {
"fast": {
"type": "number",
"description": "75th percentile speaking rate."
},
"median": {
"type": "number",
"description": "Median speaking rate."
},
"slow": {
"type": "number",
"description": "25th percentile speaking rate."
}
},
"required": [
"fast",
"median",
"slow"
]
},
"source": {
"type": "string",
"description": "Where the rates come from, with the published write-up."
},
"caveat": {
"type": "string",
"description": "What this arithmetic excludes. Repeat it rather than presenting a single number."
},
"word_count": {
"type": "integer",
"description": "Words counted or supplied. Present when script_text or word_count was given."
},
"runtime_minutes": {
"type": "object",
"description": "Spoken runtime in minutes at each rate. Present when script_text or word_count was given.",
"properties": {
"fast": {
"type": "number",
"description": "Runtime at the fast rate."
},
"median": {
"type": "number",
"description": "Runtime at the median rate."
},
"slow": {
"type": "number",
"description": "Runtime at the slow rate."
}
},
"required": [
"fast",
"median",
"slow"
]
},
"target_minutes": {
"type": "number",
"description": "The target runtime asked for, echoed back. Present when target_minutes was given."
},
"word_budget": {
"type": "object",
"description": "Words needed to fill the target at each rate. Present when target_minutes was given.",
"properties": {
"fast": {
"type": "integer",
"description": "Word budget at the fast rate."
},
"median": {
"type": "integer",
"description": "Word budget at the median rate."
},
"slow": {
"type": "integer",
"description": "Word budget at the slow rate."
}
},
"required": [
"fast",
"median",
"slow"
]
}
},
"required": [
"speaking_rates_words_per_minute",
"source",
"caveat"
]
}Comunidad
Evidencia