Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Hook Detector

REMOTE · API.HOOKDETECTOR.COM

Real TikTok and Instagram hooks that already work, in any language, with why each travelled.

0 this week 75 Trust /100

Last scanned (2 hours ago)

Scores higher than 64% of remote servers

Reachable. Last reached 11 Nov 2026.

Category Marketing and SEO

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 154 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability55
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 29041 tokens (~188/item across 154 items; 154 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage82
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 38% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 15 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_preset" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 155 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
What we tested

Checks we ran (12)

  • TLS certificate
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Checks we could not complete (1)

These are gaps on our side, not findings about this hosted endpoint. We only credit what we can confirm, so a category made up entirely of them scores 0.

  • Authorization in Endpoint SecurityAuthorisation not fully verified: no authorisation is required to call this server, and 154 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 11 Nov 26 0
    • Tool “get_skeleton” rewrote its description, which is the text the model reads security
    • Tool “review_hook” rewrote its description, which is the text the model reads security
    • Tool “review_short” rewrote its description, which is the text the model reads security
    • Tool “trending_shorts” rewrote its description, which is the text the model reads security
  • 9 Nov 26 0
    • Stability: 0.97 → pass security
  • 8 Nov 26 0
    • Stability: pass → 0.97 functional
  • 7 Nov 26 0
    • Endpoint reachability: unreachable → reachable ▲ functional
  • 6 Nov 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 5 Nov 26 0
    • Endpoint reachability: reachable → unreachable ▼ security
    • Stability: pass → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • TLS certificate: pass → unverified ▼ security
    • HSTS header: pass → unverified ▼ security
    • Transport: pass → fail ▼ security
    • Authorization: Authorisation not yet verified: we couldn't confirm whether this endpoint requires it. security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • First check of Schema quality: unverified functional
  • 28 Oct 26 0
    • Tool “invite_to_team” rewrote its description, which is the text the model reads security
    • Tool “list_formats” rewrote its description, which is the text the model reads security
    • Tool “save_to_folder” rewrote its description, which is the text the model reads security
    • Tool “score_package” rewrote its description, which is the text the model reads security
    • Tool “update_tracker” rewrote its description, which is the text the model reads security
    • Schema quality: 25634 → 29041 ▼ functional
    • New tool “clean_recording” functional
    • New tool “close_poll” functional
    • New tool “create_agent” functional
    • New tool “create_poll” functional
    • New tool “daily_ideas” functional
    • New tool “delete_agent” functional
    • New tool “delete_poll” functional
    • New tool “get_agent” functional
    • New tool “get_poll” functional
    • New tool “get_research” functional
    • New tool “get_skeleton” functional
    • New tool “list_agents” functional
    • New tool “list_polls” functional
    • New tool “list_research” functional
    • New tool “list_strategies” functional
    • New tool “next_poll” functional
    • New tool “read_retention_graph” functional
    • New tool “review_edit” functional
    • New tool “review_hook” functional
    • New tool “review_script” functional
    • New tool “review_video” functional
    • New tool “thumbnail_attention” functional
    • New tool “update_agent” functional
    • New tool “video_badges” functional
    • New tool “vote_poll” functional
    • New tool “write_hook” functional
    • New tool “write_script” functional
    • New tool “write_upload_pack” functional
    • “list_formats” added an optional parameter “include_small” cosmetic
    • “save_to_folder” added an optional parameter “video_id” cosmetic
    • “update_alert” added an optional parameter “daily_ideas” cosmetic
    • “update_tracker” added an optional parameter “daily_ideas” cosmetic
  • 27 Oct 26 −1
    • Tool “find_packaging” rewrote its description, which is the text the model reads security
    • Tool “get_run” rewrote its description, which is the text the model reads security
    • Tool “list_finds” rewrote its description, which is the text the model reads security
    • Tool coverage: 49% → 38% ▼ functional
    • Schema quality: 343 → 203 ▲ functional
    • Schema quality: excellent → good functional
    • New tool “ab_set” functional
    • New tool “accept_team_invite” functional
    • New tool “add_to_tracker” functional
    • New tool “channel_outliers” functional
    • New tool “clone_tracker” functional
    • New tool “comment_insights” functional
    • New tool “create_alert” functional
    • New tool “create_folder” functional
    • New tool “create_team” functional
    • New tool “create_tracker” functional
    • New tool “create_webhook” functional
    • New tool “delete_alert” functional
    • New tool “delete_folder” functional
    • New tool “delete_preset” functional
    • New tool “delete_tracker” functional
    • New tool “delete_webhook” functional
    • New tool “edit_folder_item” functional
    • New tool “edit_thumbnail” functional
    • New tool “find_similar” functional
    • New tool “find_sponsors” functional
    • New tool “format_videos” functional
    • New tool “get_alert” functional
    • New tool “get_call” functional
    • New tool “get_channel” functional
    • New tool “get_folder” functional
    • New tool “get_job” functional
    • New tool “get_optimize” functional
    • New tool “get_shared_folder” functional
    • New tool “get_team” functional
    • New tool “get_thumbnails” functional
    • New tool “get_tracker” functional
    • New tool “invite_to_team” functional
    • New tool “list_alerts” functional
    • New tool “list_calls” functional
    • New tool “list_folders” functional
    • New tool “list_formats” functional
    • New tool “list_jobs” functional
    • New tool “list_niches” functional
    • New tool “list_presets” functional
    • New tool “list_trackers” functional
    • New tool “list_trends” functional
    • New tool “list_webhooks” functional
    • New tool “list_winners” functional
    • New tool “make_thumbnails” functional
    • New tool “move_team_credits” functional
    • New tool “niche_report” functional
    • New tool “optimize_video” functional
    • New tool “preview_package” functional
    • New tool “random_outliers” functional
    • New tool “recreate_thumbnail” functional
    • New tool “remove_from_folder” functional
    • New tool “remove_from_tracker” functional
    • New tool “remove_team_member” functional
    • New tool “rename_folder” functional
    • New tool “research_keywords” functional
    • New tool “review_short” functional
    • New tool “revoke_team_invite” functional
    • New tool “run_alert” functional
    • New tool “save_preset” functional
    • New tool “save_to_folder” functional
    • New tool “score_package” functional
    • New tool “search_channels” functional
    • New tool “search_index” functional
    • New tool “search_thumbnails” functional
    • New tool “set_team_member_cap” functional
    • New tool “share_folder” functional
    • New tool “share_run” functional
    • New tool “similar_channels” functional
    • New tool “start_job” functional
    • New tool “swipe_file” functional
    • New tool “test_webhook” functional
    • New tool “tracker_alerts” functional
    • New tool “tracker_feed” functional
    • New tool “trending_shorts” functional
    • New tool “unshare_folder” functional
    • New tool “update_alert” functional
    • New tool “update_tracker” functional
    • New tool “video_scorecard” functional
    • New tool “video_stats” functional
    • New tool “view_team_invite” functional
    • New tool “webhook_deliveries” functional
    • New tool “write_ideas” functional
    • New tool “write_titles” functional
    • “find_long_hooks” added an optional parameter “filters” cosmetic
    • “find_long_hooks” added an optional parameter “preset_id” cosmetic
    • “find_packaging” added an optional parameter “content_type” cosmetic
    • “find_packaging” added an optional parameter “filters” cosmetic
    • “find_packaging” added an optional parameter “preset_id” cosmetic
    • “list_finds” added an optional parameter “language” cosmetic
    • “list_finds” added an optional parameter “max_channel_median” cosmetic
    • “list_finds” added an optional parameter “max_comments” cosmetic
    • “list_finds” added an optional parameter “max_duration_s” cosmetic
    • “list_finds” added an optional parameter “max_multiple” cosmetic
    • “list_finds” added an optional parameter “max_views” cosmetic
    • “list_finds” added an optional parameter “min_channel_median” cosmetic
    • “list_finds” added an optional parameter “min_comments” cosmetic
    • “list_finds” added an optional parameter “min_duration_s” cosmetic
    • “list_finds” added an optional parameter “min_multiple” cosmetic
    • “list_finds” added an optional parameter “min_views” cosmetic
    • “list_finds” added an optional parameter “posted_within_days” cosmetic
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 11 Nov 2026 · Probed https://api.hookdetector.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.hookdetector.com CN=YR2,O=Let's Encrypt,C=US 22 Sept 2026 21 Dec 2026 RSA 2048 SHA256-RSA 585b078a9a9ec8f997a261e8114ae84cd05
SANs: api.hookdetector.com
CN=YR2,O=Let's Encrypt,C=US (CA) CN=Root YR,O=ISRG,C=US 3 Sept 2025 2 Sept 2028 RSA 2048 SHA256-RSA 4ebd24947e24d394802d84a52fd5b319
CN=Root YR,O=ISRG,C=US (CA) CN=ISRG Root X1,O=Internet Security Research Group,C=US 13 May 2026 2 Sept 2032 RSA 4096 SHA256-RSA f24b6d17f9d9ad7cb1c9fea78782699f

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of api.hookdetector.com. — Secure

Zone DS Keys Algorithms Outcome
. Trust anchor 20326, 38696 8, 8 Verified
com. DS published 19718 13 Verified
hookdetector.com. DS published 1191 13 Verified
api.hookdetector.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy frame-ancestors 'none'
x-content-type-options nosniff
x-frame-options DENY
referrer-policy no-referrer

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.hookdetector.com/mcp Verified 200
http (plaintext) http://api.hookdetector.com/mcp HTTPS enforced 301 https://api.hookdetector.com/mcp
MCP tools · 154 exposed · ~28,706 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
read_retention_graph ~132

Read a YouTube Studio audience retention screenshot (base64 PNG or JPEG) into 100 points and the 21 marks it was read from (1 credit). Not the chart is 422 not_a_retention_chart, free. Same as POST /v1/review/graph.

NameTypeReqDescription
api_key–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
image––the screenshot as base64
NameTypeReqDescription
resultstringyes–

No examples provided.

recreate_thumbnail ~152

New thumbnails for your video with a YouTube video's own thumbnail as the layout reference (2 to 4 images, every printed word checked); priced as make_thumbnails. Same as POST /v1/thumbnails/recreate; read it with get_thumbnails.

NameTypeReqDescription
api_key–––
count–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
mode–––
size–––
title–––
video_urlstringyes–
words–––
NameTypeReqDescription
resultstringyes–

No examples provided.

reject_access_request ~52

Owner only: reject a pending access request. Nothing is emailed. An approved or rejected request is 409 request_already_decided. Free.

NameTypeReqDescription
api_key–––
request_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

remix_find ~890

Make it mine, for a long-form opening or a package: write up to n (1 to 5, default 3) new ones for your niche that keep one real find's structure. From a long find, `written` holds openings: hook (what the creator says first), then (what the next half minute has to deliver) and kept_structure, built on the find's template and its order of beats. From a packaging find it holds packages: title, thumbnail (what to show and how to frame it), thumbnail_text (the words to print, or null) and kept_structure, built on its title template and its thumbnail's composition. Write my intro: with mode "intro" and video_brief (your own video in a few sentences, 10 to 600 characters; a long find only, a packaging find is 422; niche and n are not used) it writes YOUR intro in the real opening's structure. `written` then holds one object with a beat for each beat of the real opening, in order: beat, does, from_s, to_s, seconds and words_budget (the real opening's own timing, never the model's), say (the words to say, with {placeholders} for what only you know), words, placeholders, suggested_on_screen and suggested_broll (suggestions, never part of what is said); and seconds, timing (measured or estimated), kept_structure, placeholders and numbers_to_placeholders. The answer carries mode "intro" and video_brief, and niche is null. A number you did not write in video_brief becomes {number}. One that copies the real opening or runs over a word budget is 422 remix_not_possible. Returns {"find_id", "kind", "niche", "n", "written", "label", "credits_charged": 1, "credits"}. label says they were written by Hook Detector from a real opening's (or package's) structure: show it with them, never present one as a real video's. One that is the real find's own words is dropped. They are never added to a run, a keep or an export. Costs 1 credit per call, taken before the model is asked and refunded when it…

