manim-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -0
- package/dist/demo.mp4 +0 -0
- package/dist/index.js +65 -0
- package/dist/mcp-app.html +142 -0
- package/dist/server.js +1492 -0
- package/package.json +67 -0
- package/references/composer/SKILL.md +154 -0
- package/references/composer/references/3b1b-series-patterns.md +217 -0
- package/references/composer/references/domain-planning-guides/calculus-planning.md +188 -0
- package/references/composer/references/domain-planning-guides/linear-algebra-planning.md +169 -0
- package/references/composer/references/domain-planning-guides/ml-planning.md +286 -0
- package/references/composer/references/domain-planning-guides/number-theory-planning.md +187 -0
- package/references/composer/references/domain-planning-guides/physics-planning.md +249 -0
- package/references/composer/references/domain-planning-guides/probability-planning.md +200 -0
- package/references/composer/references/mathematical-storytelling.md +359 -0
- package/references/composer/references/narrative-patterns.md +221 -0
- package/references/composer/references/opening-patterns.md +284 -0
- package/references/composer/references/pacing-guide.md +289 -0
- package/references/composer/references/scene-archetypes.md +534 -0
- package/references/composer/references/scene-examples.md +379 -0
- package/references/composer/references/visual-techniques.md +480 -0
- package/references/composer/templates/scenes-template.md +147 -0
- package/references/manimce/SKILL.md +166 -0
- package/references/manimce/examples/3d_visualization.py +373 -0
- package/references/manimce/examples/basic_animations.py +212 -0
- package/references/manimce/examples/graph_plotting.py +401 -0
- package/references/manimce/examples/lorenz_attractor.py +172 -0
- package/references/manimce/examples/math_visualization.py +315 -0
- package/references/manimce/examples/updater_patterns.py +369 -0
- package/references/manimce/rules/3b1b-translation.md +594 -0
- package/references/manimce/rules/3d.md +254 -0
- package/references/manimce/rules/advanced-animations.md +594 -0
- package/references/manimce/rules/animation-groups.md +212 -0
- package/references/manimce/rules/animations.md +128 -0
- package/references/manimce/rules/api-pitfalls.md +89 -0
- package/references/manimce/rules/axes.md +214 -0
- package/references/manimce/rules/camera.md +208 -0
- package/references/manimce/rules/cli.md +232 -0
- package/references/manimce/rules/color-conventions.md +444 -0
- package/references/manimce/rules/colors.md +199 -0
- package/references/manimce/rules/config.md +264 -0
- package/references/manimce/rules/creation-animations.md +158 -0
- package/references/manimce/rules/graphing.md +233 -0
- package/references/manimce/rules/grouping.md +220 -0
- package/references/manimce/rules/latex.md +202 -0
- package/references/manimce/rules/lines.md +241 -0
- package/references/manimce/rules/long-form-video.md +552 -0
- package/references/manimce/rules/mathematical-domains.md +689 -0
- package/references/manimce/rules/mobjects.md +116 -0
- package/references/manimce/rules/multi-scene-composition.md +112 -0
- package/references/manimce/rules/pedagogy.md +532 -0
- package/references/manimce/rules/physics-simulations.md +610 -0
- package/references/manimce/rules/positioning.md +211 -0
- package/references/manimce/rules/scenes.md +121 -0
- package/references/manimce/rules/shapes.md +300 -0
- package/references/manimce/rules/styling.md +177 -0
- package/references/manimce/rules/text-animations.md +222 -0
- package/references/manimce/rules/text.md +189 -0
- package/references/manimce/rules/timing.md +227 -0
- package/references/manimce/rules/transform-animations.md +157 -0
- package/references/manimce/rules/updaters.md +226 -0
- package/references/manimce/templates/basic_scene.py +64 -0
- package/references/manimce/templates/camera_scene.py +100 -0
- package/references/manimce/templates/threed_scene.py +138 -0
package/README.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# manim-mcp
|
|
2
|
+
|
|
3
|
+
MCP server that generates 3Blue1Brown-style math animation videos with [Manim](https://www.manim.community/) directly inside Claude. Videos render with AI-narrated voiceover and play inline in the chat.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### 1. Add to Claude Desktop
|
|
8
|
+
|
|
9
|
+
Open **Settings > Developer > Edit Config** and add:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"manim": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "manim-mcp@latest", "--stdio"]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Restart Claude Desktop
|
|
23
|
+
|
|
24
|
+
That's it. Ask Claude to "create a video explaining the Pythagorean theorem" and watch it render.
|
|
25
|
+
|
|
26
|
+
**First run** takes ~2 minutes to auto-install Python dependencies, TTS models, and LaTeX. Subsequent runs are fast.
|
|
27
|
+
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
- **Multi-scene video generation** with parallel rendering and scene-level caching
|
|
31
|
+
- **AI voiceover narration** synced to animations (Kokoro TTS, runs 100% locally)
|
|
32
|
+
- **20+ language support** — English, Chinese, Japanese, Spanish, French, Hindi, and more
|
|
33
|
+
- **Built-in video player** renders inline in Claude Desktop
|
|
34
|
+
- **Comprehensive Manim reference library** produces high-quality 3b1b-style animations
|
|
35
|
+
- **Speculative TTS pre-synthesis** — voiceovers are generated while scenes render
|
|
36
|
+
- **Auto-fixes** common Manim code mistakes before rendering
|
|
37
|
+
|
|
38
|
+
## How it Works
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
You: "create a video on eigenvalues"
|
|
42
|
+
|
|
43
|
+
Claude:
|
|
44
|
+
1. Loads Manim reference guidelines (get_manim_reference)
|
|
45
|
+
2. Plans 2-4 scenes with narration scripts
|
|
46
|
+
3. Writes Manim Python code for each scene
|
|
47
|
+
4. Calls render_video with all scenes
|
|
48
|
+
-> TTS pre-synthesizes all voiceovers
|
|
49
|
+
-> scenes render in parallel
|
|
50
|
+
-> concatenated into one video
|
|
51
|
+
5. Inline video player appears in chat
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Requirements
|
|
55
|
+
|
|
56
|
+
- **Node.js 18+** — for running the MCP server
|
|
57
|
+
- **Python 3.12+** — for Manim rendering (auto-installed into `~/.manim-mcp/.venv`)
|
|
58
|
+
- **ffmpeg** — for video concatenation (`brew install ffmpeg` on macOS)
|
|
59
|
+
|
|
60
|
+
Everything else (Manim, voiceover, TTS models, LaTeX) is automatically installed on first run.
|
|
61
|
+
|
|
62
|
+
### Optional: Premium Voice
|
|
63
|
+
|
|
64
|
+
For premium multi-language voiceover via ElevenLabs, add your API key:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"manim": {
|
|
70
|
+
"command": "npx",
|
|
71
|
+
"args": ["-y", "manim-mcp@latest", "--stdio"],
|
|
72
|
+
"env": {
|
|
73
|
+
"ELEVEN_API_KEY": "sk_your_key_here",
|
|
74
|
+
"PREFER_ELEVENLABS": "1"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Language Support
|
|
82
|
+
|
|
83
|
+
| Engine | Languages | Notes |
|
|
84
|
+
|--------|-----------|-------|
|
|
85
|
+
| Kokoro (default) | English, Chinese, Japanese, Spanish, French, Hindi, Italian, Portuguese | Local, fast, free |
|
|
86
|
+
| Piper | German, Russian, Dutch, Polish, Czech, Turkish, Arabic, Hungarian | Local, free |
|
|
87
|
+
| ElevenLabs | All languages | Requires API key |
|
|
88
|
+
|
|
89
|
+
## Development
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git clone https://github.com/zcsabbagh/manim-mcp.git
|
|
93
|
+
cd manim-mcp
|
|
94
|
+
npm install
|
|
95
|
+
npm run build
|
|
96
|
+
|
|
97
|
+
# Point Claude Desktop at local build:
|
|
98
|
+
# "command": "node",
|
|
99
|
+
# "args": ["/path/to/manim-mcp/dist/index.js", "--stdio"]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## License
|
|
103
|
+
|
|
104
|
+
MIT
|
package/dist/demo.mp4
ADDED
|
Binary file
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// main.ts
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { createMcpExpressApp } from "@modelcontextprotocol/sdk/server/express.js";
|
|
6
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
7
|
+
import cors from "cors";
|
|
8
|
+
import { createServer } from "./server.js";
|
|
9
|
+
async function startStreamableHTTPServer(createServerFn) {
|
|
10
|
+
const port = parseInt(process.env.PORT ?? "3001", 10);
|
|
11
|
+
const app = createMcpExpressApp({ host: "0.0.0.0" });
|
|
12
|
+
app.use(cors());
|
|
13
|
+
app.all("/mcp", async (req, res) => {
|
|
14
|
+
const server = createServerFn();
|
|
15
|
+
const transport = new StreamableHTTPServerTransport({
|
|
16
|
+
sessionIdGenerator: void 0
|
|
17
|
+
});
|
|
18
|
+
res.on("close", () => {
|
|
19
|
+
transport.close().catch(() => {
|
|
20
|
+
});
|
|
21
|
+
server.close().catch(() => {
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
await server.connect(transport);
|
|
26
|
+
await transport.handleRequest(req, res, req.body);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error("MCP error:", error);
|
|
29
|
+
if (!res.headersSent) {
|
|
30
|
+
res.status(500).json({
|
|
31
|
+
jsonrpc: "2.0",
|
|
32
|
+
error: { code: -32603, message: "Internal server error" },
|
|
33
|
+
id: null
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const httpServer = app.listen(port, () => {
|
|
39
|
+
console.log(`Manim MCP server listening on http://localhost:${port}/mcp`);
|
|
40
|
+
});
|
|
41
|
+
const shutdown = () => {
|
|
42
|
+
console.log("\nShutting down...");
|
|
43
|
+
httpServer.close(() => process.exit(0));
|
|
44
|
+
};
|
|
45
|
+
process.on("SIGINT", shutdown);
|
|
46
|
+
process.on("SIGTERM", shutdown);
|
|
47
|
+
}
|
|
48
|
+
async function startStdioServer(createServerFn) {
|
|
49
|
+
await createServerFn().connect(new StdioServerTransport());
|
|
50
|
+
}
|
|
51
|
+
async function main() {
|
|
52
|
+
if (process.argv.includes("--stdio")) {
|
|
53
|
+
await startStdioServer(createServer);
|
|
54
|
+
} else {
|
|
55
|
+
await startStreamableHTTPServer(createServer);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
main().catch((e) => {
|
|
59
|
+
console.error(e);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
});
|
|
62
|
+
export {
|
|
63
|
+
startStdioServer,
|
|
64
|
+
startStreamableHTTPServer
|
|
65
|
+
};
|