Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Build motion-graphics lessons with sentence-synced TTS for any subject: one sentence, one scene.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Download the maker’s .mcpb file
The link goes to the maker’s own file; we do not host or repackage it. Open the file and Claude Desktop installs it.
Run this in your terminal
Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 6, 2026
The registry name was verified with the GitHub account ghlee0786, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.1.0) reached the registry 14 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need MCPB on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, topo^alpin
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Avalanche bulletins and mountain weather forecasts for any place in the Alps.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
English · 한국어 · 日本語 · 简体中文
A learning system built on motion graphics and TTS. It works for any subject: math, science, English, biology, programming, and more. Write a lesson as JSON data and each sentence becomes one scene. The result is a single-file HTML textbook in which graphs, equations, sentence parts, 3D illustrations, and code move on screen the moment the voice starts reading the sentence they belong to. An AI uses MCP tools to write the textbook, check it, run its example code to verify the output, render 3D illustrations with Blender, record the narration, and build it. The bundled TTS (Supertonic) currently voices Korean and English, and the sample courses are in Korean.
Math · Translating a quadratic function The curve slides into its new position, and the changing part of the equation is highlighted
Science · A block on an incline On top of a Blender render, gravity splits into two components that grow out of it
English · Forming the passive voice Words move to new positions, and example sentences are read by an English voice
Biology · Structure of the animal cell Zooms into a 3D cross-section of the cell, pointing out organelles one by one
Programming · Lesson 7 (Arrays) of a 17-lesson C# syntax course — current-line highlighting, array cells filling in, an execution trace table, collapsible contents and script panels
say in a lesson is one scene. A scene bundles the script sentence, a large key phrase, and the visuals for that moment (graph, equation, sentence parts, image, code, variables…).timing.json.| Subject | Course | Scenes | Visuals used | What to look for | |
|---|---|---|---|---|---|
| Math | examples/math-quadratic | 13 | plot, math, tbl | A curve with the same name morphs between scenes, so the translation is visible | |
| Science | examples/physics-incline | 12 | img (3D render), math, bars, plot | Arrows grow toward force endpoints computed in 3D; zoom | |
| English | examples/english-passive | 12 | tokens, example-sentence panel, tbl, flow | Word chunks move to new positions; `{en | …}` segments use an English voice |
| Biology | examples/biology-cell | 13 | img (3D render), flow, cards | Organelle labels move around as the view zooms into the cell cross-section | |
| Programming | examples/csharp-grammar | 321 (17 lessons) | Code, variables, arrays, stack/queue/dictionary, console | All 48 examples are actually run and compared against the on-screen output |
The render_3d tool runs an AI-written Blender scene script headlessly and renders it with Cycles. When the script marks a 3D position with spot("name", (x, y, z)), the tool computes where that point lands in the perspective-projected image and saves it alongside the render. Lessons then refer to those names for labels, zoom centers, and arrows.
# Block on an incline — compute the endpoints of gravity and its two components as 3D vectors
th = math.radians(30) d = V3((math.cos(th), 0, -math.sin(th))) # down-slope direction n = V3((math.sin(th), 0, math.cos(th))) # normal to the incline spot("block", C) spot("g_tip", C + V3((0, 0, -2.6))) # gravity mg spot("par_tip", C + d * 2.6 * math.sin(th)) # mg sinθ spot("perp_tip", C - n * 2.6 * math.cos(th)) # mg cosθ
{"img": ["assets/incline.png", {
"spots": {"theta": {"label": "θ = 30°"}}, "arrows": [{"from": "block", "to": "g_tip", "label": "mg", "c": "bad"}, {"from": "block", "to": "par_tip", "label": "mg sinθ", "c": "g1"}], "zoom": 1.35, "focus": "block"}]}
Because the arrow tips are points computed in 3D, they line up exactly with the rendered incline. Scene scripts are kept in assets/src/, so they can be re-rendered at any time.
| Area | Contents |
|---|---|
| Left: Contents | Lessons and sections. Collapsible; clicking a section jumps to that scene |
| Center: Stage | Key phrase + left panel (code or example sentences, with the current line highlighted) + visuals. Always dark, regardless of theme |
| Right: Script | About 1/5 of the screen. Highlights the sentence being read; clicking a sentence plays from there. Collapsible |
| Bottom: Timeline | Progress bar divided by scene |
The top bar holds only lesson navigation, play, scene navigation, and playback speed (0.75×–2×). On phones, the contents and script panels become drawers that open over the stage.
When the scene changes, on-screen elements are matched by name (key) and animated. No animation needs to be specified separately: changing the data is enough to produce motion.
| Motion | When | Example |
|---|---|---|
| Slide | An element with the same name is in a different position | Array sorting, pointer i, words moving in the passive voice |
| Morph | The coordinates of a curve, point, or line with the same name change | Translating a parabola, changing its width |
| Fly in | A source cell is given with from | answer[(i + k) % n] = arr[i] |
| Grow | A new arrow appears | Resolving a force into components |
| Zoom / pan | An image's zoom or focus changes | Pointing out cell organelles |
| Blink · Scatter | Only the value changes · element disappears | Variable values, Pop |
{
"id": 1, "group": "수학", "title": "이차함수의 평행이동", "ops": [ {"op": "part", "title": "x축 방향으로 평행이동"}, {"op": "say", "head": "{m|y = (x - 2)^2} : 오른쪽으로 2", "text": "x 자리에 x 빼기 2를 넣으면 그래프 전체가 오른쪽으로 2만큼 미끄러집니다.", "board": {"seq": [ {"plot": [{"curves": [{"fn": "(x-2)**2", "c": "g1", "key": "p"}], "points": [{"x": 2, "y": 0, "label": "꼭짓점 (2, 0)", "key": "v"}]}]}, {"math": [["y = x^2", "y = (x - 2)^2"], {"hl": [1]}]}]}} ] }
The sample courses are narrated in Korean; {en|…} segments switch to an English voice.
The ops before a say build up the screen state, and the say captures that moment, together with its sentence, as a scene. The 22 ops, 24 widgets, and sentence markup ({m|equation}, {en|English}, [[written form|spoken form]]) are documented in the [authoring guide](docs/authoring.md) (in Korean). The MCP authoring_guide tool returns the same content.
sequenceDiagram
participant U as User participant AI as AI (Claude, etc.) participant M as Flow Learning System MCP participant F as Course folder U->>AI: "Make a lesson on cell organelles" AI->>M: authoring_guide AI->>M: course_init AI->>M: render_3d(cell scene script) M->>F: assets/cell.png + hotspot coordinates AI->>M: lesson_save(lesson JSON) M-->>AI: Validation results (missing hotspots, hard-to-read words …) AI->>M: speech_preview → pronunciation_add AI->>M: code_verify (subjects with code) AI->>M: audio_synthesize M->>F: audio/l01.mp3 + timing.json AI->>M: course_build M->>F: dist/index.html U->>F: Open with fls serve
What the checks catch:
17개 → 열일곱 개 (native Korean counting), 19.6 → 십구 점 육 (Sino-Korean "nineteen point six"), 8분의 1 → 팔분의 일 ("one eighth"), {en|…} → English voicegit clone https://github.com/ghlee0786/flow-learning-system.git
cd flow-learning-system pip install -e ".[tts]"
| Requirement | Used for | Without it |
|---|---|---|
| Python 3.10+ | Everything | — |
Supertonic ([tts]) | Korean and English speech synthesis. Downloads the model from Hugging Face on first run | The textbook runs without audio, using estimated timings |
| ffmpeg | Saving as mp3 | Saves as wav |
| Blender 3.6+ | render_3d | Only 3D illustrations are unavailable. If it is not on PATH, set FLS_BLENDER to the executable path |
| Mono or .NET SDK | Verifying C# examples | Only C# verification is skipped |
There is no need to keep the MCP server running. Register it once with your client, and the AI launches it on its own whenever it uses a tool (stdio).
Claude Code
claude mcp add flow-learning-system -- python -m flow_learning_system.server
Claude Desktop (claude_desktop_config.json)
{
"mcpServers": { "flow-learning-system": { "command": "python", "args": ["-m", "flow_learning_system.server"], "env": { "FLS_BLENDER": "C:\\Program Files\\Blender Foundation\\Blender 4.2\\blender.exe" } } } }
On Windows, if python points to a different environment, use the full path to python.exe in the virtual environment where you installed the package.
| Tool | What it does |
|---|---|
authoring_guide | Lesson format, widgets, motion rules, how to write sentences |
course_init / course_status | Create a new course / per-lesson scene count, issue count, and audio status |
lesson_get / lesson_save | Read a lesson / validate and save it (not saved if there are errors) |
lesson_validate | Validation |
render_3d | Blender scene script → image + hotspot coordinates |
assets_list | The course's images and their hotspot names and coordinates |
speech_preview | The exact sentences the TTS will read for each scene |
pronunciation_add | Register Hangul readings for English words |
code_verify | Check that example code output matches the on-screen console output |
audio_synthesize | Lesson audio and timing table (changed lessons only) |
course_build | dist/index.html + audio + images |
fls validate examples/biology-cell # validation
fls render examples/biology-cell --name cell --script scene.py # Blender render fls speech examples/english-passi
Only the beginning is shown; read the rest in the repo