Chalkmind

MCP: connect any AI to the board

Chalkmind is an MCP server. With it, claude.ai, Claude Desktop, Claude Code or any other MCP client (agent) can teach on the board live, as one of its tenant's teachers.

Connecting to the hosted board

claude mcp add --transport http chalkmind https://HOST/v1/mcp --header "Authorization: Bearer cm_…"

Other clients take the same address and header. How a session works:

A key that may manage its tenant also gets teacher_save and teacher_book_add.

Connecting on a computer (stdio)

The client's machine needs Node 22 (for --experimental-transform-types) and this project.

Claude Code:

claude mcp add liveboard -- node --experimental-transform-types --no-warnings /abs/path/liveboard/server/bin/mcp.ts --board http://127.0.0.1:4620

Claude Desktop and other clients (mcpServers in their config):

{
  "mcpServers": {
    "liveboard": {
      "command": "node",
      "args": ["--experimental-transform-types", "--no-warnings", "/abs/path/liveboard/server/bin/mcp.ts", "--board", "http://127.0.0.1:4620"]
    }
  }
}
OptionDefaultMeaning
--board URLhttp://127.0.0.1:4620the board server
--channel NAMEdemothe channel the students watch (board_start can change it)
--wait SECONDS20how long board_write waits for its lines to be laid out
--key KEYLIVEBOARD_API_KEYthe board's API key for this channel's tenant; a board started with keys refuses calls without it (401)
--manageoffalso list teacher_save and teacher_book_add (the key must be one that may manage its tenant)

Resources

board_start carries both (and the library's names) in its reply, because many clients do not read resources.

Tools

src/mcp.ts has one TOOLS table: an entry per tool (name, description, input schema, HTTP route), so a new tool is one new entry. The lesson routes are under /board/:channel.

ToolInputHTTPWhat it does
board_startchannel?, title?, guide?, learner?, lang?, teacher?POST /sessionA new lesson on a clean board, as one of the tenant's teachers (teacher), in its language unless lang names one. The reply carries the board's instructions, taken from the board server (GET /guide): the guide, the tool rules with the library's names, the teacher's instructions, and the teaching skill (unless guide: false), because many clients do not read resources. It also gives the students' link, with a viewer token.
board_teachersid?GET /teachers, GET /teachers/:idThe teachers the key may teach as; with id, one teacher's subject, learners, style, book and library.
board_bookchapter?, search?GET /teachers/:id/bookThe lesson's teacher's book: a chapter whole, or the passages with a word.
teacher_saveid, name?, subject?, level?, lang?, style?, notes?, std?, library?, from?PATCH /teachers/:id, else POST /teachersMakes a teacher of the tenant's own, or changes the fields given (a manage key only).
teacher_book_addid, chapter, title, text, lang?POST /teachers/:id/bookA chapter of a teacher's book (a manage key only).
board_writelinesPOST /linesSends lines and waits (up to --wait) for them to be laid out. It returns any refused line with its reason and hint, so the AI fixes it at once, how much lesson is queued, the free lines left and what is on the board with its ids. It also returns the students' questions asked on their screens since the last call (GET /doubts?take=1), to answer at this step.
board_librarykind?, category?, search?GET /library/search (this project's copy if the server cannot be asked)The ready stamps, labelled diagrams, formulas and lesson patterns (LIBRARY.md): what each is, a diagram's part ids and labels, found by kind, category or a word. board_start already lists the names.
board_stateGET /stateWhat is on the board now: every item's id, kind, box [x, y, w, h], line and text; figure points (fig.A); the cursor, the text column and the free lines; how far the board is behind the voice; hold; problems.
board_statusGET /problems, GET /filmHow many lines came, how many seconds of lesson are laid out and where the students are, the steps, every problem.
board_holdPOST /holdPauses the lesson on every screen (chalk and voice).
board_resumePOST /resumeContinues a held lesson from where it stopped.
board_teachproblem, lang?POST /teachThe board server's own Claude teaches the problem.
board_commandtext, lang?, fresh?POST /commandAn instruction for the board's own teacher on the board as it is ("explain the second step again", a student's question), or on a fresh board.
board_endPOST /endEnds the lesson.

Order:

Descriptions tell the AI to read the guide first, and to send lines in small pieces as it thinks of them (a say and the few lines it explains), never the whole lesson in one block.

Resource and prompt

NameWhat
Resourceliveboard://guideAI_GUIDE.md, the board language
Promptteach {problem}the guide, how to use the tools, and the problem to teach (the same request as bin/teach.ts)

How a lesson goes

  1. board_start {title}: the board is cleaned and the guide comes back.
  2. board_write, again and again: board 0.1, then a say and its lines, in small pieces.
  3. The result lists refused lines, for example did you mean "write"? for wrte:, or "left side is 6, right side is 7" for a wrong calculation. Those lines are not on the board, so the AI sends only the corrected lines and goes on.
  4. When needed:
    • board_state: before pointing at or erasing an item, or to decide when to clear;
    • board_hold and board_resume.
  5. board_end.

Notes:

Test

server/test/mcp.test.ts (part of npm test):