jshookmcp
Reverse-engineering workbench for web pages, JavaScript bundles, WASM, native processes and APKs
Frame-accurate video and storyboard review for coding agents, plus style and playbook presets
By Moritz Kremb (individual) TypeScript Local · stdio, Streamable HTTP MediaDeveloper tools
50 popularity score ★ 69 ↓ 321/wk
Opens the app, which asks before it adds the server.
claude mcp add --transport http framejam http://localhost:2400/mcp{
"mcpServers": {
"framejam": {
"url": "http://localhost:2400/mcp"
}
}
}{
"servers": {
"framejam": {
"type": "http",
"url": "http://localhost:2400/mcp"
}
}
}[mcp_servers.framejam]
url = "http://localhost:2400/mcp"gemini mcp add --scope user --transport http framejam http://localhost:2400/mcpOpens the app, which asks before it adds the server.
claude mcp add framejam -- npx -y framejam --stdio{
"mcpServers": {
"framejam": {
"command": "npx",
"args": [
"-y",
"framejam",
"--stdio"
]
}
}
}{
"mcpServers": {
"framejam": {
"command": "npx",
"args": [
"-y",
"framejam",
"--stdio"
]
}
}
}{
"servers": {
"framejam": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"framejam",
"--stdio"
]
}
}
}[mcp_servers.framejam]
command = "npx"
args = ["-y", "framejam", "--stdio"]gemini mcp add --scope user framejam npx -- -y framejam --stdioOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/moritzkremb/framejam.git
cd framejam
npm install
npm run buildclaude mcp add framejam -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js' --stdio{
"mcpServers": {
"framejam": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js",
"--stdio"
]
}
}
}{
"mcpServers": {
"framejam": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js",
"--stdio"
]
}
}
}{
"servers": {
"framejam": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js",
"--stdio"
]
}
}
}[mcp_servers.framejam]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js", "--stdio"]gemini mcp add --scope user framejam node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/server/cli.js' --stdioFRAMEJAM_PORT |
Optional: Port for the review page and HTTP MCP endpoint (also --port). FRAMEJAM_HOST sets the address. |
|---|---|
FRAMEJAM_HOME |
Optional: Data folder for projects and custom presets (also --data-dir). |
FRAMEJAM_CATALOG_URL |
Optional: Where style and playbook updates come from. off turns them off. |
FRAMEJAM_NO_UPDATE_CHECK |
Optional: Set to stop the npm version check and the catalog updates. |
FrameJam gives a person and a coding agent a shared place to review a video the agent is making. The agent renders an mp4 with whatever the project already uses (Hyperframes, Remotion, ffmpeg) and calls `open_review`. That opens a local page with the player, a filmstrip and a comment box. You pause, click a spot in the frame or drag over part of the timeline, type a note, and press Finish review when the round is done. The agent gets every comment back with its time, its position and a JPEG of the frame with your pin drawn on it, then makes its edits and sends the next render through `add_version`. Old rounds keep a copy of their video. Storyboards work the same way, with still panels instead of a video.
For videos with speech the agent can now pass `transcriptPath` (an .srt, .vtt or word-timings JSON) to either tool. The words then sit under the timeline and you can comment on a phrase. Without one, the page can transcribe on your machine if whisper.cpp is installed.
The agent can also read visual styles and playbooks before building. A playbook describes how one kind of video gets made, like a lyric video or a math explainer. A picker page lets you choose them by clicking. Since this release the styles and playbooks also update from a signed catalog on framejam.ai, checked at start and every 6 hours, so new ones can arrive without a new npm version.
It all runs as one Node process and keeps projects as JSON in `~/.framejam`. The npm package is mostly an installer for plugins in Claude Code, ChatGPT and Cursor. Other clients run `npx -y framejam --stdio`, and the same process serves MCP over HTTP at `http://localhost:2400/mcp`.
From the source, beyond the README: `open_review` also takes `playbookId` and `styleId` so later versions keep the chosen look. Both wait tools accept `timeoutSeconds` up to 300. Every setting is also read under the old `FRAMECUT_` prefix. And the catalog stays off in a source checkout unless `FRAMEJAM_CATALOG_URL` is set.
| Runtime | Node.js 22+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
The installer (`npx -y framejam install`) sets up plugins for Claude Code, the ChatGPT desktop app (Work and Codex) and Cursor. Any other client can use the stdio command. ChatGPT chat-mode connectors need the HTTP server (`npm start` from a clone) and, where an https address is required, a tunnel plus `FRAMEJAM_PUBLIC_URL`. Local transcription needs whisper.cpp (`brew install whisper-cpp` on macOS) and downloads a 574 MB model from Hugging Face the first time unless one is already present.
It reviews renders only; the agent makes and edits the video with another tool. The README's v1 limitations: only one process hosts the web page per port (other stdio instances reuse it through the shared data folder; if the host exits, one must be restarted), and the page is not yet embedded as an MCP App. `wait_for_feedback` returns pending after about 50 seconds by default; after 12 pending results in a row the agent is told to stop and the user must ask it to apply the feedback later. Desktop apps started from the Dock may not find `npx`; the docs say to use its full path. The npm package leaves out preview videos and streams them from framejam.ai.
Suits developers who already have an agent building videos in code (Hyperframes, Remotion, ffmpeg scripts) and would rather point at a frame than describe timestamps in chat. It is local, needs no account and keeps videos on the machine, which fits private footage. It writes only to its own data folder. Look elsewhere if you need the server to render or cut video itself, or a hosted review page other people can open: in the release on npm the page is served on localhost, bound to 127.0.0.1 unless --host is given.
9 only read, 5 change things. A ? marks an optional parameter.
open_review changestitle?: stringvideoPath?: stringpanels?: arraypanelsDir?: stringtranscriptPath?: stringreviewId?: stringnote?: stringplaybookId?: stringstyleId?: stringwait_for_feedbackreviewId: stringtimeoutSeconds?: numberget_feedback changesreviewId?: stringinclude?: enumlist_reviewsadd_version changesreviewId: stringvideoPath?: stringpanels?: arraypanelsDir?: stringtranscriptPath?: stringnote?: stringresolve_comments changesreviewId: stringids: arraynote?: stringlist_presetsmood?: stringpacing?: enumformat?: enumquery?: stringget_presetid: stringincludeTemplate?: booleanlist_playbooksquery?: stringget_playbookid: stringstyleId?: stringopen_picker changeskinds?: arraytitle?: stringwait_for_pickpickId: stringtimeoutSeconds?: numberget_selected_presetget_selected_playbook