Atlas / MCP servers / tonnooooo / kleo-mcp

kleo-mcpBLOCK

mcp/tonnooooo/kleo-mcp

Kleo: remote MCP server that turns a brief into a narrated 4K 60 fps film, realistic or animation, from Claude, ChatGPT, Cursor or any MCP client

Verdict
BLOCK
Grade
F
Trust score
49 /100
Exposed tools
15 13r · 2w · 0d
Transport
streamable-http
License
—
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Kleo is a remote Model Context Protocol server that renders YouTube videos and Shorts. A user connects one URL to Claude, ChatGPT, Grok, Claude Code, Cursor, VS Code, OpenCode or Gemini CLI, presses one button to get in (no email, no password, no invite code) and asks for a video in plain language. The render runs on a GPU machine rented for that job only (Vast.ai) with the Keou motion-design engine; the result comes back as signed download links (MP4, .srt subtitles, thumbnail) that last 7 days.

The server runs entirely on Cloudflare (Workers + KV + D1 + R2 + Workers AI + Cron), free plan. Production address: https://mcp.kleooai.com/mcp (Streamable HTTP, OAuth 2.1; the Worker itself answers at https://kleo-mcp.plural-juice.workers.dev/mcp). The public site (../kleo-site) reads that address from its config.json.

Models

Connect

One button signs you in (no email, no password); 7 credits arrive with the a

Read from source at commit 65c28093b05dOBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add keou-production --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env ANTHROPIC_AUTH=${ANTHROPIC_AUTH} --env CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN} --env CONTAINER_API_KEY=${CONTAINER_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "keou-production": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "ANTHROPIC_AUTH": "${ANTHROPIC_AUTH}",
        "CLOUDFLARE_API_TOKEN": "${CLOUDFLARE_API_TOKEN}",
        "CONTAINER_API_KEY": "${CONTAINER_API_KEY}"
      }
    }
  }
}
03

Exposed tools (15)

13 read · 2 write · 0 destructive.

ToolRiskDescription
KleoreadRemote MCP server that renders YouTube videos and Shorts.
Mararead
kleo_accountread
kleo_adapt_promptread
kleo_cancel_jobread
kleo_create_videowrite
kleo_generate_thumbnailread
kleo_get_jobread
kleo_get_resultread
kleo_list_templatesread
kleo_redeemread
kleo_storyboard_guideread
kleo_upload_linkwrite
kleo_wait_for_videoread
marareada photo of a woman with short blonde hair
04

Trust audit

BLOCKgrade F · trust 49/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (4 observation(s))
Network
declared (12 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/look-benchmark.mjs:47
return new Function(`return ${SRC.slice(from, to)}`)();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/sketch-extent.mjs:36
new Function("window", "document", "globalThis_", SRC.replace("const ART = {};", "const ART = {}; globalThis_.__ART = ART;"))(win, win.document, box);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
scripts/devbox.py:31
KEY = os.path.expanduser("~/.ssh/id_ed25519_keou")
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
scripts/devbox.py:212
onstart = ("mkdir -p /root/.ssh && echo %r >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys; "
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
worker/keou/settings.py:7
config={"ssh_key":"~/.ssh/id_ed25519_keou","protected_instance_ids":[]}
Why it matters. touches a credential store
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
scripts/devbox.py:20
~/.ssh ... urllib.request
Why it matters. reads secrets in the same file that sends data out
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/motion-demo/scarica.py:11
print("SCARICATO", snapshot_download(model, max_workers=8, token=os.environ.get("HF_TOKEN") or None, ignore_patterns=skip), flush=True)
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/auth-helper.py:125
log("helper up on http://127.0.0.1:8977")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/devrender.py:96
os.environ.setdefault("KLEO_API", "http://127.0.0.1:9")
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
src/assets.ts:2
export const TINY_MP4_B64 = "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAixbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAAA+gAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA
LOWInventory / provenance · inv.hidden_file · CWE-1104
worker/keou/examples/short-relay-cinema/.vast.lock
.vast.lock
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
worker/keou/examples/short-relay-cinema/layout-preview/.keou-layout-preview
.keou-layout-preview
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/engine-image-plan.test.mjs:25
const { backdropPlan, backdropSeed, BACKDROP_ZOOM } = new Function(pureBlock() + "\nreturn { backdropPlan, backdropSeed, BACKDROP_ZOOM };")();
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/engine-image-plan.test.mjs:162
new Function("document", "window", "Image", "fetch", "console", filmSource)(document, win, FakeImage, fetchStub, consoleStub);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
test/engine-picture.test.mjs:41
const P = new Function(pureBlock() + `
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/devrender.py:42
return len(data) == size and hashlib.sha1(b"blob %d\0" % len(data) + data).hexdigest() == blob
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/fidelity-bench/judge.mjs:141
const hash = createHash("sha1").update(`${judgeModel}\n${repeat}\n${judgeThinking}\n${prompt}`).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/fidelity-bench/stills.mjs:268
const key = createHash("sha1").update(judgeModel + judgeThinking + JUDGE_VERSION).update(JSON.stringify(qs)).update(bytes).digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/fidelity-bench/stills.mjs:285
const key = createHash("sha1").update(judgeModel + judgeThinking + JUDGE_VERSION).update(`identity ${g.text}`).update(a).update(b).digest("hex");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
worker/test_kleo_worker_images.py:454
sb["scenes"][0]["image"] = "../../etc/passwd"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
worker/test_kleo_worker_images.py:455
sb["scenes"][0]["shots"][0]["image"] = "../../etc/shadow"
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/growth.test.mjs:569
const beacon = await m.handleBeacon(new Request("http://kleo.test/b", { method: "POST", headers: { "content-type": "text/plain" }, body: "p=/&l=en" }), env);
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/growth.test.mjs:570
assert.equal(beacon.status, 204);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/refs.test.mjs:150
assert.throws(() => checkRefUrl("https://192.168.1.4/a.png"), RefError);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/refs.test.mjs:291
const inside = routes({ "https://a.example/q": redirectTo("https://127.0.0.1/x.jpg"), "https://127.0.0.1/x.jpg": imageAnswer(jpeg(43)) });

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 65c28093b05dfull audit observations/trust-audit/mcp-server/tonnooooo__kleo-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1165c28093b05dBLOCKF49first audit
06

Questions

What is the kleo-mcp MCP server?

Kleo: remote MCP server that turns a brief into a narrated 4K 60 fps film, realistic or animation, from Claude, ChatGPT, Cursor or any MCP client

What tools does kleo-mcp expose?

15 in total: 13 read-only, 2 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is kleo-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (49/100) and found 6 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does kleo-mcp need?

It reads ANTHROPIC_API_KEY, ANTHROPIC_AUTH, CLOUDFLARE_API_TOKEN, CONTAINER_API_KEY, HF_TOKEN, IMAGE_API_KEY, INTERNAL_SECRET, KIE_API_KEY, KLEO_SECRET and PLAN_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does kleo-mcp run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as keou-production at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (65c28093b05d), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement