{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_8vhyeme6maxu","handle":"hook-detector","url":"https://wellknown.network/agents/hook-detector","links":{"self":"https://wellknown.network/agents/hook-detector/record.json","html":"https://wellknown.network/agents/hook-detector","markdown":"https://wellknown.network/agents/hook-detector/record.md","api":"https://wellknown.network/api/v1/agents/hook-detector","status":"https://wellknown.network/api/v1/agents/hook-detector/status","claim":"https://wellknown.network/agents/hook-detector/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/hook-detector/claim.json","badge":"https://wellknown.network/agents/hook-detector/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/hook-detector/history","tools":"https://wellknown.network/api/v1/agents/hook-detector/tools"},"ard":{"identifier":"urn:air:api.hookdetector.com:server:hook-detector","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Hook Detector","summary":"Real TikTok and Instagram hooks that already work, in any language, with why each travelled.","description":"Real TikTok and Instagram hooks that already work, in any language, with why each travelled.","publisher":{"name":"com.hookdetector","url":null},"homepage":"https://hookdetector.com","repository":null,"version":"2.4.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://api.hookdetector.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-09-25T08:41:24.277252Z","publishedAt":"2026-09-25T08:41:24.277252Z","registryName":"com.hookdetector/hookdetector"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"content.social","name":"Social Media","confidence":1,"provenance":"derived"},{"slug":"documents.spreadsheets","name":"Spreadsheets","confidence":1,"provenance":"derived"},{"slug":"communication.chat","name":"Team Chat","confidence":0.977,"provenance":"derived"},{"slug":"dev.package-management","name":"Packages & Dependencies","confidence":0.51,"provenance":"derived"}],"categories":["communication","content","dev","documents"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 4h ago.","lastOkAt":"2026-10-09T22:28:10.972Z","lastProbedAt":"2026-10-09T22:28:10.972Z","statusComputedAt":"2026-10-09T22:29:05.485Z","reliability30d":{"probes":54,"successRate":1,"p50Ms":101,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":54,"ok":54,"authBoundaryOk":0,"serviceOk":54,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-09T22:28:10.972Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"ba0c5e6021241d9df3107e6d33fb68dc1e26335e3f8b4ff61cbb6b75addf8010","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T15:33:49.113Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":123,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"ba0c5e6021241d9df3107e6d33fb68dc1e26335e3f8b4ff61cbb6b75addf8010","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T09:26:58.751Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":105,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"ba0c5e6021241d9df3107e6d33fb68dc1e26335e3f8b4ff61cbb6b75addf8010","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T03:23:59.797Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"ba0c5e6021241d9df3107e6d33fb68dc1e26335e3f8b4ff61cbb6b75addf8010","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T21:23:09.753Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"b6fb20cfd453980de44a3214721a8329ba61dab58f6ac2deab1d9d02d00c0706","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T15:24:16.668Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":97,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":43,"toolsHash":"b6fb20cfd453980de44a3214721a8329ba61dab58f6ac2deab1d9d02d00c0706","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T09:22:43.229Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":96,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: every message in order (role, content, run_id, created_at)\n    and every run it holds, with their hooks, plus nullable language and count"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":41,"toolsHash":"a797de192d549594ce4d29b05d787d691ab9a597ef038893213e751bb66fd793","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T02:22:33.002Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":95,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: every message in order (role, content, run_id, created_at)\n    and every run it holds, with their hooks, plus nullable language and count"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":41,"toolsHash":"a797de192d549594ce4d29b05d787d691ab9a597ef038893213e751bb66fd793","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-07T20:31:35.077Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":95,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their hooks, limit 1 to 100 (default 20)\n    per page. Returns {\"runs\": [...], \"next_cursor\"}: pass next_cursor back a"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: every message in order (role, content, run_id, created_at)\n    and every run it holds, with their hooks, plus nullable language and count"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":33,"toolsHash":"d8357723458aa811901420667dd88963d8cbcded690ce369acfece833acece50","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-10-07T14:30:49.771Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":102,"error":null,"detail":{"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their hooks, limit 1 to 100 (default 20)\n    per page. Returns {\"runs\": [...], \"next_cursor\"}: pass next_cursor back a"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: every message in order (role, content, run_id, created_at)\n    and every run it holds, with their hooks, plus nullable language and count"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"toolCount":33,"toolsHash":"d8357723458aa811901420667dd88963d8cbcded690ce369acfece833acece50","serverName":"hookdetector","capabilities":["prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}}],"tools":[{"name":"create_account","description":"Create an account and get an API key with free credits. Needs a beta access code\n    (access_code, HD-XXXX-XXXX; case and dashes do not matter): without one the"},{"name":"showcase","description":"Real hooks this service has delivered, for a wait screen: talking heads only, each\n    hook_id, still_url (a JPEG, no key needed), platform, creator, views and "},{"name":"find_hooks","description":"Start hook research on a topic across TikTok, Instagram and YouTube Shorts (Shorts\n    only, never long-form YouTube; platform \"youtube\").\n\n    What it does: se"},{"name":"get_run","description":"A research run: its status, progress, charge and every hook it produced.\n\n    wait_seconds 0 to 50: wait up to that long for the run to finish, returning the\n  "},{"name":"list_runs","description":"Your research runs, newest first, without their results, limit 1 to 100 (default 20)\n    per page. Each run says its kind: \"short\" (find_hooks), \"long\" (find_lo"},{"name":"find_long_hooks","description":"Find long-form hooks: how the YouTube videos that beat their own channel open, on a\n    topic. Long-form YouTube only, never Shorts, TikTok or Instagram (for th"},{"name":"find_packaging","description":"Find packaging: the titles and thumbnails that earned the click on a topic, from\n    long-form YouTube videos that beat their own channel.\n\n    What it does: ru"},{"name":"get_find","description":"One result of a long or packaging run with every field: the video, its numbers and\n    the opening or the package analysis. find_id comes from a run's finds (ge"},{"name":"keep_find","description":"Keep or reject a find (a long-form hook or a package): verdict is \"keep\" (default)\n    or \"reject\", and the last verdict wins. The verdict is the video's on tha"},{"name":"clear_find_decision","description":"Undo keep_find: the video goes back to having no verdict, on every find of it, and\n    leaves list_kept_finds.\n    Returns {\"find_id\", \"verdict\": null}. Clearin"},{"name":"list_finds","description":"The index: every video your long and packaging runs found, across all runs, one\n    entry a video on each tab (its newest read, with the keep or reject made on "},{"name":"remix_find","description":"Make it mine, for a long-form opening or a package: write up to n (1 to 5, default\n    3) new ones for your niche that keep one real find's structure. From a lo"},{"name":"list_remixes","description":"The remixes you paid for from one hook (hook_id) or one find (find_id), newest\n    first, each as its answer held it, with remix_id and created_at. Returns {\"re"},{"name":"get_remix","description":"One remix you paid for (from remix_hook, remix_find or a chat turn), as its answer\n    held it. Free. 404 remix_not_found for one that is not yours. Same as GET"},{"name":"list_kept_finds","description":"The videos you kept with keep_find (long-form hooks and packages), newest decision\n    first: one entry a video on each tab across all runs, or the kept finds o"},{"name":"export_run","description":"A finished run's hooks as a file a creator can open: format \"csv\" (default; one row\n    per hook, opens in any spreadsheet, formula-like cells defused with a le"},{"name":"get_hook","description":"One hook with every field: its opening line, transcript, watch_url and the\n    vertical player_url (null only for an unusable id or a photo post found before\n  "},{"name":"embed_hook","description":"Official TikTok or Instagram embed HTML for a hook, so the clip plays inside your\n    own page. kind is \"embed\", or \"fallback\" when the creator disabled embeddi"},{"name":"keep_hook","description":"Keep or reject a hook: verdict is \"keep\" (default) or \"reject\", and the last\n    verdict wins. Kept hooks come back from list_keeps, across all runs. Free."},{"name":"clear_decision","description":"Undo keep_hook: the hook goes back to having no verdict, so it leaves list_keeps and\n    its export row carries none. Returns {\"hook_id\", \"verdict\": null}. Clea"},{"name":"remix_hook","description":"Make it mine: write up to n new opening lines (1 to 5, default 3) for your niche\n    that keep a real hook's structure, the device that made it travel, with the"},{"name":"list_keeps","description":"The hooks you kept with keep_hook, newest decision first, across all runs or within\n    one run_id, limit 1 to 100 (default 100) per page. Returns {\"kept\": [..."},{"name":"balance","description":"Your account and remaining credits right now: account_id, credits, key_prefix and\n    key_id of the key making this call, label, created_at, and that key's scop"},{"name":"delete_account","description":"Erase your account and everything in it, for good: every API key, run, hook, keep\n    or reject decision, conversation and message. Unspent credits go with it. "},{"name":"chat","description":"One conversational turn, for an agent relaying a person's words. It either asks\n    ONE clarifying question (action \"clarify\"), answers about delivered hooks or"},{"name":"list_conversations","description":"Your chat conversations, most recently active first, limit 1 to 100 (default 30)\n    per page: conversation_id, title, created_at, updated_at, language, country"},{"name":"get_conversation","description":"One chat conversation: its newest messages in order (role, content, run_id,\n    created_at), a page of `limit`, with earlier_cursor for the older ones (null whe"},{"name":"usage","description":"Your credits and what you have spent: credits (balance now), spent_total,\n    reserved_now (credits held by runs still in flight, refunded in part when they\n   "},{"name":"list_keys","description":"Your API keys and what each may do. keys: key_id, name, prefix, created_at,\n    last_used_at and current (true for the key making this call). access, per key_id"},{"name":"create_key","description":"Create another API key on your account, for example one per agent or machine, so\n    you can revoke one without touching the others. name is up to 60 characters"},{"name":"revoke_key","description":"Revoke one of your API keys at once: key_id from list_keys, or \"original\" for the\n    signup key. Any key may revoke itself (the result says so, and that key st"},{"name":"request_access","description":"Ask for the beta access code a new account needs (create_account's access_code).\n    email is where the code is sent; note is optional (who you are, up to 500\n "},{"name":"list_access_requests","description":"Owner only: every access request, newest first, optionally only one status\n    (pending, approved, rejected). Each has request_id, email, note, status, code_id,"},{"name":"approve_access_request","description":"Owner only: approve an access request. Makes a one-use code, marks the request\n    approved and emails the code. The code is in this result once, with emailed t"},{"name":"reject_access_request","description":"Owner only: reject a pending access request. Nothing is emailed. An approved or\n    rejected request is 409 request_already_decided. Free."},{"name":"list_access_codes","description":"Owner only: every access code, newest first, with code_id, code_prefix, email,\n    note, source, max_uses, uses, expires_at, revoked_at, created_at and usable. "},{"name":"create_access_code","description":"Owner only: make an access code to hand out. max_uses 1 to 100000 (default 1),\n    expires_in_days 1 to 365 (optional), note your own. email binds it to one per"},{"name":"revoke_access_code","description":"Owner only: revoke an access code (code_id from list_access_codes). It admits\n    nobody from now on; accounts it already made keep working. 404 access_code_not"},{"name":"admin_overview","description":"Owner only: the whole service at a glance, as GET /v1/admin/overview. Counts of\n    accounts and people; runs (total, last_24h, last_7d, failed_24h, in_flight);"},{"name":"admin_list_accounts","description":"Owner only: every account, newest first, as GET /v1/admin/accounts: {total,\n    accounts: [{id, email, name, label, credits, created_at, last_seen_at, runs, hoo"},{"name":"admin_adjust_credits","description":"Owner only: add or remove an account's credits, as POST\n    /v1/admin/accounts/{account_id}/credits. A change that would take the balance below\n    zero is 422 "},{"name":"admin_list_runs","description":"Owner only: every account's research runs, newest first, as GET /v1/admin/runs:\n    {runs: [{run_id, account_id, email, topic, language, country, status, reques"},{"name":"admin_list_actions","description":"Owner only: the audit of password sign-ins and credit changes, newest first, as GET\n    /v1/admin/actions: {actions: [{id, action, actor_email, target_account_i"}],"package":null,"toolSurface":{"id":"ts_gj5dj7nusnp2","endpointId":"ep_fxk6fum63vpv","hash":"ba0c5e6021241d9df3107e6d33fb68dc1e26335e3f8b4ff61cbb6b75addf8010","toolCount":43,"serverName":"hookdetector","serverVersion":"","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-09T03:23:59.807Z","lastSeenAt":"2026-10-09T22:28:10.988Z","observations":4,"toolNames":["create_account","showcase","find_hooks","get_run","list_runs","find_long_hooks","find_packaging","get_find","keep_find","clear_find_decision","list_finds","remix_find","list_remixes","get_remix","list_kept_finds","export_run","get_hook","embed_hook","keep_hook","clear_decision","remix_hook","list_keeps","balance","delete_account","chat","list_conversations","get_conversation","usage","list_keys","create_key","revoke_key","request_access","list_access_requests","approve_access_request","reject_access_request","list_access_codes","create_access_code","revoke_access_code","admin_overview","admin_list_accounts","admin_adjust_credits","admin_list_runs","admin_list_actions"],"distinctSurfaces":14},"endpointFacts":[{"id":"ep_fxk6fum63vpv","url":"https://api.hookdetector.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-08T09:22:43.316Z","auth":{"observedAt":"2026-10-08T09:22:43.410Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-08T09:22:43.417Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"api.hookdetector.com","issuer":{"commonName":"YR2","organization":"Let's Encrypt"},"validFrom":"2026-09-22T09:19:59.000Z","validTo":"2026-12-21T09:19:58.000Z","daysToExpiry":72,"sanCount":1,"fingerprint256":"4A:61:C1:6F:F3:EB:B7:56:00:6F:E7:B0:A0:3D:D6:93:79:C8:97:3E:34:2F:42:CA:E0:77:CE:B0:78:5E:E3:37"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.hookdetector/hookdetector","url":"https://registry.modelcontextprotocol.io/v0/servers/com.hookdetector%2Fhookdetector","firstSeenAt":"2026-09-25T10:19:51.399Z","fetchedAt":"2026-10-09T07:21:05.202Z","normalizedAt":"2026-10-09T07:21:05.202Z"}]},"firstSeenAt":"2026-09-25T10:19:51.399Z","updatedAt":"2026-10-09T22:30:11.822Z"}