NameTypeReqDescription
api_key–––
find_id––one of your finds (from get_run, get_find, list_finds or list_kept_finds)
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
modestring|null–optional: "openings" (the default) writes openings or packages for a niche; "intro" is Write my intro: your own timed intro for the video you describe in video_brief, in this long-form opening's stru…
ninteger–how many to write, 1 to 5 (default 3)
niche––your niche, product or audience, as you would say it (1 to 120 characters)
video_briefstring|null–required for mode "intro", 10 to 600 characters: what your video is about, in a few sentences, in your own words and language. The intro uses only the facts and numbers you write here; anything else…
NameTypeReqDescription
resultstringyes–

No examples provided.

remix_hook ~523

Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche that keep a real hook's structure, the device that made it travel, with the subject swapped for yours. hook_id is one of your hooks (from get_run, get_hook or list_keeps); 404 hook_not_found otherwise. Leave mode out: "intro" (Write my intro) is remix_find on a long-form find, and is 422 here, before any charge. Returns {"hook_id", "niche", "n", "written": [{"line", "kept_structure"}], "label", "credits_charged": 1, "credits"}. label is always "Written by Hook Detector from a real hook's structure": these are written lines, never found hooks; show the label with them, never present one as a real clip's hook. They are never added to a deck, a keep or an export. Costs 1 credit per call, taken before the model is asked and refunded when it does not answer (503 model_unavailable) or when nothing it wrote keeps the rules or it declines the content (422 remix_not_possible, the reason in the message; another try or another niche may work). 402 insufficient_credits at a balance of 0; limited per account per hour (429 rate_limited). Needs the research permission. The answer carries remix_id: list_remixes and get_remix read it back, free. Same as POST /v1/hooks/{hook_id}/remix.

