Overview
Hooked’s MCP server lets AI apps (Claude, ChatGPT, Claude Code, Cursor, Windsurf, VS Code and any other client of the Model Context Protocol) make videos, images, clips and voices for your team, straight from the conversation. It is one URL:The quickest way is the Connect buttons on hooked.so/mcp or in Settings → Connected apps: they open each app with Hooked already filled in, or copy its config.
Connect
- Claude
- ChatGPT
- Claude Code
- Cursor
- Windsurf
- VS Code
- In Claude (web or desktop), open Settings → Connectors → Add custom connector.
- Name it
Hookedand pastehttps://api.hooked.so/v1/mcp. - Click Connect and sign in with your Hooked account.
With an API key instead
For scripts and agents that cannot open a browser, send an API key in thex-api-key header (or as Authorization: Bearer):
Approving tool calls
Clients ask before a tool spends credits or changes something, and let you say “always allow” per tool. The right setting is the same everywhere and follows what the tool does:The paid research tools are not marked read-only on purpose, so the client asks before they spend. What a saved search reads back (
list_social_searches, get_social_search) is free and counts as a read.- Claude (web and desktop): the first call offers Allow once / Always allow / Deny. Allow the reads; keep the writes and the
delete_*tools asking. - Claude Code: reads need no approval; pin the rest with
/permissions(or thepermissionsblock insettings.json, entriesmcp__hooked__<tool>). - Cursor: Settings → MCP lists Hooked’s tools; allow the reads and keep the rest on ask. Reads may not prompt at all.
- Windsurf: Cascade → MCP, the per-tool allow list; same rule.
- VS Code: the chat asks per tool (Copilot Chat tool settings); auto-approve only the reads.
- ChatGPT: there is no per-tool prompt — adding the app is the approval. Hooked still confirms the important steps in the conversation: before spending on something large, before publishing, and before deleting.
What it can do
The server has 76 tools. You never call them yourself: you ask in plain words and the AI picks them. It also hands the AI instructions on how to work with you: it replies in your language, asks before spending credits on something large, quotes the price first when you ask, and waits for the result instead of asking you to check.- In-chat previews. In apps that show MCP Apps (Claude, ChatGPT), the video or image appears in the chat with a progress bar while it is made, avatars and voices show as a picker, and a file from your device goes up through a picker too.
- Formats. The dashboard’s ~90 formats (Lego look, talking fruit, parkour gameplay, anime, Reddit stories…) are found with
search_formats: “make it in a Lego style” just works. - Slash commands.
/ugc,/slideshow,/brainrot,/faceless,/avatar,/cinematic,/music-video,/cloneand/stylestart the main kinds of video. - Your files. Images and clips you give it go into your media library first: pass a public
httpslink (works in any client), attach the file to the chat in ChatGPT, or — in an app that shows the widgets — ask to upload and pick a file from your device. From there they can be used in any video. - Research first. It can look at what is trending in a niche, search TikTok and YouTube, and analyze an account before writing your script or ad.
- Prices first. The create tools for script, prompt, talking avatar, UGC, slideshow, clone, Reddit story, quiz and podcast take
dryRun: true, which answers the exact credits without creating anything.
Video Creation
create_article_to_video, create_pdf_to_video and create_cinematic answer in a few seconds with the project in processing; the source is read (or the storyboard written) afterwards, and a failure there shows up as a failed project with the reason in message. Create tools are not idempotent: if one fails with a timeout, check list_projects (with source: "mcp") before calling it again.
Formats
Search
Resources
Media Library
An AI app cannot send a file’s bytes through a tool call, so in a plain client give a public
https link — a create tool’s photo field takes one directly, or import_media saves it to your library. In ChatGPT you can also attach the file to the chat. In an app that shows the widgets (Claude, ChatGPT) ask to upload and a picker appears: the file goes straight to storage and its id lands in the conversation. Otherwise, upload the file in the dashboard and ask the AI to find it with list_media.Projects and Videos
Research
The niche tools and the social search tools (
search_social_videos, list_social_searches, get_social_search) are part of HookTrend: they appear only for teams that have it. The paid research tools are not marked read-only, so the AI asks before using them. Credits are refunded when a read fails.
Publishing
The AI confirms the account, the time and the text with you before scheduling: a post goes out publicly.
Every tool returns the API’s JSON response, as text and as structured content. A create tool returns
{ "success": true, "data": { "projectId", "status" }, "message" }. The video is made in the background: get_project, get_video, get_media and get_avatar take waitSeconds (up to 45), so one call waits for it instead of the AI asking again and again.
list_avatars, list_voices and list_characters are paged like the API: each answer carries total, limit and offset, and the agent asks for the next page with offset until it has seen total items. list_music returns every track.
Example Conversations
Once connected, you can interact naturally: Create a video:“Make a 30-second video about productivity tips for remote workers, narrated by an energetic female voice.”Avatar ad:
“Have a young female avatar read this script as a UGC Studio app demo for my fitness app, showing https://myfitnessapp.com.”From a source:
“Turn this blog post into a 45-second vertical video: https://example.com/blog/remote-work-tips”Browse resources:
“What AI avatars do you have? Show me the female ones.”Check status:
“Is the video from that project ready? Give me the download link.”A format:
“Make a brainrot video over Minecraft parkour about the history of Rome.”Your product photo:
“Make a product-in-hand UGC ad for this serum: https://…/serum.jpg” (In an app that shows the widgets you can also say “let me upload the photo” and pick it from your device; in ChatGPT you can attach the photo to the chat instead of pasting the link.)Publish:
“Schedule it on my TikTok for tomorrow at 6 pm.”
Tool Details
create_script_to_video
search_formats answers these arguments ready for each format: a Lego-look video is mediaType: "ai-videos", preset: "lego", quality: "ultra".
create_talking_avatar
create_prompt_to_video
create_tiktok_slideshow
create_ugc_studio_video
CallsPOST /v1/project/create/ugc-studio/{format}. The format’s own fields go at the top level, next to format; see each format’s page under UGC Studio.
create_article_to_video, create_pdf_to_video
BYOK teams need a Firecrawl key for
create_article_to_video (it reads the page with it), not for create_pdf_to_video.
create_music_to_video
The video follows the lyrics: a song without vocals fails, with the credits refunded. The song is copied into your media library and counts toward your storage. BYOK teams need OpenRouter (and Gemini for the Omni Flash model); no ElevenLabs.
create_clone_video
create_reddit_story, create_quiz_video
create_reddit_story takes prompt (what the post is about), voiceId, and optionally platform (reddit, facebook, instagram), targetDuration (10-600 s), language, narrationScope (post_and_comments or comments_only), showCard, cardTheme and name. create_quiz_video takes questions (2 to 10 { question, options, correctIndex }, written in the language they are read in), voiceId, and optionally title, answerSeconds, revealSeconds, showOutro, outroText and name. Both take the same background: mediaType (gameplay by default, ai-images, ai-videos or media), preset, quality, aiModel, game, gameClip, media, plus aspectRatio, musicId, webhook and dryRun. See Reddit Story and Quiz Video.
create_podcast, create_hook_demo, create_scrolling_video, create_pdf_to_brainrot
See Podcast Interview, Hook Demo, Scrolling Video and PDF to Brainrot.
add_captions, extend_video, remove_video_background, expand_image, remove_image_background
add_captions, extend_video and remove_video_background create projects, followed with get_project. expand_image answers a new library image to follow with get_media. remove_image_background charges once: calling it again while it runs, or after it is done, is free and answers its state.
schedule_post
videoId (a rendered video: get_project → video.id, or list_videos), integrationId (from list_social_accounts), scheduledDateTime (ISO 8601 in UTC with Z, in the future) and platformData?: title, description, tags and privacyStatus for YouTube; title and privacyStatus for TikTok; caption for Instagram. Accounts are connected in the dashboard, not through the MCP server. See Schedule Video.
create_cinematic
Cinematic Studio: a short film with speaking characters from a story brief. The call answers in 1-2 minutes, because the storyboard is written first. Credits for the whole run are checked up front and charged in stages. Parameters:storyBrief (max 4,000 characters), durationSeconds (10-120), model (a video model, e.g. grok_imagine_video), and optionally storyTone, presetId, aspectRatio, language (en or es), characterIds (from list_characters), musicId, webhook. The accepted models, tones and styles come from list_catalog with name: "cinematic". See Cinematic Studio.
get_project, list_projects, get_video, list_videos
A project shows up in
list_videos only once its render has started. list_projects lists it as soon as it is created.
get_captions, edit_project, render_project
edit_project saves the changes to the project’s timeline as the dashboard editor does, and renders nothing: call render_project afterwards and follow the new videoId with get_video. A new caption style re-cuts the lines, so call get_captions again before correcting text. Anything else (clips, voice, script, timing, text layers) is edited in the dashboard. Refused (409) while the project is processing or one of its videos renders. See Edit Project and Get Project Captions.
delete_project, delete_video, delete_media
All three are irreversible. Each takes one id:projectId, videoId or mediaId.
A pending scheduled post comes back in
data.scheduleIds; cancel it in the dashboard or with Cancel Scheduled Post first. See Delete Project, Delete Video and Delete Media.
create_character, update_character, delete_character
create_character takes name and optionally description, voiceProfile, presetId and one photo source: mediaId (a COMPLETED library image), imageUrl (imported after the answer) or generatePortrait: true (a portrait from the description, charged one image: 4 credits with the default imageModel, given back if it fails). With imageUrl or generatePortrait the character comes back with imageStatus: "PROCESSING"; it is ready when list_characters shows it COMPLETED. update_character takes characterId and only the fields to change (null clears description or voiceProfile; mediaId: null removes the photo). delete_character is irreversible and never refused: Cinematic projects that cast the character keep their own copy. See Create Character, Update Character and Delete Character.
list_media, get_media, import_media, upload_media, generate_image, generate_video
import_media, generate_image and generate_video answer { mediaId, status: "PROCESSING" } at once. A create tool refuses a media that is not COMPLETED yet, so the agent polls get_media first. upload_media is driven by the widget end to end: it asks create_media_upload for a presigned URL, PUTs the file to storage, then calls complete_media_upload; the widget writes the new id into the conversation for the agent to use. The generate tools cost what the dashboard’s Media Generator costs (usedCredits in the answer) and give the credits back when the generation fails; the video-models catalog says what each video model takes (durations, resolutions, ratios, start and end frames, references, sound). See Generate Image and Generate Video.
Credits and Your Own Keys
Videos made through the MCP server cost the same as in the dashboard. Teams on bring-your-own-keys need their own provider keys in Settings → AI keys; when one is missing, the create tools fail with a 402missing_credentials error listing the providers to add.
Create tools are not idempotent. If one times out there is no projectId to check, so look with list_projects (newest first, source: "mcp"; a project is listed as soon as it is created) before trying again, or you may get (and pay for) the same video twice. Projects made through the MCP server carry an AI badge in the dashboard.
Troubleshooting
The sign-in page does not open, or the app says it cannot connect
The sign-in page does not open, or the app says it cannot connect
Check the URL is exactly
https://api.hooked.so/v1/mcp. In Claude Code run /mcp and choose Authenticate; in ChatGPT, make sure Developer mode is on and the app uses OAuth.It worked and now asks to sign in again
It worked and now asks to sign in again
The app was disconnected in Settings → Connected apps, or its sign-in expired after a long time unused. Connect it again: nothing else is lost.
The tools do not appear in the app
The tools do not appear in the app
Restart the app after adding the config, and in ChatGPT pick Hooked from the tools menu of the chat. Viewers of a team cannot create content.
402 missing_credentials
402 missing_credentials
Your team brings its own provider keys and one is missing: add it in Settings → AI keys. The error lists which.
Next Steps
Skill File
Download the Hooked skill for Cursor and Claude
Webhooks
Receive notifications when videos are ready