Hook Detector
REMOTE · API.HOOKDETECTOR.COM
Real TikTok and Instagram hooks that already work, in any language, with why each travelled.
Available components
Last scanned (2 hours ago)
Scores higher than 64% of remote servers
Reachable. Last reached 11 Nov 2026.
Category Marketing and SEO
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
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
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
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 →
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
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 |
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 →
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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_url | string | yes | – |
| words | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| request_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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…
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| mode | string|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… |
| n | integer | – | 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_brief | string|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… |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| mode | string|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 |
| n | integer | – | 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) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
remove_from_tracker ~58
Take a channel off one of your trackers. Same as DELETE /v1/trackers/{tracker_id}/channels/{ref}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| ref | string | yes | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| member_id | string | yes | a member_id from get_team, or "me" to leave |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| string | yes | – | |
| note | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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:// |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| code_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| key_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| invite_id | string | yes | from get_team invites |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | – |
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| filters | object|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… |
| name | string | yes | – |
| tab | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | integer | – | – |
| q | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| channel_size | – | – | small, medium or large |
| content_type | – | – | long or short |
| cursor | – | – | – |
| language | – | – | – |
| limit | integer | – | – |
| 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) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| member_id | string | yes | a member_id from get_team |
| monthly_cap | – | yes | 1 to 1,000,000 credits a UTC month, or null for no cap |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| folder_id | – | – | one of your folders (from list_folders or create_folder) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| run_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| n | integer | – | how many; clamped to 1 to 24 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | integer | – | – |
| ref | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| kind | string | – | only echo today |
| message | – | – | – |
| seconds | integer | – | 1 to 120 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| webhook_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
tracker_alerts ~66
Your tracker alerts, newest first, with the unread count. Free. Same as GET /v1/trackers/alerts.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | integer | – | – |
| mark_read | boolean | – | – |
| unread_only | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
tracker_feed ~83
A tracker's channels' uploads, strongest first. Free. Same as GET /v1/trackers/{tracker_id}/feed.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| days | integer | – | – |
| limit | integer | – | – |
| sort | string | – | multiple, vph or recent |
| token | – | – | – |
| tracker_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| folder_id | – | – | one of your folders (from list_folders or create_folder) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_agent ~63
Change an agent's name or monthly budget, or pause it. Same as PATCH /v1/agents/{agent_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| active | – | – | – |
| agent_id | string | yes | – |
| api_key | – | – | – |
| monthly_budget | – | – | – |
| name | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
update_alert ~85
Change a saved search: its words, line, frequency or email. Same as PATCH /v1/alerts/{alert_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | – |
| api_key | – | – | – |
| daily_ideas | – | – | – |
| – | – | – | |
| frequency | – | – | – |
| min_multiple | – | – | – |
| min_vph | – | – | – |
| query | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_email | – | – | – |
| api_key | – | – | – |
| daily_ideas | – | – | – |
| multiple_threshold | – | – | – |
| name | – | – | – |
| tracker_id | string | yes | – |
| visibility | – | – | – |
| vph_threshold | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| ids | array | yes | 1 to 50 YouTube video ids |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| video_id | string | yes | an 11-character YouTube id |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| video_id | string | yes | an 11-character YouTube id |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| token | string | yes | the hdt_... token, the part of the link after # |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| poll_id | string | yes | the poll's id |
| reason | – | – | optional: why, at most 140 characters |
| slot | integer | yes | the slot you picked in next_poll's answer |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| api_key | – | – | – |
| limit | integer | – | – |
| webhook_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
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
claude mcp add --transport http com-hookdetector-hookdetector 'https://api.hookdetector.com/mcp'
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.