Skip to main content
Glama

Flow Learning System

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.


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.

Related MCP server: manim-mcp

Example courses

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

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

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

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.

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.

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

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]"

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

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)

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

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).

Available Tools

13 tools
assets_listB

코스의 이미지와 각 이미지의 핫스폿 이름·좌표(0~1)를 보여 줍니다.

NameRequiredDescriptionDefault
course_dirYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose the returned payload shape (image list with hotspot names and normalized coordinates), which is useful since there is no output schema. However, it says nothing about read-only semantics, permissions, pagination, or behavior when a course has no images.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence with the resource front-loaded and no filler. It is appropriately sized for a simple list operation, though it leaves obvious gaps that brevity does not excuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The return content is reasonably covered for a tool with no output schema, but the required input parameter is undocumented in both schema and description, and no annotations supply safety or prerequisite context. An agent can guess 'course_dir' from the name, but the definition stops short of being self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single required parameter 'course_dir' has no title annotation or description. The description never mentions the parameter at all, so its meaning (a directory path? a course identifier?) is left entirely to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and verb — it returns the course's images along with each image's hotspot name and coordinates. The '(0~1)' note further pins down that coordinates are normalized, so an agent knows exactly what data comes back. It does not explicitly contrast with any sibling, but the asset/hotspot domain is distinct from the audio, lesson, and build tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus alternatives, no prerequisite (e.g. that the course must exist or be initialized), and no exclusion. The agent must infer usage purely from the one-line purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audio_synthesizeA

Supertonic TTS로 레슨 음성(audio/lNN.mp3)과 문장별 시각표(timing.json)를 만듭니다. 바뀌지 않은 레슨은 건너뜁니다. 레슨이 많으면 lesson_id를 하나씩 주어 나눠 실행하세요.

NameRequiredDescriptionDefault
forceNo
voiceNo
lesson_idNo
course_dirYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It usefully discloses incremental behavior (skipping unchanged lessons) and an implied runtime/long-run risk for large batches, but never states that existing mp3/timing files are overwritten, how 'force' interacts with the skip logic, or what happens on TTS failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with what is produced, followed by skip behavior and batching advice. No filler; every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description does compensate by naming the exact output artifacts. However, for a 4-parameter mutation tool with zero annotation and zero schema coverage, the undefined force/voice semantics and overwrite behavior leave meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only explains lesson_id (batch one at a time) and hints at course_dir via lesson paths; 'force' and 'voice' are entirely undocumented anywhere, leaving half the parameters opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: synthesizes lesson audio (audio/lNN.mp3) and per-sentence timing (timing.json) via Supertonic TTS. It is clearly distinguishable from speech_preview as a batch lesson-level operation, though it never names the sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operational guidance: unchanged lessons are skipped, and when there are many lessons, pass lesson_id one at a time and run in batches. It does not say when to prefer speech_preview or lesson_validate instead, so no explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

authoring_guideA

레슨 JSON 형식(op, 장면 옵션, 위젯), 모션 규칙, TTS 문장 쓰는 법을 담은 가이드. 레슨을 쓰기 전에 읽으세요.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden, but for a zero-parameter reference read the burden is low and "읽으세요" (read) communicates that this is a non-mutating retrieval. It does not state whether content is static, versioned, or cached, which would be the remaining useful detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first front-loads what the guide contains, the second states when to use it. Nothing is duplicated or wasted, and the ordering matches how an agent should reason about the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless documentation tool with an output schema, the description covers both the content scope and the invocation timing, which is nearly everything needed. The only omitted context is whether the guide is authoritative/current or how it relates to lesson_validate rules.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies. An output schema exists, so return-value semantics are handled structurally rather than in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource (a guide) and enumerates its exact contents: lesson JSON format including op, scene options and widgets, motion rules, and TTS sentence authoring. No sibling tool in the list overlaps with this documentation role, so an agent can distinguish it from lesson_save, lesson_validate, or speech_preview without opening anything.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"레슨을 쓰기 전에 읽으세요" gives an explicit trigger condition (read before authoring a lesson), which is the key routing decision for a reference tool. It does not name exclusion cases or point to alternative tools once the guide has been consumed, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

