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
get_channel ~87

A channel page: subscribers and totals, every recent long upload scored against the channel itself (outliers at 2x its median and over), and its momentum. Free. Same as GET /v1/channels/{ref}.

NameTypeReqDescription
api_key–––
freshboolean––
refstringyesa UC id, @handle or channel address
NameTypeReqDescription
resultstringyes–

No examples provided.

get_conversation ~168

One chat conversation: its newest messages in order (role, content, run_id, created_at), a page of `limit`, with earlier_cursor for the older ones (null when the page reaches the first message), and the runs those messages hold, with their hooks, plus nullable language and country search picker settings. Same shape as GET /v1/conversations/{conversation_id}. Free. Errors: 404 conversation_not_found, 422 for an id that is not a UUID or a cursor this API did not issue.

NameTypeReqDescription
api_key–––
before––earlier_cursor from the previous page; leave out for the newest messages
conversation_idstringyes–
limitinteger–messages per page, newest page first
NameTypeReqDescription
resultstringyes–

No examples provided.

get_find ~107

One result of a long or packaging run with every field: the video, its numbers and the opening or the package analysis. find_id comes from a run's finds (get_run) or from list_kept_finds. Same shape as GET /v1/finds/{find_id}. Free. Errors: 404 find_not_found, 422 for an id that is not a UUID.

NameTypeReqDescription
api_key–––
find_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_folder ~126

One of your folders and its items, newest filed first, limit 1 to 100 a page (page with next_cursor). Each item has item_id, note, thumbnail_url, title and the full hook or find object. Same as GET /v1/folders/{folder_id}. Free. Errors: 404 folder_not_found.

NameTypeReqDescription
api_key–––
cursor–––
folder_id––one of your folders (from list_folders or create_folder)
limitinteger–page size, 1 to 100
NameTypeReqDescription
resultstringyes–

No examples provided.

get_hook ~82

One hook with every field: its opening line, transcript, watch_url and the vertical player_url (null only for an unusable id or a photo post found before 2026-09-26; runs deliver single videos only). hook_id comes from get_run. Free.

NameTypeReqDescription
api_key–––
hook_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_job ~59

One background job of this account. Same as GET /v1/jobs/{job_id}. Errors: 404 job_not_found for another account's job or an unknown id.

NameTypeReqDescription
api_key–––
job_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_optimize ~55

An Optimize call: the original's score and every new package so far. Same as GET /v1/optimize/{call_id}. Free.

NameTypeReqDescription
api_key–––
call_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_poll ~80

One poll: yours with votes, shares, 95% intervals, the leader once the votes separate, the slots and the reasons; or one you voted on with its shares. Free. Same as GET /v1/polls/{poll_id}.

NameTypeReqDescription
api_key–––
poll_idstringyesthe poll's id
NameTypeReqDescription
resultstringyes–

No examples provided.

get_remix ~77

One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer held it. Free. 404 remix_not_found for one that is not yours. Same as GET /v1/remixes/{remix_id}.

NameTypeReqDescription
api_key–––
remix_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_research ~140

One research page: every claim with the first run's and the second run's numbers (each run a sample of different channels), n per run and per cell, shown_a and shown_b (over the sample bar), reproduced (true, false, or null for too few) and direction, plus measures naming what each number is computed from. 404 page_not_found for an unknown slug, 422 for a malformed one. No key needed; limited per address. Free. Same as GET /v1/findings/{slug}.

NameTypeReqDescription
slugstringyesopenings, title-devices or title-thumbnail-overlap
NameTypeReqDescription
resultstringyes–

No examples provided.

get_run ~973

