HookovaHookova
Free · MCP server

Hookova Free Video Sound Effects

About a thousand short sounds — the boom, the bruh, the metal pipe, the error chime, the censor beep — free, on plain URLs, and as six tools an AI agent can call. “Find me a sting for this cut and put it in ./sfx” becomes something you say, and the MP3 is on disk before you finish reading the reply.

No account, no token, no credits. 6 KB zip, needs Bun, v1.1.0.

982
sound effects, each on its own URL
321
of them three seconds or under — stings, not tracks
129 min
of audio in all, as MP3
5
tools: search, browse, get, download one, download many

Try it

Press one. The kebab-case string under each title is the sound’s id— the thing you’d say to the MCP server, and the last part of its URL. Search runs against the same route the server uses, so what you find here is what it finds.

982 sounds · a dozen to start
VINE BOOM SOUND
1.25s
BRUHHH
5.06s
Emotional Damage Meme
3.32s
Anime Wow
4.18s
Metal pipe clang
2.79s
Taco Bell Bong
1.91s
Windows 10 Error Sound
2.79s
ROBLOX oof
1s
Censor Beep 1
0.25s
SpongeBob Fail
3.38s
correct (ding)
2.95s
Discord Leaving
1.16s

This is the first dozen. Browse and search the whole library →

What it is

Three things, stacked. At the bottom, a folder of MP3s in object storage, each behind a permanent URL. On top of that, one search route over a catalog of their titles and lengths. And on top of that, an MCP server — a small program that runs on your machine and advertises six tools to whatever AI client you use, so the client can search the catalog and, the part a model can’t do on its own, write the file to disk.

In one line
A public sound library with a URL per sound, and a stdio MCP server whose one non-trivial tool is download_sound(id, dir).

Why it exists: Hookova is about the first three seconds of a short video, and an agent that builds those seconds — from a hook guide in HyperFrames, say — keeps arriving at the same gap. It has the cut, the text and the timing, and no sting for the cut. It can name the sound it wants; it has no way to get the bytes. This closes that gap without an account, because a sound effect is not the thing worth putting behind a sign-in.

It is deliberately small. No categories, no tags, no waveform previews — a title, a length, an id, a URL. Search is “every word must appear in the title,” ranked so an exact title wins, then a title that starts with your words, then one that contains them, shortest first. That is enough to find vine boom in one call, and it is honest about what the library is: a soundboard, catalogued.

The six tools

You never call these by name — you ask for a sound and the client picks. They are listed so you know what the server is allowed to do, which is the useful thing to know about anything you hand an assistant: it reads a public catalog, and it writes MP3s into a folder you name. Nothing else.

list_groups()

The sixteen kinds of sound in the library, what each means, and how many it holds.

impact, whoosh-transition, comedic-fail, meme-voice, notification-ui, alarm-siren, laugh-crowd, music-sting, game-retro, anime-cartoon, animal-nature, horror-tension, voice-line, bleep-censor, music-clip, other. Every clip was listened to by a model and filed under one; pick a group, then pass it to the two tools below.

search_sounds(query, group?, limit?, max_seconds?)

Keyword search, ranked. Every word has to match the title, a tag or the id.

Tags say what the clip IS as heard — boom, whoosh, laugh, siren, punchline — so search by the sound you need, not a meme name. Returns the id, the title, the group, the tags, a one-line description, the length in seconds and a direct MP3 URL for each hit. max_seconds keeps it to short stings — most of the library is under six seconds, a third of it under three.

list_sounds(group?, offset?, limit?)

Pages through the catalog, or one group of it, in title order.

For browsing, or when a search isn't finding it. Pass the returned nextOffset to keep going. Up to a hundred per page.

get_sound(id)

One sound's row: title, seconds, size, the MP3 URL and, when known, the page it came from.

Ids are the kebab-case strings on every card above — vine-boom, censor-beep-1. Anything shaped differently is refused before it goes anywhere.

download_sound(id, dir, filename?, overwrite?)

Fetches the MP3 and writes it into a folder on your machine, creating the folder if it has to.

