Flow Learning System

Registre officiel Autres

Build motion-graphics lessons with sentence-synced TTS for any subject: one sentence, one scene.

Installation

Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).

MCPB package https://github.com/ghlee0786/flow-learning-system/releases/download/v0.1.0/flow-learning-system-0.1.0.mcpb

Documentation

Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.

Sommaire
  1. Flow Learning System
  2. Core idea: one sentence = one scene
  3. Example courses
  4. Adding 3D illustrations with Blender
  5. Screen layout
  6. Motion rules
  7. Anatomy of a lesson
  8. Workflow
  9. Installation
  10. Registering the MCP server
  11. Command line
  12. Folder structure
  13. License

Flow Learning System

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


Core idea: one sentence = one scene

  • Each 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…).
  • Narration is synthesized sentence by sentence and concatenated, and the start time of each sentence is recorded in timing.json.
  • The player reads the audio's current playback position every frame and picks the scene from it. Changing the playback speed or jumping to the middle never puts the picture and the voice out of sync.

Example courses

SubjectCourseScenesVisuals usedWhat to look for
Mathexamples/math-quadratic13plot, math, tblA curve with the same name morphs between scenes, so the translation is visible
Scienceexamples/physics-incline12img (3D render), math, bars, plotArrows grow toward force endpoints computed in 3D; zoom
Englishexamples/english-passive12tokens, example-sentence panel, tbl, flowWord chunks move to new positions; `{en…}` segments use an English voice
Biologyexamples/biology-cell13img (3D render), flow, cardsOrganelle labels move around as the view zooms into the cell cross-section
Programmingexamples/csharp-grammar321 (17 lessons)Code, variables, arrays, stack/queue/dictionary, consoleAll 48 examples are actually run and compared against the on-screen output

Adding 3D illustrations with Blender

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.

Screen layout

AreaContents
Left: ContentsLessons and sections. Collapsible; clicking a section jumps to that scene
Center: StageKey phrase + left panel (code or example sentences, with the current line highlighted) + visuals. Always dark, regardless of theme
Right: ScriptAbout 1/5 of the screen. Highlights the sentence being read; clicking a sentence plays from there. Collapsible
Bottom: TimelineProgress 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.

Motion rules

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.

MotionWhenExample
SlideAn element with the same name is in a different positionArray sorting, pointer i, words moving in the passive voice
MorphThe coordinates of a curve, point, or line with the same name changeTranslating a parabola, changing its width
Fly inA source cell is given with fromanswer[(i + k) % n] = arr[i]
GrowA new arrow appearsResolving a force into components
Zoom / panAn image's zoom or focus changesPointing out cell organelles
Blink · ScatterOnly the value changes · element disappearsVariable values, Pop

Anatomy of a lesson

{
  "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 (in Korean). The MCP authoring_guide tool returns the same content.

Workflow

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:

  • Validation: unknown ops or widgets, hotspots that don't exist in the image, scenes that try to highlight lines not in the code, English words the TTS can't read
  • Code verification: actually compiles and runs each example and compares it character by character with the on-screen console output (C#: Mono or .NET SDK; Python)
  • Reading preview: 17개 → 열일곱 개 (native Korean counting), 19.6 → 십구 점 육 (Sino-Korean "nineteen point six"), 8분의 1 → 팔분의 일 ("one eighth"), {en|…} → English voice

Installation

git clone https://github.com/ghlee0786/flow-learning-system.git
cd flow-learning-system
pip install -e ".[tts]"
RequirementUsed forWithout it
Python 3.10+Everything—
Supertonic ([tts])Korean and English speech synthesis. Downloads the model from Hugging Face on first runThe textbook runs without audio, using estimated timings
ffmpegSaving as mp3Saves as wav
Blender 3.6+render_3dOnly 3D illustrations are unavailable. If it is not on PATH, set FLS_BLENDER to the executable path
Mono or .NET SDKVerifying C# examplesOnly C# verification is skipped

Registering the MCP server

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.

Tools (13)
ToolWhat it does
authoring_guideLesson format, widgets, motion rules, how to write sentences
course_init / course_statusCreate a new course / per-lesson scene count, issue count, and audio status
lesson_get / lesson_saveRead a lesson / validate and save it (not saved if there are errors)
lesson_validateValidation
render_3dBlender scene script → image + hotspot coordinates
assets_listThe course's images and their hotspot names and coordinates
speech_previewThe exact sentences the TTS will read for each scene
pronunciation_addRegister Hangul readings for English words
code_verifyCheck that example code output matches the on-screen console output
audio_synthesizeLesson audio and timing table (changed lessons only)
course_builddist/index.html + audio + images

Command line

fls validate examples/biology-cell              # validation
fls render   examples/biology-cell --name cell --script scene.py   # Blender render
fls speech   examples/english-passive --lesson 1   # TTS reading preview
fls verify   examples/csharp-grammar            # run and verify example code
fls audio    examples/math-quadratic            # speech synthesis
fls build    examples/math-quadratic            # dist/index.html
fls serve    examples/math-quadratic            # open locally (also from phones on the same Wi-Fi)
fls all      examples/physics-incline           # validate → verify → audio → build

A built textbook consists only of index.html plus the audio/ and assets/ folders, so it works without a server. It can be uploaded as-is to static hosting such as GitHub Pages. Audio files are not included in the repository. Generate them with fls audio <course>.

Folder structure

src/flow_learning_system/
  server.py      MCP server (13 tools)
  cli.py         fls command
  lesson.py      Lesson ops interpretation · validation (same rules as the player)
  speech.py      Script → TTS sentences (code-term readings, Korean number reading, English segments)
  tts.py         Supertonic synthesis · per-sentence timing · cache
  render.py      Blender rendering · hotspot projection
  verify.py      Example code execution (C#: Mono/.NET, Python)
  build.py       Single-file HTML build
  guide.md       Lesson authoring guide
  player/        Player (core.js equations/graphics, lesson.js scene builder/widgets, interp.js JSON interpretation, app.js playback/sync/motion)
examples/                  Math · science · English · biology · C# example courses (3D scene scripts in assets/src/)
docs/                      Authoring guide, README figures
tools/                     README figure generators, legacy JS lesson converter
tests/                     pytest

License

MIT. The Supertonic Python package used for speech synthesis is MIT-licensed and its model is under the OpenRAIL license; neither is included in this repository (the model is downloaded on first run).

Questions fréquentes

Qu'est-ce que Flow Learning System ?

Build motion-graphics lessons with sentence-synced TTS for any subject: one sentence, one scene.

Comment installer Flow Learning System ?

Suivez les étapes d'installation de sa documentation, affichée sur cette page et dans son dépôt.

Faut-il une clé API pour Flow Learning System ?

Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.

Flow Learning System est-il open source ?

Oui. Son code est sur GitHub sous licence MIT.

Qui maintient Flow Learning System ?

Il est publié par ghlee0786. AI.tn le référence sans le maintenir ni le recommander.

Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.