code_verifyC

코드 블록을 실제로 컴파일·실행해 화면 콘솔 출력(out/write)과 같은지 확인합니다. C#은 mono 또는 dotnet, Python은 python.

NameRequiredDescriptionDefault
lesson_idNo
course_dirYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry behavioral disclosure. It does disclose the key trait that the code is actually executed (a real side effect, not a static check) and pins the runtime per language, which an agent needs. It says nothing about sandboxing, timeouts, permissions, or what happens on compile failure versus mismatch, which are significant gaps for arbitrary code execution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler, and the core action is front-loaded before the runtime detail. Nothing is wasted, though the brevity comes partly at the cost of the missing content noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a code-execution tool with no annotations, no output schema, and zero parameter documentation. The description should at minimum state what a result looks like (pass/fail, diff, exit code) and what course_dir anchors, since none of that exists in structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so neither course_dir nor lesson_id is documented anywhere. The description never references either parameter, so it fully fails to compensate for the coverage gap; only the optional/required split is inferable from the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb+resource: it compiles and executes a code block and compares the console output (out/write) against expected output. This is far more than restating the name 'code_verify'. It does not, however, distinguish itself from siblings like lesson_validate, which also plausibly concerns checking correctness.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus lesson_validate or course_build, and no stated prerequisites such as a sandbox environment or a lesson_id requirement. The only contextual hint is the runtime note (mono/dotnet for C#, python for Python), which is language selection, not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

course_buildC

한 파일짜리 HTML 플레이어(dist/index.html)와 음성 파일을 만듭니다. 음성이 없는 레슨은 소리 없이 예상 시간으로 진행합니다.

NameRequiredDescriptionDefault
out_dirNo
course_dirYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose one genuinely useful trait: lessons lacking audio advance silently using estimated time. However, it says nothing about whether existing files in out_dir are overwritten, whether the build is idempotent, what permissions or disk usage are involved, or what it reports on completion — significant gaps for a file-writing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler, and the primary output is front-loaded. Nothing is wasted, though the brevity comes partly at the cost of the missing information noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter build tool with no annotations and no output schema, the description should cover input sources, output destination defaults, and overwrite behavior. It covers only the output artifact and one fallback behavior, so an agent cannot confidently invoke it with non-default arguments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and does not: neither course_dir (source of lessons) nor out_dir (destination, default null) is explained. The mention of 'dist/index.html' only vaguely hints at the default output location, leaving both parameters semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb-and-resource pair (builds a single-file HTML player at dist/index.html plus audio files) and even states the behavioral fallback for audio-less lessons. It is clearly distinct from course_init and lesson_save, though it never explicitly says the course content comes from course_dir, leaving the input-output relationship to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus siblings such as course_init (scaffolding) or audio_synthesize (audio generation alone), nor any prerequisite like running lesson_validate or course_init first. The agent must guess at the pipeline position of this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

course_initC

새 코스 폴더를 만듭니다. code_lang: csharp | python, voice: F1F5, M1M5.

NameRequiredDescriptionDefault
titleYes
voiceNoF1
subtitleNo
code_langNocsharp
course_dirYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden but only states that a folder is created. It omits what happens if the directory exists, whether it's destructive/reversible, what files are scaffolded, and any permission requirements — significant gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with the purpose front-loaded and the parameter value hints following. No wasted words, though the terseness borders on under-specification rather than maximal helpfulness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param mutation tool with no annotations and no output schema, the description should explain the required course_dir/title, the effect of the operation, and the relationship to course_build. It provides only the purpose and two value hints, leaving the workflow context incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (no descriptions, no enums), yet the description usefully specifies the allowed values for code_lang (csharp|python) and voice (F1~F5, M1~M5), which the schema lacks as enums. However, title, subtitle, and course_dir remain undocumented, so it only partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource: '새 코스 폴더를 만듭니다' (creates a new course folder). An agent can understand the action, though it doesn't explicitly differentiate from siblings like course_build or authoring_guide that also relate to course setup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this versus course_build, authoring_guide, or lesson_save. Prerequisites like whether the course directory must already exist, or the recommended workflow order, are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

course_statusC

코스의 레슨 목록, 장면 수, 형식 문제 수, 음성 상태를 보여 줍니다.

NameRequiredDescriptionDefault
course_dirYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Shows' implies a read, but it never states that the operation is non-mutating, what happens if course_dir does not exist, or whether it inspects the filesystem versus an in-memory project.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the outcome and lists the returned fields without waste. It is appropriately sized, though it could have spent one more clause on the required input.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description effectively enumerates what the call reports back, which substitutes for the missing output schema. However, with no annotations and an undocumented required parameter, an agent still lacks enough to call it confidently with a valid course_dir.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter course_dir is not mentioned in the description at all. The agent gets no guidance on whether it is a path, a course ID, or a slug, so the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('보여 줍니다' / shows) and enumerates the concrete resource contents: lesson list, scene count, format issue count, audio status. That clearly distinguishes it from mutation siblings like course_build or course_init, though it never names a sibling to route against (e.g. lesson_get).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus lesson_get, lesson_validate, or assets_list, and no preconditions (e.g. the course must already be initialized). The agent must infer usage entirely from the name and the enumerated outputs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lesson_getC

레슨 JSON 하나를 그대로 돌려줍니다(고쳐 쓸 때).

NameRequiredDescriptionDefault
lesson_idYes
course_dirYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full disclosure burden. 'As-is' (그대로) is a useful note that no transformation occurs, but it says nothing about required permissions, behavior when course_dir or lesson_id does not exist, or error conditions for what is likely a file-backed read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the action front-loaded and the usage hint in a trailing parenthetical. Nothing is wasted, though the terse phrasing leaves the tool under-explained rather than over-explained.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations, no output schema, and 0% parameter coverage, the description should explain the shape of the returned lesson JSON and the meaning of course_dir. It does neither, leaving meaningful gaps for a tool that is the read half of an edit workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so neither course_dir nor lesson_id is documented anywhere. The description only implies that a single lesson is fetched and adds no detail about whether course_dir is a path or slug, nor what lesson_id indexes into.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('레슨 JSON 하나를 그대로 돌려줍니다' — return one lesson JSON verbatim), which lets an agent distinguish it from lesson_save or lesson_validate. It does not name any sibling tool explicitly, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(고쳐 쓸 때)' signals the intended context — use this before editing a lesson — which implicitly pairs it with lesson_save. However, no alternatives are named, and there is no guidance on when not to use it or on prerequisite ordering with lesson_validate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lesson_saveB

레슨 JSON을 검사하고, 오류가 없으면 lessons/NN.json으로 저장합니다(같은 id면 덮어씀). lesson = {"id": 1, "group": "...", "title": "...", "sub": "...", "ops": [...]}

NameRequiredDescriptionDefault
lessonYes
course_dirYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose two valuable traits — the validation gate and that an existing file with the same id is overwritten — but says nothing about what happens on validation failure, whether it returns errors, or what the file path pattern NN resolves to. Overwrite is disclosed, but overall coverage for an unannotated mutation tool is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short lines, with the operation and the overwrite caveat front-loaded and the object shape as a compact reference. No wasted prose, though the schema example is bare.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation tool with no annotations, no output schema, and an untyped nested object, the description covers the shape of lesson but omits course_dir semantics and any return/error behavior. Adequate to start, incomplete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the lesson parameter is a free-form nested object, so the inline key list (id, group, title, sub, ops) adds real value beyond the schema. However, course_dir — a required parameter — is completely unexplained, leaving half the parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete two-step verb sequence (validate then save) on a specific resource, plus the destination path 'lessons/NN.json'. It doesn't name lesson_validate or explain how it differs, so sibling differentiation is only implicit in the validate-then-save phrasing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The conditional 'if there are no errors, save' implies when the tool proceeds, but there is no explicit when/when-not guidance and no mention of the sibling lesson_validate as the check-only alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lesson_validateB

레슨 형식을 검사합니다(없는 코드 줄, 모르는 op·위젯, 읽기 어려운 단어 등). lesson_id를 비우면 전체.

NameRequiredDescriptionDefault
lesson_idNo
course_dirYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the categories of validation performed and the default 'all lessons' scope, but it does not clarify permissions, whether validation is purely read-only, or how results are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact clauses, front-loads the purpose, and uses a parenthetical to list concrete validation examples without wasted text. Every part contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter validation tool with no output schema and no annotations, the description covers the core purpose and one parameter's default behavior. It remains incomplete because course_dir is unexplained and the result/error behavior is not described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It explains the lesson_id semantics ('비우면 전체' / empty means all) but says nothing about course_dir, leaving one of two parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('검사합니다' / validates) and resource ('레슨 형식' / lesson format), and enumerates concrete checks such as missing code lines, unknown op/widget, and hard-to-read words. It is clear what the tool does, though it does not explicitly contrast itself with siblings like code_verify or course_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one useful usage rule: if lesson_id is empty, all lessons are validated. However, it does not say when to use this tool versus related siblings such as code_verify or course_status, so broader usage guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pronunciation_addC

영어 단어의 한글 읽기를 코스에 등록합니다. 예: word="Dictionary", reading="딕셔너리".

NameRequiredDescriptionDefault
wordYes
readingYes
course_dirYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It implies a persistent mutation ('등록합니다') but never says whether an existing reading is overwritten, whether it requires a valid/initialized course, or what happens on duplicate words.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by a concrete example; nothing is padded. It is efficient, though brevity here comes at the cost of the missing details noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with no annotations, no output schema, and 0% schema coverage needs the description to cover prerequisites and side effects, and it does neither. Only word/reading get any explanation, leaving course_dir and persistence behavior undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with three required parameters. The example clarifies the roles of word and reading, but course_dir — the most consequential parameter — gets no explanation of its format, whether it must exist, or how it is identified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it registers ('등록합니다') the Korean reading of an English word into a course. The example (word="Dictionary", reading="딕셔너리") makes the operation concrete and clearly separates it from authoring siblings like lesson_save or course_build.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus siblings, and no prerequisites stated — notably it never says a course must already exist or how course_dir is chosen. The example illustrates input shape but not the conditions that select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_3dA

Blender로 3D 장면을 렌더해 assets/.png 와 핫스폿 좌표를 만듭니다. script: bpy 파이썬 코드(장면만 만들면 됨). spot("이름", (x, y, z))로 찍은 3D 위치가 이미지의 어디인지 계산되어, 레슨에서 {"img": ["assets/.png", {"spots": ["이름"], "arrows": [{"from": "a", "to": "b"}]}]}로 가리킬 수 있습니다. 도우미: mat(이름, (r,g,b), rough, metal, emit, sss), paint(obj, mat), spot, camera(위치, 대상, lens), sun, area, world, look_at, cylinder_between. Blender가 PATH에 없으면 FLS_BLENDER 환경 변수에 실행 파일 경로를 넣으세요.

NameRequiredDescriptionDefault
nameYes
widthNo
heightNo
scriptYes
samplesNo
course_dirYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description bears a high burden, which it meets by disclosing significant behavioral details. It explains the exact file naming convention, the generation of spatial data, provides a list of helper functions (e.g., mat, spot, camera), and specifies dependency environment configurations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite being technically dense and covering three topics (generation, usage, environment), the information is logically grouped and readable. It is efficient in its comprehensive delivery of complex technical instructions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 3D rendering tool, the description is very complete. It provides the context for why the hot-spot coordinates are generated (lesson integration), the required scripting format, and the necessary environment setup to run the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 0%, meaning the description must cover all parameter meaning. The text only elaborates on the purpose of 'name' and 'script' within the context of hot-spot generation, providing virtually no semantic guidance for 'width', 'height', or 'samples'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is highly specific, stating that the tool renders a 3D scene using Blender to generate both an image (assets/<name>.png) and hot-spot coordinates. It clarifies the input requirement of using a bpy Python script.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While it does not explicitly list alternatives, it provides clear workflow instructions, specifically requiring a bpy Python script for scene creation. It also instructs users on prerequisite environment setup, including setting the FLS_BLENDER variable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

speech_previewC

장면마다 TTS가 실제로 읽을 문장을 보여 주고, 영어 단어처럼 읽기 어려운 조각을 표시합니다.

NameRequiredDescriptionDefault
lesson_idYes
course_dirYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It conveys meaningful behavioral content (this returns the actual read-aloud text per scene plus flagged fragments, i.e. a read/preview operation), but it never explicitly states that it is side-effect-free or describes formatting of the returned text. Reasonable but incomplete for a zero-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single focused sentence with no filler, and the core purpose (showing read-aloud text) is front-loaded. Efficient, though slightly short given what it must convey.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No annotations, no output schema, and two completely undocumented required parameters. The description explains the output concept but leaves the agent without the information needed to supply course_dir and lesson_id correctly or to know the operation's safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and neither course_dir nor lesson_id is mentioned in the description. The scene-level framing gives faint context that a lesson is being inspected, but no parameter's meaning, format, or role is clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it shows, scene by scene, the sentences TTS will actually read and flags hard-to-read fragments like English words. This is clearly distinct from action-oriented siblings such as audio_synthesize or pronunciation_add, though it never names or contrasts those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use context is given, no prerequisites, and no guidance on when to prefer this over audio_synthesize or pronunciation_add. The agent must infer the preview-vs-synthesize distinction entirely on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedassets_list
    • First observedaudio_synthesize
    • First observedauthoring_guide
    • First observedcode_verify
    • First observedcourse_build
    • First observedcourse_init
    • First observedcourse_status
    • First observedlesson_get
    • First observedlesson_save
    • First observedlesson_validate
    • First observedpronunciation_add
    • First observedrender_3d
    • First observedspeech_preview

TDQS

B3.4/5.0

Scored across 13 tools

Disambiguation4/5

Each tool maps to a distinct stage of the authoring pipeline (init → guide → lesson_get/save/validate → speech_preview/audio_synthesize → render_3d → course_build), so selection is mostly unambiguous. Minor overlap exists between lesson_validate and lesson_save (which also validates), and between speech_preview and audio_synthesize (both deal with TTS text/audio).

Naming Consistency4/5

The dominant convention is noun_verb (lesson_get, lesson_save, lesson_validate, course_init, course_build, course_status, assets_list, speech_preview, pronunciation_add, code_verify, audio_synthesize), which is predictable. Deviations are small: render_3d is verb-first and authoring_guide has no verb at all.

Tool Count5/5

13 tools is well within the ideal range and each covers a discrete authoring concern (course scaffolding, lesson CRUD/validation, speech, 3D assets, build, status, docs). No obvious filler tools or redundant wrappers.

Completeness4/5

The lesson and course lifecycle is well covered: init, get, save, validate, status, build, plus speech and asset generation. Gaps are minor but real — there is no lesson delete/list-by-id beyond course_status, no way to remove or inspect registered pronunciations, and no asset deletion tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables teachers to turn plain-language teaching requests into interactive HTML demos and Mannim-rendered narrated animations through a confirm-once workflow, with automatic lesson design, generation, review, and revision. Shares a local work library with the standalone web workbench so finished lessons can be exported as offline HTML, MP4, or ZIP packages.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLM agents to generate and validate multi-granularity storyboard assets from text prompts, including 2D SVG motion, 3D Blender depth/blockout, and SDXL ControlNet final images. It also supports vision-based self-correction and a SQLite knowledge database of successful recipes.
    MIT