Answers with the absolute path, which is what you hand to ffmpeg, HyperFrames or an editor. It won't overwrite a file that's already there unless told to. The filename is reduced to a bare name ending in .mp3, whatever is passed.

download_sounds(ids, dir, overwrite?)

The same for up to fifty ids at once, each saved as <id>.mp3.

One bad id doesn't stop the rest — the answer lists what landed and what didn't, and why.

Say the folder
“Download three boom options into ./sfx” gets you three files and three paths in one turn. Left to guess, a client will ask where — or pick its own working directory, which is rarely the project’s.

Set it up

Three steps, about two minutes, and the second is one line. You need Bun — the server is a TypeScript file run directly, with no build step. If the assistant you’re installing it for has a terminal, you can also paste this whole section at it and let it do the typing: with no token to hand over, there is nothing it has to stop and ask you for.

01

Unzip and install

Somewhere you intend to keep — the client runs the file from wherever it lands, so the Downloads folder is a bad choice.

unzip ~/Downloads/hookova-sfx-mcp.zip -d ~/hookova-sfx-mcp
cd ~/hookova-sfx-mcp
bun install

Four files in, two dependencies fetched (the MCP SDK and zod), nothing compiled, nothing left running.

02

Register it

In Claude Code, one command. Absolute path — the client may not expand ~.

claude mcp add hookova-sfx -- bun /Users/you/hookova-sfx-mcp/index.ts

That’s the whole registration. There is no --env because there is no token. Restart the client and /mcp lists hookova-sfx with its six tools.

03

Ask for a sound

In your own words. A good client turns each of these into a search and a download and answers with a path:

  • “Find me a vine boom and save it to ./sfx.”
  • “Give me five short error sounds, under two seconds, in assets/sfx.”
  • “What laugh tracks are in the Hookova library?”
  • “Download censor-beep-1 as bleep.mp3 next to the composition.”

The answer carries the absolute path and the length in seconds — the two facts the next command needs.

Other MCP clients

Every other client wants the same two facts in JSON: the command and its arguments. Put this in claude_desktop_config.json (Claude desktop app) or .cursor/mcp.json (Cursor); the same block works in most editor integrations.

{
  "mcpServers": {
    "hookova-sfx": {
      "command": "bun",
      "args": ["/Users/you/hookova-sfx-mcp/index.ts"]
    }
  }
}

If the client is a desktop app, give command an absolute path too — e.g. /opt/homebrew/bin/bun. A GUI application doesn’t inherit your shell’s PATH, which is the single most common reason a server registers fine and then shows no tools.

Putting it in a video

The tool ends at a path. What happens next depends on what’s building the video, and the two cases an agent is most often in are these.

In a HyperFrames composition

Download into the project’s asset folder and reference it like any other clip. A sting on the first cut is one element with a start time; the seconds in the answer is its natural duration.

<audio class="clip" src="sfx/vine-boom.mp3" data-start="0.4" data-duration="1.25"></audio>

With ffmpeg

Mix it over an existing cut at a time offset — here 0.4 seconds in, at three quarters volume, leaving the original audio in place.

ffmpeg -i cut.mp4 -i sfx/vine-boom.mp3 \
  -filter_complex "[1:a]adelay=400|400,volume=0.75[s];[0:a][s]amix=inputs=2:duration=first[a]" \
  -map 0:v -map "[a]" -c:v copy -shortest out.mp4

The hook guide tells an agent where the cuts are; this tells it what to put on them. The two servers are independent — install either without the other.

Without MCP: the URLs

The server is a convenience for assistants. A person, a script or a build step can use the two routes directly — both are plain GETs, no key, and cached for a long time.

# search — every word must match; limit up to 100, offset to page, max=<seconds>
curl -s 'https://www.hookova.com/api/sfx?q=vine+boom&limit=5' | jq '.sounds[] | {id, title, seconds}'

# the whole catalog, one JSON document
curl -s 'https://www.hookova.com/api/sfx?all=1' > sfx-catalog.json

# one sound's row
curl -s 'https://www.hookova.com/api/sfx/vine-boom?meta=1'

# the MP3 itself
curl -sL -o vine-boom.mp3 'https://www.hookova.com/api/sfx/vine-boom'