NameTypeReqDescription
api_key–––
hook_id––one of your hooks (from get_run, get_hook or list_keeps)
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
modestring|null–leave out (or "openings"). Write my intro works from a long-form find (POST /v1/finds/{find_id}/remix), so "intro" is refused here with 422
ninteger–how many lines to write, 1 to 5 (default 3)
niche––your niche, product or audience, as you would say it (1 to 120 characters)
NameTypeReqDescription
resultstringyes–

No examples provided.

remove_from_folder ~115

Take one video out of a folder; the hook or find and its keep stay. Returns {"item_id", "removed": true}. Same as DELETE /v1/folders/{folder_id}/items/{item_id}. Free. Errors: 404 item_not_found (also on a second remove).

NameTypeReqDescription
api_key–––
folder_id––one of your folders (from list_folders or create_folder)
item_id––an item of that folder (from get_folder or save_to_folder)
NameTypeReqDescription
resultstringyes–

No examples provided.

remove_from_tracker ~58

Take a channel off one of your trackers. Same as DELETE /v1/trackers/{tracker_id}/channels/{ref}.

NameTypeReqDescription
api_key–––
refstringyes–
tracker_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

remove_team_member ~112

The owner removes a member; anyone leaves with member_id "me". A removed member's next spend comes from their own balance, never the pool. The owner leaving with members is 409 team_has_members; alone it ends the team and returns the pool. Needs admin. Free. Same as DELETE /v1/team/members/{member_id}.

