MCP 서버

PrePublish - YouTube script QA

ai.prepublish/script-audit
미디어 및 콘텐츠 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Reviews YouTube scripts for hooks, pacing, audience drop-off risks, and suggested rewrites.

audit_hook
Score the opening of a YouTube script
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.
외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['hook_text'], 'properties': {'email': {'type': 'string', 'format': 'email', 'description': 'Only needed once the free anonymous hook check for the day is used. Prepublish stores this address and may send a short series of follow-up emails about the check that include an unsubscribe link. 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.'}, 'niche': {'type': 'string', 'description': 'Channel niche, only if the user said it. Sharpens the comparison.'}, 'hook_text': {'type': 'string', 'maxLength': 5000, 'minLength': 10, 'description': 'The opening lines exactly as written, ideally the first 15 to 30 seconds of speech.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['notice', 'hook'], 'properties': {'hook': {'type': 'object', 'properties': {'grade': {'type': 'string', 'description': 'Letter grade for the opening.'}, 'niche': {'type': 'string', 'description': 'The niche the hook was compared against, when one was supplied.'}, 'rewrites': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Alternative openings, each with its style and why that version works.'}, 'hook_text': {'type': 'string', 'description': 'The opening lines that were scored, echoed back.'}, 'sentences': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Per-sentence breakdown: the quote, its attention pull, its curiosity gap, how far off the payoff sits, and a note.'}, 'created_at': {'type': 'string', 'description': 'When the evaluation was produced.'}, 'model_used': {'type': 'string', 'description': 'Which model produced this evaluation.'}, 'top_issues': {'type': 'array', 'items': {'type': 'object'}, 'description': 'The problems worth fixing first, each with a headline, the quote it applies to, and why it costs attention.'}, 'evaluation_id': {'type': 'string', 'description': 'Prepublish id for this hook evaluation.'}, 'overall_score': {'type': 'integer', 'description': 'Score for the opening as a whole.'}, 'one_sentence_verdict': {'type': 'string', 'description': 'The single-sentence read on the hook.'}}, 'description': 'The hook evaluation.'}, 'notice': {'type': 'string', 'description': 'The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it.'}}}
audit_script
Audit a YouTube script before recording
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.
외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['video_title', 'script_text'], 'properties': {'email': {'type': 'string', 'format': 'email', 'description': 'Where the free result is sent. Prepublish stores this address with the audit, emails the result link to it, and may send a short series of follow-up emails about the audit that include an unsubscribe link. 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.'}, 'audience': {'type': 'string', 'description': 'Target audience, only if the user said it.'}, 'category': {'type': 'string', 'description': 'Video category, only if the user said it.'}, 'script_text': {'type': 'string', 'maxLength': 250000, 'minLength': 50, 'description': 'The script text as the user wrote it. Paste it verbatim; do not rewrite, summarise or clean it first.'}, 'video_title': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'The title the user plans to publish under. The audit checks whether the script delivers this promise.'}, 'video_duration_seconds': {'type': 'integer', 'minimum': 1, 'description': 'Intended runtime in seconds, only if the user stated one. Used for pacing; never assumed.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['notice', 'analysis_id', 'open_in_browser'], 'properties': {'notice': {'type': 'string', 'description': 'The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it.'}, 'status': {'type': 'string', 'description': 'Present only when the audit had not settled inside this call; the value is "running".'}, 'analysis': {'type': 'object', 'description': 'The settled audit: status (and error_message when it failed), video_title, overall_score with hook_score, structure_score and pacing_score, ready_to_record, one_key_improvement, score_explanations, the attention_map (position_pct, hold_index, note, sentiment), the improvements in priority order (priority, category, title, location, original_quote and, for the passages on this plan, improved and why), locked_count, and policy_preflight. The script text itself and internal bookkeeping are not included. Absent while the audit is still running.'}, 'next_step': {'type': 'string', 'description': 'Present only when the audit is still running: what to do to collect it.'}, 'analysis_id': {'type': 'string', 'description': 'Prepublish id for this audit. Pass it to get_audit to re-read the result later.'}, 'open_in_browser': {'type': 'string', 'description': 'Permalink to the same audit on prepublish.ai.'}}}
check_authenticity
Check a script for reused or inauthentic content risk
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.
입력 스키마
{'type': 'object', 'required': ['video_title', 'script_text'], 'properties': {'script_text': {'type': 'string', 'maxLength': 250000, 'minLength': 50, 'description': 'The script text as the user wrote it. Paste it verbatim; do not rewrite, summarise or clean it first.'}, 'video_title': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'The planned title.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['notice', 'authenticity'], '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', 'properties': {'score': {'type': 'integer', 'description': 'Authenticity score for the script.'}, 'signals': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Each signal that fired, with its name, severity, reasoning and the quote that triggered it.'}, 'verdict': {'type': 'string', 'description': 'The short verdict in words.'}, 'created_at': {'type': 'string', 'description': 'When the check was produced.'}, 'risk_level': {'type': 'string', 'description': 'Banded risk level behind the score.'}, 'analysis_id': {'type': 'string', 'description': 'Prepublish id for this check.'}, 'remediation': {'type': 'array', 'items': {'type': 'object'}, 'description': 'What to change, each with the current passage, the fix, and why it matters.'}, '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.'}}, 'description': 'The inauthentic-content read on this script.'}}}
get_audit
Collect a Prepublish audit by 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.
읽기 전용
입력 스키마
{'type': 'object', 'required': ['analysis_id'], 'properties': {'analysis_id': {'type': 'string', 'minLength': 1, 'description': 'The analysis_id returned by audit_script.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['notice', 'analysis_id', 'open_in_browser'], 'properties': {'notice': {'type': 'string', 'description': 'The scope limit that accompanies every Prepublish result. Repeat it to the user rather than dropping it.'}, 'analysis': {'type': 'object', 'description': 'The audit at whatever state it has reached: read its "status" field first, because an audit that has not settled carries no scores. Once settled it carries the projected report described on audit_script, and an audit that failed carries its error_message.'}, 'analysis_id': {'type': 'string', 'description': 'The id that was requested, echoed back.'}, 'open_in_browser': {'type': 'string', 'description': 'Permalink to the same audit on prepublish.ai.'}}}
policy_preflight
Pre-flight a script against YouTube advertiser and monetisation policy
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.
입력 스키마
{'type': 'object', 'required': ['script'], 'properties': {'title': {'type': 'string', 'maxLength': 255, 'description': 'The planned title, if the user has one. Titles are checked too.'}, 'script': {'type': 'string', 'maxLength': 250000, 'minLength': 200, 'description': 'The script text as written, at least 200 characters. Below that there is not enough context for a policy read.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['notice', 'policy_preflight', 'note'], 'properties': {'note': {'type': 'string', 'description': 'Says which parts of the result are paid-only, so a locked field is not read as a clean pass.'}, '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', 'properties': {'title': {'type': 'string', 'description': 'The title that was checked, when one was supplied.'}, 'cached': {'type': 'boolean', 'description': 'True when this exact script and title had already been checked and the stored result was replayed.'}, '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.'}, 'created_at': {'type': 'string', 'description': 'When the pre-flight was produced.'}, 'preflight_id': {'type': 'string', 'description': 'Prepublish id for this pre-flight.'}}, 'description': 'The policy read on this script.'}}}
script_runtime
Convert script length to spoken runtime
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.
읽기 전용
입력 스키마
{'type': 'object', 'properties': {'word_count': {'type': 'integer', 'minimum': 1, 'description': 'A word count, if the user already knows it.'}, 'script_text': {'type': 'string', 'description': 'A script to count. Provide this or word_count or target_minutes.'}, 'target_minutes': {'type': 'number', 'minimum': 0.1, 'description': 'A target runtime in minutes, to convert into a word budget.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['speaking_rates_words_per_minute', 'source', 'caveat'], 'properties': {'caveat': {'type': 'string', 'description': 'What this arithmetic excludes. Repeat it rather than presenting a single number.'}, 'source': {'type': 'string', 'description': 'Where the rates come from, with the published write-up.'}, 'word_count': {'type': 'integer', 'description': 'Words counted or supplied. Present when script_text or word_count was given.'}, 'word_budget': {'type': 'object', 'required': ['fast', 'median', 'slow'], 'properties': {'fast': {'type': 'integer', 'description': 'Word budget at the fast rate.'}, 'slow': {'type': 'integer', 'description': 'Word budget at the slow rate.'}, 'median': {'type': 'integer', 'description': 'Word budget at the median rate.'}}, 'description': 'Words needed to fill the target at each rate. Present when target_minutes was given.'}, 'target_minutes': {'type': 'number', 'description': 'The target runtime asked for, echoed back. Present when target_minutes was given.'}, 'runtime_minutes': {'type': 'object', 'required': ['fast', 'median', 'slow'], 'properties': {'fast': {'type': 'number', 'description': 'Runtime at the fast rate.'}, 'slow': {'type': 'number', 'description': 'Runtime at the slow rate.'}, 'median': {'type': 'number', 'description': 'Runtime at the median rate.'}}, 'description': 'Spoken runtime in minutes at each rate. Present when script_text or word_count was given.'}, 'speaking_rates_words_per_minute': {'type': 'object', 'required': ['fast', 'median', 'slow'], 'properties': {'fast': {'type': 'number', 'description': '75th percentile speaking rate.'}, 'slow': {'type': 'number', 'description': '25th percentile speaking rate.'}, 'median': {'type': 'number', 'description': 'Median speaking rate.'}}, 'description': 'The measured rates used, in words per minute: slow is the 25th percentile, median the 50th, fast the 75th.'}}}
변경됨
script_runtime
2026년 9월 29일 3:00 AM
변경됨
policy_preflight
2026년 9월 29일 3:00 AM
변경됨
check_authenticity
2026년 9월 29일 3:00 AM
변경됨
audit_hook
2026년 9월 29일 3:00 AM
변경됨
get_audit
2026년 9월 29일 3:00 AM
변경됨
audit_script
2026년 9월 29일 3:00 AM
변경됨
script_runtime
2026년 9월 21일 2:58 AM
변경됨
policy_preflight
2026년 9월 21일 2:58 AM
변경됨
check_authenticity
2026년 9월 21일 2:58 AM
변경됨
audit_hook
2026년 9월 21일 2:58 AM
변경됨
get_audit
2026년 9월 21일 2:58 AM
변경됨
audit_script
2026년 9월 21일 2:58 AM
추가됨
script_runtime
2026년 9월 17일 7:57 AM
추가됨
policy_preflight
2026년 9월 17일 7:57 AM
추가됨
check_authenticity
2026년 9월 17일 7:57 AM
추가됨
audit_hook
2026년 9월 17일 7:57 AM
추가됨
get_audit
2026년 9월 17일 7:57 AM
추가됨
audit_script
2026년 9월 17일 7:57 AM