The URL of a sound never changes: www.hookova.com/api/sfx/<id>, served with an immutable cache header and byte-range support, so a browser <audio> tag or a HyperFrames preview can point straight at it. Add ?download=1 for an attachment disposition on a plain link.

Where the sounds come from

From public MyInstants sound-button pages, collected in one batch and catalogued — the title the uploader gave it, the length, and the source page where the batch could match one (it could for about nine in ten). They are user uploads, which means two things worth saying plainly.

  • This is not a licence.Many clips are a second of something else: a game, a show, a song, a stream. That is what makes them recognisable and what makes them unclearable. Fine for a meme cut, a rough edit or a private project; for anything a rights claim could reach, check the clip or use a sound whose origin you know. Nothing on this page says royalty-free, because it isn’t ours to say.
  • The catalog is unfiltered.Titles are in a dozen languages and some are crude. The search doesn’t editorialise. If a sound shouldn’t be here, or is yours and you’d rather it weren’t, tell us and it comes down.

Troubleshooting

The client starts but lists no tools.

The command couldn't run. Check that bun is on the PATH the client uses — a GUI app doesn't inherit your shell's PATH, so give it the absolute path, e.g. /opt/homebrew/bin/bun — and that the path to index.ts is absolute rather than ~-relative in JSON configs.

Cannot find package '@modelcontextprotocol/sdk'

bun install wasn't run in the unzipped folder, or was run somewhere else. cd into the folder that holds index.ts and run it there.

search_sounds finds nothing for a sound I know is famous.

Every word has to match something — the title, a tag, or the id. Try one word for what the sound is ("boom", not "vine boom sound effect"), or list_groups and then list_sounds inside the group it would be in. If it really isn't there, it isn't — the library is a thousand clips, not the whole internet.

download_sound says the file is already there.

It is, from an earlier call — the tool refuses to overwrite by default. Pass overwrite: true, or a different filename.

Frequently asked questions

Is it really free? Do I need a Hookova account?

Free, and no. The sounds sit on public URLs, the search route has no login, and the MCP server carries no token. Nothing here touches a credit or a daily allowance — the analyzer and the save library are separate products that happen to share a domain.

Where do the sounds come from, and can I use them in a published video?

They were collected from public MyInstants sound-button pages — user uploads, and each row keeps its source link where the batch could match one. Many are clips of something else: a game, a show, a song. Treat the library the way you'd treat any soundboard: fine for a meme cut or a rough edit, not a licence. If a video is going somewhere a rights claim would matter, check the clip, or use a sound you know the origin of. We take a sound down on request.

Do I need the MCP server, or can I just use the URLs?

Neither is required to listen: the library page at hookova.com/sound-effects searches and plays everything in the browser and hands out the MP3s. The URLs are enough for a person or a script: /api/sfx?q=boom searches, /api/sfx/<id> is the MP3, and both are plain GETs with no key. The server exists for an assistant, which can read a URL but can't put bytes on disk without a tool — download_sound is that tool. Everything else it does is a curl.

Which clients does it work with?

Anything that speaks MCP over stdio: Claude Code, the Claude desktop app, Cursor and most editor integrations. It is one TypeScript file run with Bun. There is no hosted version — it runs on your machine and calls the public routes.

How does it fit with the hook analyzer and the hook guide?

A hook guide gives HyperFrames the shape of an opening — timing, shot sizes, where the text lands. The sting on the first cut is the part the guide can't supply, and this is where it comes from: the same agent that built the opening asks for a boom, gets a path back, and places it. Nothing links the two by force; the server is useful on its own.

Can I add sounds, or request one?

Not from the page yet — the catalog is rebuilt by us from a folder. If a sound you'd expect is missing, say so through the contact page and it goes in the next rebuild.

Where does my data go?

Nowhere. The server sends the search term you typed and the id you asked for, and nothing else — there is no account to identify you and no token to carry. The MP3s stream from object storage through hookova.com like every other file on the site.

One line to register, and the boom is a sentence away.

Grab the zip, run the three commands, and the next time an edit needs a sting the agent building it can fetch one itself.