NameTypeReqDescription
api_key–––
member_idstringyesa member_id from get_team, or "me" to leave
NameTypeReqDescription
resultstringyes–

No examples provided.

rename_folder ~112

Rename a folder, change its description, or both. A name another folder on the tab already has is 409 folder_exists. Returns the folder. Same as PATCH /v1/folders/{folder_id}. Free.

NameTypeReqDescription
api_key–––
description––a new description; "" clears it, left out it stays
folder_id––one of your folders (from list_folders or create_folder)
name––a new name, 1 to 80 characters
NameTypeReqDescription
resultstringyes–

No examples provided.

request_access ~120

Ask for the beta access code a new account needs (create_account's access_code). email is where the code is sent; note is optional (who you are, up to 500 characters). The owner approves the request and the code is emailed at once; it works once, in any agent or on the web. Returns status pending (waiting for approval) or emailed (sent now). No key needed. Limited to 5 per address per hour. Free.

NameTypeReqDescription
emailstringyes–
note–––
NameTypeReqDescription
resultstringyes–

No examples provided.

research_keywords ~356

Keyword research for YouTube. volume: always estimated (YouTube publishes no search counts): estimated_monthly_searches with a range, a 0 to 100 score and band, its source (Google Trends with the YouTube filter against fixed anchors; or, when Trends is busy, YouTube autocomplete and the top results' views) and basis. competition: 0 to 100 counted from the top 10 long-form results (big channels, posted in the last year, the keyword in the title, how many beat their own channel 2x). score: value 0 to 100 (60% volume, 40% the room competition leaves), band very_low, low, medium, high or very_high (vidIQ's brackets) and the basis naming its inputs. related, questions, rising: terms from autocomplete and the top results' titles, each with its source. Costs 2 credits, refunded when the read fails; a bad request is 422 and costs nothing. Takes about 10 to 30 seconds. Same as POST /v1/keywords. Read it back with get_call.

NameTypeReqDescription
api_key–––
country––a two-letter country code, default US
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
keyword––the words people would type into YouTube search, 2 to 100 characters
language––a two-letter language code for the autocomplete, default en
NameTypeReqDescription
resultstringyes–

No examples provided.

review_edit ~188

Edit Review of a cut before upload (25 credits; an unlisted or public YouTube link up to 60 minutes): cuts a minute, long shots, dead air, sound changes, on-screen text, and the notes as Premiere CSV, Resolve EDL and FCPXML markers. Runs as a job. Same as POST /v1/review/edit; to review the file itself (when YouTube refuses our servers the link is refused free with upload_instead), send it to POST /v1/review/edit/upload.

NameTypeReqDescription
api_key–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
url––a YouTube link: watch, youtu.be or shorts address
NameTypeReqDescription
resultstringyes–

No examples provided.

review_hook ~170

Hook Review of your own opening (3 credits): a YouTube link (its first minute heard by Scribe v3) or a pasted script, scored out of 10 from named counted parts, a verdict per beat, and the promise check against your title and thumbnail words. Same as POST /v1/review/hook.

NameTypeReqDescription
api_key–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
script––or your opening as pasted words
thumbnail_words–––
title–––
url––a YouTube link: watch, youtu.be or shorts address
NameTypeReqDescription
resultstringyes–

No examples provided.

review_script ~117

Script Review (3 credits): your pasted script read like a Video Review on estimated times, plus machine-sounding lines and a fact-check list. Runs as a job. Same as POST /v1/scripts/review.

NameTypeReqDescription
api_key–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
script–––
title–––
NameTypeReqDescription
resultstringyes–

No examples provided.

review_short ~414

Rate my Reel or Short: read one public short the way Hook Detector reads a clip (its first frames, its words heard by ElevenLabs Scribe v3) and rate it against the real finds on its subject (the Short form search over the last 30 days, ranked by their multiple over the creator's usual). Returns review_id, url, platform, video_id, subject, subject_from, clip (first_line, first_word_s, words_per_minute, longest_pause_s, words, heard_by, not_heard_why, onscreen_text, plays, multiple), reads (five, in order: stop, gap, momentum, feeling, reach; each with verdict strong, moderate or weak, says, computed_from counted against the finds, and finds: 1 to 3 ids from `finds`), finds (each a real video with its url, plays, multiple, first_line and pace), finds_from, label, credits_charged and credits. Never a guessed number. Costs 3 credits, taken first and given back on any failure: 422 invalid_link (before any charge), 404 video_not_found (private or removed), 422 not_a_short, 422 review_not_possible (too few finds on the subject), 503 model_unavailable. 402 insufficient_credits under 3; limited per account per hour (429). Takes up to about 90 seconds. Needs research. Same as POST /v1/review/short.

NameTypeReqDescription
api_key–––
idempotency_key––retry safely: the same key and arguments within 24 hours answer the saved review and charge nothing
subject––what the clip is about, 2 to 120 characters; leave out to read it from the clip
url––a public Instagram Reel, TikTok video or YouTube Short link, starting with https://
NameTypeReqDescription
resultstringyes–

No examples provided.

review_video ~210

Video Review of any public long video (15 credits): five ranked fixes with times and the counted fact behind each, six sub-scores each with what it is computed from, the hook scored and rewritten (labelled as written), the curve (YouTube's replay peaks, not retention; your Studio curve via graph_points; else predicted, not measured), the story with gap rules, pace and loudness per section, the next five uploads. Runs as a job: answers the paid call (pending); get_call reads it. Same as POST /v1/review.

NameTypeReqDescription
api_key–––
graph_points––your real curve from read_retention_graph
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
url––a YouTube link: watch, youtu.be or shorts address
NameTypeReqDescription
resultstringyes–

No examples provided.

revoke_access_code ~67

Owner only: revoke an access code (code_id from list_access_codes). It admits nobody from now on; accounts it already made keep working. 404 access_code_not_found for an unknown id. Free.

NameTypeReqDescription
api_key–––
code_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

revoke_key ~150

Revoke one of your API keys at once: key_id from list_keys, or "original" for the signup key. Any key may revoke itself (the result says so, and that key stops working immediately); revoking another needs admin. Never the last active key on the account (409): create another with create_key first. If a key leaked, pass key_id "others": every key of the account except the one you are calling with is revoked at once, and the result says how many (revoked_count) and which key is kept. Needs admin. Free.

NameTypeReqDescription
api_key–––
key_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

revoke_team_invite ~64

Revoke an open invite: its link stops working at once. Owner only. Needs admin. Free. Same as DELETE /v1/team/invites/{invite_id}.

NameTypeReqDescription
api_key–––
invite_idstringyesfrom get_team invites
NameTypeReqDescription
resultstringyes–

No examples provided.

run_alert ~58

Check a saved search now, as a job (read it with get_job). 1 credit. Same as POST /v1/alerts/{alert_id}/run.

NameTypeReqDescription
alert_idstringyes–
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

save_preset ~245

Save filters under a name for one tab: "long", "packaging" or "library" (the bounds are those of find_packaging's filters; a library preset may also hold min_comments, max_comments, posted_within_days and language). The same name on the same tab replaces it. Start a run from it with preset_id on find_long_hooks or find_packaging. At most 50 an account. Same as POST /v1/presets. Free.

NameTypeReqDescription
api_key–––
filtersobject|null–optional bounds, every one optional: min_multiple and max_multiple (views over the channel's median, 1 to 1000), min_views, max_views, min_channel_median, max_channel_median, min_duration_s, max_dura…
namestringyes–
tabstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

save_to_folder ~253

File one video in a folder of its tab: a find (find_id) or any public YouTube video (video_id) in a long or packaging folder, a hook (hook_id) in a short one, with an optional note. A video already in the folder (the same find, another run's find of it, the same hook) returns that item with created false; a note given then replaces its note. Filing does not keep it. Same as POST /v1/folders/{folder_id}/items. Free. Errors: 404 find_not_found or hook_not_found, 422 kind_mismatch, 409 folder_full (2000 items).

NameTypeReqDescription
api_key–––
find_id––a Long form or Packaging find of yours; or give hook_id
folder_id––one of your folders (from list_folders or create_folder)
hook_id––a Short form hook of yours; or give find_id
note––optional, up to 1000 characters
video_id––any public YouTube video by its 11-character id, for a long or packaging folder
NameTypeReqDescription
resultstringyes–

No examples provided.

score_package ~319

Score a package against the real outliers on its subject, part by part (title device, length, words on the picture, faces, the words' role, contrast, brightness): each part says how many outliers it matches; pattern_match (0 to 100) is the mean share: how much the package resembles the subject's outliers, never a click-through rate or a prediction (in our test it scored outliers above their channels' usual videos on about 3 of 4 pairs). Also nearest (5 outliers) and fixes. 1 credit, refunded when the read fails. Same as POST /v1/packaging/score.

NameTypeReqDescription
api_key–––
content_type––for a topic: long or short
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
run_id––a finished run of yours whose outliers to compare with; or topic
thumbnail––optional: your thumbnail as base64 (JPEG, PNG, WebP, at most 4 MB) or an i.ytimg.com URL
title––your title, 1 to 150 characters (or video_url)
topic––the subject (the shared index's outliers)
video_url––a published YouTube video to score instead
NameTypeReqDescription
resultstringyes–

No examples provided.

search_channels ~60

Channels by name or handle: the shared index first, then YouTube's own channel search. Free. Same as GET /v1/channels/search.

NameTypeReqDescription
api_key–––
limitinteger––
qstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

search_index ~176

Search the shared index of public YouTube videos Hook Detector's runs measured, with no run: words by text and meaning, or browse; filters for the multiple, views, long or short, recency, channel size and language. Free. Same as GET /v1/index/search.

NameTypeReqDescription
api_key–––
channel_size––small, medium or large
content_type––long or short
cursor–––
language–––
limitinteger––
max_multiple–––
max_views–––
min_multiple–––
min_views–––
posted_within_days––30, 90, 365 or 730
q–––
sort––multiple, views, recent or relevance (needs q)
NameTypeReqDescription
resultstringyes–

No examples provided.

search_thumbnails ~179

Thumbnails in the shared index by what the picture shows (q), or like a picture (image_url: read once by the model as subject, action, words and setting, then searched). Each result has matched_by (text or meaning). Free; image reads at most 60 an hour. Same as GET /v1/index/thumbnails and POST /v1/index/thumbnails/by-image.

NameTypeReqDescription
api_key–––
content_type––long or short
image_url––instead of q: a public https picture or a YouTube video link; it is read once by the model, then searched
limit––1 to 50 (default 12)
min_multiple–––
q––what the picture shows, e.g. person pointing at a chart
NameTypeReqDescription
resultstringyes–

No examples provided.

set_team_member_cap ~133

Set a member's monthly cap on the pool (null removes it). A run started near the cap holds only what is left, so the cap is never passed mid-run (403 team_cap_reached below a run's minimum or a tool's price). Owner only. Needs admin. Free. Same as PATCH /v1/team/members/{member_id}.

NameTypeReqDescription
api_key–––
member_idstringyesa member_id from get_team
monthly_cap–yes1 to 1,000,000 credits a UTC month, or null for no cap
NameTypeReqDescription
resultstringyes–

No examples provided.

share_folder ~127

Turn on a folder's share link: share_url is a public read-only page anyone with it opens signed out (hookdetector.com/f/<token>); api_url is the same as JSON (get_shared_folder). It shows the folder's name, description and items with their notes, never anything about the account. A shared folder keeps its link. Same as POST /v1/folders/{folder_id}/share. Free.

NameTypeReqDescription
api_key–––
folder_id––one of your folders (from list_folders or create_folder)
NameTypeReqDescription
resultstringyes–

No examples provided.

share_run ~237

Share a finished Short form run as a public, read-only page anyone can open with the link, no sign-in: each hook's spoken line, on-screen words, idea, plays, creator and its video, in the Hook Detector skill page layout. Nothing about the account is on it. Returns {"run_id", "token", "url"}; give the person the url (https://hookdetector.com/p/<token>). Idempotent: a run keeps one link, so calling again returns the same url. The same body as POST /v1/runs/{run_id}/share; the page's data is GET /v1/shared/{token}, no key needed. Needs the write scope. Free. Errors: 404 run_not_found, 409 run_not_finished while the run works (call get_run with wait_seconds=50 first), 409 run_not_shareable for a failed run or a Long form or Packaging run, 422 invalid_request for a malformed run_id.

NameTypeReqDescription
api_key–––
run_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

showcase ~134

Real hooks this service has delivered, for a wait screen: talking heads only, each hook_id, still_url (a JPEG, no key needed), platform, creator, views and line (the banner on the video, else its opening line). The most viewed first, one per creator, only what is already public on TikTok or Instagram: never a topic, an account or a run. No key needed. Cached 10 minutes. Free. REST: GET /v1/showcase?n=12.

NameTypeReqDescription
ninteger–how many; clamped to 1 to 24
NameTypeReqDescription
resultstringyes–

No examples provided.

similar_channels ~75

Channels in the shared index closest to this one by the meaning of their titles, else by shared words, with a similarity 0 to 1. Free. Same as GET /v1/channels/{ref}/similar.

NameTypeReqDescription
api_key–––
limitinteger––
refstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

start_job ~115

Start a background job on Hook Detector's job runner. Only echo can be started by hand: it waits `seconds` and answers `message` back with how many attempts it took (a job survives a deploy). At most 3 an hour per account. Free. Same as POST /v1/jobs; read it back with get_job.

NameTypeReqDescription
api_key–––
kindstring–only echo today
message–––
secondsinteger–1 to 120
NameTypeReqDescription
resultstringyes–

No examples provided.

swipe_file ~109

Your swipe file: the title structures of the Packaging finds you kept or filed, each title_template with its title_device, count (how many of those videos use it, one a video) and best (the example with the highest outlier_score, 0 to 100). The most used first; packages is how many videos were read, skipped how many had no structure. Same as GET /v1/swipe. Free.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

test_webhook ~53

Send one signed test delivery now and read what your URL answered. Same as POST /v1/webhooks/{webhook_id}/test.

NameTypeReqDescription
api_key–––
webhook_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

thumbnail_attention ~165

Where the eye is predicted to land on a thumbnail: the picture with a heatmap over it (PNG, base64), a 16 by 9 grid, the peak, the share in each third, the concentration and the share in YouTube's length corner. UNISAL (AUC 0.895 on MIT1003): faces draw it strongly, printed words less than people read them; a prediction, not a click-through rate. Free. Same as POST /v1/thumbnails/attention.

NameTypeReqDescription
api_key–––
thumbnail––a JPEG, PNG or WebP in base64 or an i.ytimg.com URL
video_url––or a YouTube video: its own thumbnail is read
NameTypeReqDescription
resultstringyes–

No examples provided.

tracker_alerts ~66

Your tracker alerts, newest first, with the unread count. Free. Same as GET /v1/trackers/alerts.

NameTypeReqDescription
api_key–––
limitinteger––
mark_readboolean––
unread_onlyboolean––
NameTypeReqDescription
resultstringyes–

No examples provided.

tracker_feed ~83

A tracker's channels' uploads, strongest first. Free. Same as GET /v1/trackers/{tracker_id}/feed.

NameTypeReqDescription
api_key–––
daysinteger––
limitinteger––
sortstring–multiple, vph or recent
token–––
tracker_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

trending_shorts ~332

Trending Shorts: the short videos (TikToks, Instagram Reels, YouTube Shorts) rising now on a subject, fastest first. Each item has video_id, platform, url, cover_url, creator, caption, plays, posted_at, age_hours, plays_per_hour (plays over the hours since posting, at least one), multiple and multiple_basis (plays over the creator's usual: the median of their latest videos, or TikTok likes per video; null when it could not be measured), creator_usual, duration_s, and spoken_hook with spoken_hook_from (the opening line when one of your own Short form runs delivered the video, or Scribe v3 heard it). At most 20 items, 2 per creator; a video with no post date is never listed. unavailable names a platform whose search did not answer. Free (credits_charged 0); the same subject, platform and window within 30 minutes is served from the cache, and fresh fetches are limited per account per hour (429 rate_limited). 503 search_unavailable when no platform answered. Needs read. Same as GET /v1/shorts/trending.

NameTypeReqDescription
api_key–––
platform––tiktok, instagram or youtube; leave out for all three
subject––what the videos are about, 2 to 120 characters
window––24h, 7d (default) or 30d: how recently they were posted
NameTypeReqDescription
resultstringyes–

No examples provided.

unshare_folder ~75

Turn a folder's share link off: the old link stops working at once; share_folder again makes a new one. Same as DELETE /v1/folders/{folder_id}/share. Free.

NameTypeReqDescription
api_key–––
folder_id––one of your folders (from list_folders or create_folder)
NameTypeReqDescription
resultstringyes–

No examples provided.

update_agent ~63

Change an agent's name or monthly budget, or pause it. Same as PATCH /v1/agents/{agent_id}.

NameTypeReqDescription
active–––
agent_idstringyes–
api_key–––
monthly_budget–––
name–––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_alert ~85

Change a saved search: its words, line, frequency or email. Same as PATCH /v1/alerts/{alert_id}.

NameTypeReqDescription
alert_idstringyes–
api_key–––
daily_ideas–––
email–––
frequency–––
min_multiple–––
min_vph–––
query–––
NameTypeReqDescription
resultstringyes–

No examples provided.

update_tracker ~92

Rename a tracker, share it, change its alert lines, or turn its daily ideas on. Same as PATCH /v1/trackers/{tracker_id}.

NameTypeReqDescription
alert_email–––
api_key–––
daily_ideas–––
multiple_threshold–––
name–––
tracker_idstringyes–
visibility–––
vph_threshold–––
NameTypeReqDescription
resultstringyes–

No examples provided.

usage ~93

Your credits and what you have spent: credits (balance now), spent_total, reserved_now (credits held by runs still in flight, refunded in part when they finish), runs_total, last_30_days (one entry per UTC day: date, runs, charged) and recent (your 20 newest runs). Same shape as GET /v1/usage. Free.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

video_badges ~116

Badges for up to 50 YouTube videos at once, as the Chrome extension shows them on every card: views, the multiple over the channel's usual views (long against long uploads, Shorts against Shorts) with its band, and views per hour with its basis. Ids with no badge are in unread with why. Free. Same as GET /v1/videos/badges.

NameTypeReqDescription
api_key–––
idsarrayyes1 to 50 YouTube video ids
NameTypeReqDescription
resultstringyes–

No examples provided.

video_scorecard ~82

Everything the index knows about one video: the multiple, views per hour and its history, real tags, title and thumbnail changes, our reads, similar videos. Free. Same as GET /v1/videos/{video_id}/scorecard.

NameTypeReqDescription
api_key–––
video_idstringyesan 11-character YouTube id
NameTypeReqDescription
resultstringyes–

No examples provided.

video_stats ~82

A video's views per hour and its history from the shared index (new, rising and tracked videos read hourly, the rest daily); a video the index lacks is read now. Free. Same as GET /v1/videos/{video_id}/stats.

NameTypeReqDescription
api_key–––
video_idstringyesan 11-character YouTube id
NameTypeReqDescription
resultstringyes–

No examples provided.

view_team_invite ~97

What an invite joins, before accepting: the team's name, who invited you, its seats, when the link expires, and whether you are signed in with the invited email (null for an account with no email). Free. Same as GET /v1/team/invites/{token}.

NameTypeReqDescription
api_key–––
tokenstringyesthe hdt_... token, the part of the link after #
NameTypeReqDescription
resultstringyes–

No examples provided.

vote_poll ~111

Vote on a poll with the slot you picked, and an optional reason. One vote an account, never on your own or your team's poll. Answers the shares so far. Free. Same as POST /v1/polls/{poll_id}/vote.

NameTypeReqDescription
api_key–––
poll_idstringyesthe poll's id
reason––optional: why, at most 140 characters
slotintegeryesthe slot you picked in next_poll's answer
NameTypeReqDescription
resultstringyes–

No examples provided.

webhook_deliveries ~65

A webhook's deliveries, newest first, with status and your URL's answers. Same as GET /v1/webhooks/{webhook_id}/deliveries.

NameTypeReqDescription
api_key–––
limitinteger––
webhook_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

write_hook ~124

Hook Creator (1 credit): an opening for your subject as beats with seconds counted from their words and a shot plan per line (said, shown, on screen, sound, delivery), labelled as written. Same as POST /v1/openings.

NameTypeReqDescription
api_key–––
hook_type–––
idempotency_key––1 to 255 visible ASCII characters; the same key and request within 24 hours answer the saved remix and charge nothing; the same key with another request is 422 idempotency_key_reused
subject–––
NameTypeReqDescription
resultstringyes–

No examples provided.

Install

How do I install the Hook Detector MCP server?

Hook Detector is a hosted endpoint at https://api.hookdetector.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · api.hookdetector.com

# add to Claude Code
claude mcp add --transport http com-hookdetector-hookdetector 'https://api.hookdetector.com/mcp'
Common questions

What is the Hook Detector MCP server?

Hook Detector is an MCP server listed in the public MCP registry as com.hookdetector/hookdetector. Real TikTok and Instagram hooks that already work, in any language, with why each travelled. This page covers its hosted endpoint (https://api.hookdetector.com/mcp).

Is the Hook Detector MCP server safe to use?

Hook Detector scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Hook Detector MCP server expose?

Hook Detector exposes 154 tools: create_account, showcase, find_hooks, get_run, list_runs, and 149 more. Their descriptions and schemas cost roughly 28,706 tokens of context every time the server is loaded.

Does the Hook Detector MCP server require authentication?

No. We connected to Hook Detector without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the Hook Detector MCP server still maintained?

Hook Detector is still listed as active in the MCP registry. We last reached this channel on 11 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the Hook Detector MCP server?

VerifyMCP ran 12 checks on Hook Detector, covering TLS certificate, HTTPS, HSTS header, DNSSEC and 8 more. One item could not be completed, a gap on our side rather than a finding about Hook Detector: Authorization. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.