A research run: its status, progress, charge and every hook it produced. wait_seconds 0 to 50: wait up to that long for the run to finish, returning the moment it is done or failed. Use wait_seconds=50 and call again while status is "queued" or "running"; a fresh run needs about 3 or 4 such calls. progress has stage, message and updated_at, plus counts once the research reports them, preview (hooks written so far) while a running run holds one, and feed (the live research wall: up to 24 clips the run is working on, newest first, each key, platform, creator, views, state found|reading|talking|passed, thumb_url, a JPEG any <img> can load with no key, and line, the banner or opening words once the judges passed the clip) while it shows one, and on a Long form or Packaging run scan (the videos it is looking at: up to 60 tiles {v: YouTube video id, s: found|on_topic|off_topic|measured|beat| reading|ready|passed, x: multiple of the channel's usual or null}, oldest first, and lanes with found, on_topic, measured, beat, reading, ready; draw a tile from https://i.ytimg.com/vi/{v}/mqdefault.jpg; counts.measured and counts.beat are the numbers report.landscape ends on). Pass since with the last progress.updated_at to return on change or completion. It must be an ISO timestamp with a timezone (422 invalid_request otherwise). `hooks` is the deck (a person talking); `bonus` is always [] (removed 2026-10-08). Every hook has format and section (always "main"), and creator_country (TikTok only), place and place_country (null when unknown), banner (the title placed on the video, null when none) and match ("exact" or "close", a close match being a neighbouring subject delivered after the exact ones; null on runs with no language or country and on older hooks). Since 2026-10-04 the run carries understood (what the request was read to ask: subject, language, country, core, audience, neighbo…

NameTypeReqDescription
api_key–––
run_idstringyes–
since–––
wait_secondsinteger–0 to 50: seconds to wait for the run to finish; 0 returns at once
NameTypeReqDescription
resultstringyes–

No examples provided.

get_shared_folder ~127

A shared folder as anyone with its link sees it: name, description, kind, item_count and items (public fields and the owner's note), newest first, paged. No key needed; limited per address (429). A link never made or turned off is 404 shared_folder_not_found. Same as GET /v1/shared/folders/{token}. Free.

NameTypeReqDescription
cursor–––
limitinteger–page size, 1 to 100
token––the token of a share link (hookdetector.com/f/<token>)
NameTypeReqDescription
resultstringyes–

No examples provided.

get_skeleton ~163

The skeleton of a long find's whole video, heard by Scribe v3: sections, re-hooks, open loops, payoffs, sponsor and call-to-action spans, the outro, the timed lines. Builds it once for 5 credits as a paid call (status pending; read it with get_call); after that answers the stored one free. Same as POST and GET /v1/finds/{find_id}/skeleton.

NameTypeReqDescription
api_key–––
find_id––one of your long 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
NameTypeReqDescription
resultstringyes–

No examples provided.

get_team ~114

Your team, or team null: its name, pool (credits), seats, each member's name and role. The owner also sees every member's email, monthly cap and spend, open invites (never their links) and the newest 50 charges to the pool (who, what kind, credits, when; never what it was about). your_credits is your own balance, untouched while you are a member. Free. Same as GET /v1/team.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

get_thumbnails ~71

A thumbnails call: status, concepts and every image so far (url signed for 7 days, width, height, words, words_checked, cost_usd). Same as GET /v1/thumbnails/{call_id}. Free.

NameTypeReqDescription
api_key–––
call_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

get_tracker ~46

One tracker and its channels. Same as GET /v1/trackers/{tracker_id}.

NameTypeReqDescription
api_key–––
token–––
tracker_idstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

invite_to_team ~111

Invite someone: returns link (and its token), a single-use page valid 7 days, shown here only, and emailed to that address (emailed true; when false, give the link to the person yourself). Someone signed in with Google must hold that email to accept. Owner only. Needs admin. Free. Same as POST /v1/team/invites.

NameTypeReqDescription
api_key–––
emailstringyesthe email of the person invited
NameTypeReqDescription
resultstringyes–

No examples provided.

keep_find ~155

Keep or reject a find (a long-form hook or a package): verdict is "keep" (default) or "reject", and the last verdict wins. The verdict is the video's on that tab: every find of the same video you have there carries it, so a later run that finds the video again shows it already kept. Kept videos come back from list_kept_finds, across all runs. Returns {"find_id", "verdict"}. Same as POST /v1/finds/{find_id}/decision. Free. Errors: 404 find_not_found.

NameTypeReqDescription
api_key–––
find_idstringyes–
verdictstring––
NameTypeReqDescription
resultstringyes–

No examples provided.

keep_hook ~122

Keep or reject a hook: verdict is "keep" (default) or "reject", and the last verdict wins. A reject may say why: reason is off_subject, weak_opening, wrong_language, low_quality, already_have or other, and note (up to 280 characters) your own words. Kept hooks come back from list_keeps, across all runs. Free.

NameTypeReqDescription
api_key–––
hook_idstringyes–
note–––
reason–––
verdictstring––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_access_codes ~65

Owner only: every access code, newest first, with code_id, code_prefix, email, note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. Never the code itself. Free.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_access_requests ~89

Owner only: every access request, newest first, optionally only one status (pending, approved, rejected). Each has request_id, email, note, status, code_id, code_prefix, created_at and decided_at. Never a code. Needs the admin scope and an admin account (403 admin_required otherwise). Free.

NameTypeReqDescription
api_key–––
status–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_agents ~35

Your agents with their budgets and this month's spend. Free. Same as GET /v1/agents.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_alerts ~34

Your saved searches and their newest hits. Free. Same as GET /v1/alerts.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_calls ~56

Your calls of priced tools, newest first; tool ("titles", ...) narrows. Same as GET /v1/calls. Free.

NameTypeReqDescription
api_key–––
limitinteger––
tool–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_conversations ~135

Your chat conversations, most recently active first, limit 1 to 100 (default 30) per page: conversation_id, title, created_at, updated_at, language, country and messages (the count). Nullable language/country are the saved search picker settings. Returns {"conversations": [...], "next_cursor"}; pass next_cursor back as cursor for more. Same shape as GET /v1/conversations. Next step: get_conversation. Free.

NameTypeReqDescription
api_key–––
cursor–––
limitinteger–page size, 1 to 100
NameTypeReqDescription
resultstringyes–

No examples provided.

list_finds ~572

The index: every video your long and packaging runs found, across all runs, one entry a video on each tab (its newest read, with the keep or reject made on the video). Each is a full find object: the title and thumbnail_url as YouTube shows them, views, channel_median_views, outlier (views over the channel's usual) and outlier_score (0 to 100 on one fixed scale, so entries from different runs rank together), plus the analysis its run wrote. q (at most 120 characters) looks in the title, the channel, the hook as it was said, and what the thumbnail prints and shows, so a package can be found by its thumbnail ("red arrow", "before and after"). Returns {"finds", "count", "total" (every match, on any page), "next_cursor"}; pass next_cursor as cursor for the next page. Use it to search what you already paid for before starting a new run. Same as GET /v1/finds. Free. Errors: 422 for a kind, sort, tier, min_score, device or q that is not allowed. The bounds min_multiple to language (T3-FL) narrow the index on the server, as on GET /v1/finds; an entry that does not carry a bounded field is left out.

NameTypeReqDescription
api_key–––
cursor–––
device––only entries filed under this device: a hook_type, a title_device or one of the thumbnail_devices
kind––only "long" or only "packaging"; leave out for both
language–––
limitinteger–page size, 1 to 100
max_channel_median–––
max_comments–––
max_duration_s–––
max_multiple–––
max_views–––
min_channel_median–––
min_comments–––
min_duration_s–––
min_multiple–––
min_score––only entries with an outlier_score of at least this, 0 to 100
min_views–––
posted_within_days–––
q––words a title, channel, hook or thumbnail must hold
sortstring–"score" (default: the highest outlier score first), "outlier" (views over the channel's usual), "views" or "newest"
tier––only "breakout" (10 times the channel's usual or more), "strong" (5 to 10) or "outlier" (under 5)
NameTypeReqDescription
resultstringyes–

No examples provided.

list_folders ~148

Your folders, the most recently changed first, each with item_count, up to 4 cover thumbnails and its share link when shared. With hook_id or find_id, each folder also has contains: the item id when it holds that video (any run's copy), else null. Returns {"folders": [...], "count"}. Same as GET /v1/folders. Free.

NameTypeReqDescription
api_key–––
find_id––say which folders already hold this find's video
hook_id––say which folders already hold this hook
kind––only "short", "long" or "packaging"; leave out for every tab
NameTypeReqDescription
resultstringyes–

No examples provided.

list_formats ~107

Title formats of the last 90 days with their median multiple, share over 1.5x, adoption and examples, ordered by the Wilson lower bound of that share (computed_from). Formats with at least 8 measured videos from 3 channels (each shows measured beside videos); include_small lists down to 3 from 2. Free. Same as GET /v1/formats.

NameTypeReqDescription
api_key–––
include_smallboolean––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_jobs ~61

This account's background jobs, newest first (tracker refreshes, alerts, reviews, echo): status, attempts, credits, result or error. Free. Same as GET /v1/jobs.

NameTypeReqDescription
api_key–––
limitinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_keeps ~140

The hooks you kept with keep_hook, newest decision first, across all runs or within one run_id, limit 1 to 100 (default 100) per page. Returns {"kept": [...], "count": n on this page, "next_cursor"} with full hook objects; pass next_cursor back as cursor for more. Same shape as GET /v1/keeps. Free. Errors: 422 for a bad run_id or cursor.

NameTypeReqDescription
api_key–––
cursor–––
limitinteger–page size, 1 to 100
run_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_kept_finds ~172

The videos you kept with keep_find (long-form hooks and packages), newest decision first: one entry a video on each tab across all runs, or the kept finds of one run_id, limit 1 to 100 (default 100) per page. Returns {"kept": [...], "count": n on this page, "next_cursor"} with full find objects. Same shape as GET /v1/finds/keeps. Free. Errors: 422 for a bad kind, run_id or cursor.

NameTypeReqDescription
api_key–––
cursor–––
kind––only "long" or only "packaging"; leave out for both
limitinteger–page size, 1 to 100
run_id–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_keys ~113

Your API keys and what each may do. keys: key_id, name, prefix, created_at, last_used_at and current (true for the key making this call). access, per key_id: scopes, credit_limit, credits_used, expires_at and expired. scopes: the calling key's. The original signup key has key_id "original". The keys themselves are never shown again. Needs admin. Same shape as GET /v1/keys. Free.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_niches ~48

The niche explorer: every niche reported, with its headline numbers. Free. Same as GET /v1/niches.

NameTypeReqDescription
api_key–––
limitinteger––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_polls ~39

Your package votes, newest first, with their results so far. Free. Same as GET /v1/polls.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_presets ~57

Your saved filter presets, the newest change first; tab ("long", "packaging", "library") narrows. Same as GET /v1/presets. Free.

NameTypeReqDescription
api_key–––
tab–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_remixes ~139

The remixes you paid for from one hook (hook_id) or one find (find_id), newest first, each as its answer held it, with remix_id and created_at. Returns {"remixes": [...]}. Free. 404 hook_not_found or find_not_found for one that is not yours. Same as GET /v1/hooks/{hook_id}/remixes and GET /v1/finds/{find_id}/remixes.

NameTypeReqDescription
api_key–––
find_id––one of your finds; or give hook_id
hook_id––one of your hooks; or give find_id
NameTypeReqDescription
resultstringyes–

No examples provided.

list_research ~146

The research findings counted from Hook Detector's shared index of public YouTube data: openings (which openings sit before a steeper or flatter first minute of YouTube's "most replayed" heatmap, replay intensity, not retention), title-devices (which title devices go with higher multiples, by niche) and title-thumbnail-overlap (title and thumbnail word overlap against the multiple). Each page with n per run and how many claims reproduced on a second sample of other channels, did not, or had too few videos. No key needed; limited per address (429). Free. Same as GET /v1/findings.

Input schema present but exposes no named parameters.

NameTypeReqDescription
resultstringyes–

No examples provided.

list_runs ~214

Your research runs, newest first, without their results, limit 1 to 100 (default 20) per page. Each run says its kind: "short" (find_hooks), "long" (find_long_hooks) or "packaging" (find_packaging); pass kind to list only one. Returns {"runs": [...], "next_cursor"}: pass next_cursor back as cursor for the next page; it is null on the last. Same shape as GET /v1/runs. Next step: open one with get_run, or download it with export_run. Free. Errors: 422 invalid_cursor for a cursor this API did not issue, 422 for a kind that is not one of the three.

NameTypeReqDescription
api_key–––
cursor–––
kind––only runs of this kind: short, long or packaging; leave out for every kind
limitinteger–page size, 1 to 100
NameTypeReqDescription
resultstringyes–

No examples provided.

list_strategies ~145

The hook strategy library: every kind of long-form hook the shared index holds at least 3 openings of, with its plain name, count, the median multiple of those videos over their channels' usual views, the median hook length in seconds, the template most share, and up to 3 real examples (title, hook as said, video_id, channel, multiple). Counted from the index, never by a model; public data only. Free. Same as GET /v1/strategies.

NameTypeReqDescription
api_key–––
q––a subject: only openings of videos whose title or channel match its words
NameTypeReqDescription
resultstringyes–

No examples provided.

list_trackers ~45

Your trackers, or every public one. Free. Same as GET /v1/trackers.

NameTypeReqDescription
api_key–––
scopestring–mine or public
NameTypeReqDescription
resultstringyes–

No examples provided.

list_trends ~67

Rising words and phrases in the shared index's titles, this window against the one before, with counts and growth. Free. Same as GET /v1/trends.

NameTypeReqDescription
api_key–––
windowinteger–7, 30 or 90 days
NameTypeReqDescription
resultstringyes–

No examples provided.

list_webhooks ~37

Your webhooks with their events and state (never the secret). Same as GET /v1/webhooks.

NameTypeReqDescription
api_key–––
NameTypeReqDescription
resultstringyes–

No examples provided.

list_winners ~118

Real title and thumbnail changes on other channels: both versions (the pictures as URLs), views per hour before and 24 to 72 hours after, the lift and when the spike came. Free. Same as GET /v1/winners.

NameTypeReqDescription
api_key–––
cursor–––
limitinteger––
min_lift–––
min_views–––
min_vph_before–––
sortstring–recent or lift
type––title or thumbnail
NameTypeReqDescription
resultstringyes–

No examples provided.

make_thumbnails ~253

Make 2 to 12 thumbnails (default 4): 3 different concepts first, then images (Nano Banana 2.1, 1K or 4K), every printed word read back and checked letter by letter, a face only from your photos or your channel's own thumbnails. Answers at once with call_id and status pending; read it with get_thumbnails until done. 4 credits a delivered 1K image, 12 a 4K one, charged only for what is delivered. Same as POST /v1/thumbnails.

NameTypeReqDescription
api_key–––
background–––
channel–––
concept–––
count–––
faces–––
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–––
reference–––
run_id–––
size–––
sketch–––
titlestringyes–
topic–––
words–––
NameTypeReqDescription
resultstringyes–

No examples provided.

move_team_credits ~99

Move credits between your balance and the team's pool; 402 when the side giving holds less, and nothing moves. Owner only. Needs admin. Free. Same as POST /v1/team/credits.

NameTypeReqDescription
api_key–––
creditsintegeryes1 to 1,000,000
directionstringyes"in": your balance to the pool; "out": the pool back to you
NameTypeReqDescription
resultstringyes–

No examples provided.

next_poll ~82

A poll of another Hook Detector user waiting for your vote (not one you passed in skip): its options in an order of your own, no counts; poll null when none is waiting. Free. Same as GET /v1/polls/next.

NameTypeReqDescription
api_key–––
skip––poll ids to pass over in this ask
NameTypeReqDescription
resultstringyes–

No examples provided.

niche_report ~85

A niche report counted from the shared index: videos, channels, median views, the share at 10x and over, the 75th percentile multiple, top outliers and channels, by month. Free. Same as GET /v1/niches/{slug}.

NameTypeReqDescription
api_key–––
slugstringyeslowercase words joined by hyphens
NameTypeReqDescription
resultstringyes–

No examples provided.

optimize_video ~179

New packages (4, 8 or 12) for your published video: the original scored first against the real outliers on its subject, then each new package (title, thumbnail with every word checked, what it tests) scored the same way, best first, with vs_original. 10 credits a delivered package. Answers at once; read it with get_optimize. Same as POST /v1/optimize.

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
run_id–––
size–––
video_urlstringyes–
NameTypeReqDescription
resultstringyes–

No examples provided.

preview_package ~128

Your package in a mock YouTube feed among a run's winners: view home, search, sidebar, phone (marks where a phone cuts the title) or tv; theme dark or light; look normal, grey or blur. Returns png_base64 and mine_at. Free. Same as POST /v1/packaging/preview.

NameTypeReqDescription
api_key–––
look–––
run_id–––
seed–––
theme–––
thumbnail–––
titlestringyes–
topic–––
view–––
NameTypeReqDescription
resultstringyes–

No examples provided.

random_outliers ~110

Outliers at random from the shared index (5x their channel's usual and over by default), a different set each call. Free. Same as GET /v1/index/random.

NameTypeReqDescription
api_key–––
channel_size–––
content_type–––
language–––
limitinteger––
max_multiple–––
max_views–––
min_multiple–––
min_views–––
posted_within_days–––
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.