MCP server: prompt → Meshy.ai 3D → Blender turntable → YouTube video. Sibling of meshy-bottube-mcp (agents); YouTube for human reach.
meshy-youtube-mcp
An MCP server that takes a text prompt all the way to a published YouTube video: Meshy.ai 3D generation → Blender turntable → YouTube upload.
prompt ──▶ Meshy text-to-3D ──▶ Blender 360° turntable ──▶ ffmpeg ──▶ YouTube videos.insert
(.glb model) (PNG frames) (.mp4) (published video)
Any MCP-capable agent — Claude, or anything that speaks MCP — can call it to generate rotating 3D content and publish it straight to YouTube.
Sibling project:
meshy-bottube-mcppublishes the same pipeline to BoTTube (a video network for AI agents). BoTTube is the agent-native channel; YouTube is the human-reach channel — same Meshy generation, two audiences. Pick the publisher that fits who's watching.
The shared render core is proven end-to-end on the BoTTube edition:
a PBR-textured turntable and an
animated walking character (the
render_animation moving-clip path).
Tools
| Tool | Input | Output |
|------|-------|--------|
| generate_3d_model | prompt, art_style | .glb + task ids (preview→refine, PBR textured) |
| generate_3d_from_image | image (URL/path) | .glb from a single image |
| generate_3d_from_images | 1–4 images | .glb from multiple reference images |
| retexture_model | model + style | re-textured .glb variant |
| rig_model · animate_model | model / rig+action_id | rigged / animated .glb |
| get_meshy_task_status | task_id | status / .glb on success |
| render_turntable · frames_to_video | .glb / frames | PNG frames / .mp4 |
| upload_to_youtube | .mp4, title | video_id, watch_url (OAuth) |
| meshy_to_youtube | prompt | one-shot: text → 3D → turntable → published |
| image_to_youtube | image | one-shot: image → 3D → turntable → published |
| retexture_to_youtube | model + style | one-shot: re-texture → turntable → published |
| animate_to_youtube | model, action_id | one-shot: rig → animate → render motion → published |
Requirements
- Python 3.10+
ffmpegand Blender onPATH- A Meshy.ai API key
- A Google account + a YouTube OAuth client (one-time setup, below)
Install
git clone https://github.com/Scottcjn/meshy-youtube-mcp
cd meshy-youtube-mcp
pip install -r requirements.txt
cp .env.example .env # add your MESHY_API_KEY
One-time YouTube authorization
YouTube uploads use OAuth2 (not a simple API key). Set it up once:
- Google Cloud Console → create/select a project
- Enable YouTube Data API v3
- Credentials → Create OAuth client ID → Desktop app → download the JSON
- Save it as
~/.config/meshy-youtube-mcp/client_secret.json(or setYOUTUBE_CLIENT_SECRET_FILE) - Authorize once — opens a browser, mints a reusable token:
python -m meshy_youtube.authorize
After that, uploads run unattended via the stored refresh token. You only re-authorize if the token is revoked or deleted.
Quota: YouTube's default free quota is 10,000 units/day and a
videos.insertcosts 1,600 — about 6 uploads/day. Request more in the Cloud Console if you need it.
Run as an MCP server
{
"mcpServers": {
"meshy-youtube": {
"command": "python3",
"args": ["/path/to/meshy-youtube-mcp/meshy_youtube/server.py"],
"env": {
"MESHY_API_KEY": "your_meshy_key",
"YOUTUBE_TOKEN_FILE": "/home/you/.config/meshy-youtube-mcp/token.json"
}
}
}
}
Then ask your agent: "Generate a 3D crystal dragon and publish it to YouTube as
an unlisted turntable." It calls meshy_to_youtube and hands back a watch URL.
You can also pip install -e . and run meshy-youtube-mcp, or
python -m meshy_youtube.server.
Use as a library
from meshy_youtube import meshy, turntable, video, youtube
info = meshy.generate("a steampunk robot", "model.glb", art_style="realistic")
tt = turntable.render(info["glb_path"], "frames/", resolution=1080)
mp4 = video.frames_to_video(tt["frames_dir"], "turntable.mp4")
res = youtube.upload(mp4, title="Steampunk Robot — 3D Turntable",
tags=["3d", "meshy"], privacy="unlisted")
print(res["watch_url"])
Privacy & categories
privacy:public|unlisted|private(default unlisted — shareable by link, not surfaced publicly until you choose to).category_id: YouTube category. Defaults to22(People & Blogs). Common ones:1Film & Animation,20Gaming,23Comedy,24Entertainment,28Science & Technology.
Behavior notes
- The one-shot
meshy_to_youtubealways returns a dict (ok+watch_url, orok=False+error/failed_stage+ partial paths). Granular tools raise. - Secrets (
client_secret.json,token.json,.env) are gitignored and the token is written0600. Never commit them. - The Meshy/Blender/ffmpeg stages are shared, hardened code from the BoTTube edition (two-stage preview→refine, atomic GLB download, subprocess isolation, numeric frame normalization, bounds + preflight).
Roadmap
v0.1–v0.2 (shipped): two-stage Meshy generation, PBR texturing controls
(texture_prompt/enable_pbr), Blender turntable, YouTube OAuth publish
(resumable upload, atomic 0600 token, COPPA madeForKids as an explicit
choice), resilient polling, 21 tests.
v0.3 (shipped): the full Meshy modality set — image-to-3D, multi-image-to-3D, retexture, and rigging + animation (rig a humanoid, apply a motion from Meshy's 500+ action library, and render the moving character via a dedicated Blender animation-render path).
Note: Meshy's 3D-to-Video is a web-app feature with no public API, so it can't be an MCP tool. The rig→animate→render chain delivers the same outcome.
Next: multi-model scenes (camera moves, staging), smarter per-style framing.
Tests
python -m unittest discover -s tests -v
License
MIT © 2026 Scott Boudreaux / Elyan Labs.