TutorFlow MCP
This MCP server exposes a tutoring workflow so an AI assistant can query students, review progress, and safely preview/confirm updates.
List students, optionally filtered by name or subject focus.
Get a student's recent session notes and open homework by student ID.
Preview a session note and save it only with
confirm: true.Preview a homework assignment, with optional due date, and save it only with
confirm: true.Generate a parent-friendly progress report draft using Anthropic, optionally saving it with
save: true(requiresANTHROPIC_API_KEY).Note: the README mentions a sixth
delete_homeworktool, but the provided schema exposes only these five tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TutorFlow MCP Show me Aiden's progress and log a note from today's session."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TutorFlow MCP
An MCP (Model Context Protocol) server that exposes a tutoring workflow — students, session notes, homework, progress — as tools an AI agent (Claude Desktop, Cursor, Claude Code) can call directly. Instead of opening a dashboard to check "how is Aiden doing," you can just ask.
Why this exists
Tutors juggle student-specific context (what was covered, what's still shaky, what's due) across notebooks, texts, and memory. This project puts that context behind a small set of well-defined tools so an AI assistant can answer questions and log updates on your behalf, without you re-explaining context every session.
Related MCP server: MoyKlass MCP Server
Status
Six tools implemented and smoke-tested end to end (write tools and the
report tool's error path all verified with a scripted MCP client; the
report tool's actual LLM call needs your own ANTHROPIC_API_KEY to try live):
list_students— list all students, optionally filtered by name/subjectget_student_progress— recent session notes + open homework for one studentlog_session_note— write. Defaults to preview-only; passconfirm: trueto save.assign_homework— write. Same preview/confirm: truepattern.delete_homework— write (deletion). Same preview/confirm: truepattern.get_student_progressnow shows each homework item's id, which this tool needs — useful for cleaning up accidental duplicates.generate_progress_report— the one tool that reasons rather than just fetches: calls the Anthropic API to turn shorthand session notes into a short, parent-friendly summary. Defaults to draft-only. To store it, call again withsave: trueANDsummaryset to the exact draft text — saving requires the precise text back, rather than silently regenerating a new (and possibly different) summary on save. RequiresANTHROPIC_API_KEYfor drafting; saving an already-drafted summary doesn't call the LLM again.
Streamable HTTP transport is also implemented (src/mcp/http-server.ts) —
tested end to end with a real HTTP client: unauthenticated requests
correctly rejected, session creation, tools/list, tools/call, and
session termination all verified.
The actual tool logic (DB queries and writes) lives in src/services/*.ts,
shared by the MCP tools. A REST API (src/api/server.ts) now sits on the
same services and same database — full read/write/PATCH/DELETE flow tested
end to end with real HTTP calls — as the backend for the Angular dashboard.
Planned next (see build plan):
Angular dashboard consuming the REST API above
Architecture
Claude Desktop (local) Angular dashboard (deployed or local)
│ stdio │ HTTPS
▼ ▼
src/mcp/server.ts src/mcp/http-server.ts (deployed to Render)
(spawned subprocess) Express app serving BOTH:
/mcp — MCP Streamable HTTP, bearer auth
/api — REST routes, scoped CORS + rate limit
└───────────────┬───────────────┘
▼
src/mcp/createServer.ts (MCP) / src/api/router.ts (REST)
— MCP: builds a fresh McpServer, registers all 6 tools
— REST: mountable router, same routes whether run standalone
(api/server.ts, local dev) or mounted in http-server.ts
│
▼
src/mcp/tools/*.ts — one file per MCP tool: zod schema + handler
│
▼
src/services/*.ts — the actual business logic, shared
│
▼
src/db/client.ts — SQLite connection (better-sqlite3)
tutorflow.db — local dev databaseBoth the MCP tools and the REST API sit on top of the same
src/services/*.ts layer and the same SQLite database — neither is the
source of truth for the other. The MCP write tools use a preview-then-
confirm round trip because an agent might otherwise act on ambiguous
instructions unsupervised; the REST API skips that ceremony because a
human clicking a UI button (with its own confirm dialog) already serves
the same purpose.
Each tool file follows the same shape on purpose: a zod schema for
arguments, a handler that queries the DB, and a registerX(server) function
called once from server.ts. Adding tool #3 means adding one file and one
line in server.ts — nothing else changes.
Setup
npm install
npm run db:init # creates tutorflow.db and seeds 2 sample students
npm run dev # starts the MCP server on stdioTry it with Claude Desktop
Add this to your Claude Desktop MCP config
(~/Library/Application Support/Claude/claude_desktop_config.json on macOS,
%APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"tutorflow": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/tutorflow-mcp/src/mcp/server.ts"]
}
}
}Restart Claude Desktop, then try asking: "List my students" or "How is Aiden doing?"
REST API (for the dashboard)
npm run dev:api # http://localhost:3001Method | Path | Purpose |
GET |
| List students |
GET |
| Student + sessions + open homework + saved reports |
POST |
| Log a session note — |
POST |
| Assign homework — |
PATCH |
| Toggle completed — |
DELETE |
| Delete a homework item |
POST |
| Draft a report (calls the LLM) — returns |
POST |
| Save an exact summary — |
Running the HTTP server locally
# .env needs DB_PATH, ANTHROPIC_API_KEY (optional), and MCP_AUTH_TOKEN (recommended)
npm run dev:httpVisit http://localhost:3000/health to confirm it's up. If MCP_AUTH_TOKEN
is set, every /mcp request needs Authorization: Bearer <token> or it's
rejected with 401 — this is a single shared secret, fine for a solo demo,
not real per-user auth.
Deploying
npm run start:http (see below) is a single process that serves the MCP
transport, the REST API, and the landing page together — the one thing you
deploy to cover both the AI-agent path and the dashboard.
Push this repo (see
.gitignore—node_modules,dist, and*.dbare already excluded).On Render or Railway, create a new web service pointing at the repo with build command
npm install && npm run buildand start commandnpm run start:http.Set environment variables on the platform:
ANTHROPIC_API_KEY,MCP_AUTH_TOKEN(generate a random string — this is your MCP endpoint's password),DASHBOARD_ORIGIN(your deployed dashboard's exact URL, once you have it — see the dashboard repo's README for the deploy-order note), and optionallyDB_PATH.PORTis usually set automatically by the platform.SQLite lives on local disk, and free tiers (including Render's) wipe it on every deploy and restart. The deployed server therefore creates its own tables on startup and seeds a few demo students when the database is empty (set
SEED_DEMO_DATA=falseto skip the seeding) — no manualdb:initneeded, and a restart quietly resets any changes to the public demo. That also means data you add on the free tier is temporary. For anything beyond a portfolio demo, swapbetter-sqlite3for a Postgres client (pg) pointed at a free Supabase/Neon instance instead — the query shapes insrc/services/*.tsstay almost identical.
Connecting a remote client to the deployed server
Two ways, depending on what your Claude plan/client supports:
A. Native custom connector (Claude.ai/Desktop, Pro plan or above) —
Settings → Connectors → Add custom connector → paste your deployed URL
(https://your-app.onrender.com/mcp). If your account has the "Request
headers" option under Advanced settings, add
Authorization: Bearer <your MCP_AUTH_TOKEN> there. If that option isn't
available yet, use option B instead.
B. mcp-remote bridge (works today, any account) — add this to
claude_desktop_config.json instead of a local command/args block.
Windows note: pass the header via an env var to avoid Claude Desktop
mangling the spaces in the value:
{
"mcpServers": {
"tutorflow": {
"command": "npx",
"args": [
"mcp-remote",
"https://your-app.onrender.com/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": { "AUTH_HEADER": "Bearer your-mcp-auth-token" }
}
}
}Guardrails note
log_session_note, assign_homework, delete_homework, and
generate_progress_report (when saving) all default to a preview-only
response and only write when called again with confirm: true (or
save: true for the report). This means an agent can't silently write to
or delete your data on a single ambiguous request — it has to show you
exactly what it's about to change first. Worth keeping this pattern for
every future write tool.
For generate_progress_report specifically, this means "confirm" isn't
just a flag: saving requires passing the exact draft summary text back,
not just save: true. An LLM call isn't deterministic, so if saving
re-drafted the report instead of persisting the reviewed text, the
preview-then-confirm guarantee would be silently broken for this one tool.
Setting ANTHROPIC_API_KEY
Two ways to provide it, depending on how you're running the server:
Local dev (
npm run dev) — copy.env.exampleto.envand fill in the key. Loaded automatically viadotenv/config.Via Claude Desktop — add it to the server's config block instead, so it's set before the process starts:
{ "mcpServers": { "tutorflow": { "command": "npx.cmd", "args": ["tsx", "D:\\tutorflow-mcp\\src\\mcp\\server.ts"], "cwd": "D:\\tutorflow-mcp", "env": { "ANTHROPIC_API_KEY": "sk-ant-..." } } } }
Available Tools
5 toolsassign_homeworkA
Assign a homework item to a student. By default this only PREVIEWS the assignment and does not save it — call again with confirm: true to actually create it. Use list_students first if you don't know the student_id.
Inputs: student_id (required), description (required), confirm, due_date.
generate_progress_reportA
Generate a parent-friendly progress summary for a student by having an LLM reason over their recent session notes and homework. Returns a draft by default — call again with save: true to store it in progress_notes. Requires ANTHROPIC_API_KEY.
Inputs: student_id (required), save.
get_student_progressA
Get a student's recent session notes and open homework by student id. Use list_students first if you don't know the id.
Inputs: student_id (required).
list_studentsA
List all students being tutored, with their grade and subject focus. Optionally filter by a search term matched against name or subject.
Inputs: search.
log_session_noteA
Log a note for a tutoring session. By default this only PREVIEWS the note and does not save it — call again with confirm: true to actually write it. Use list_students first if you don't know the student_id.
Inputs: note (required), student_id (required), session_date (required), confirm.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct action and resource: listing students, retrieving progress, logging session notes, assigning homework, and generating reports. No two tools could be confused for the same purpose.
All tool names follow a consistent verb_noun pattern (list_students, get_student_progress, log_session_note, assign_homework, generate_progress_report). The naming is uniform and predictable.
With 5 tools, the server is well-scoped for a tutoring workflow. Each tool covers a core operation without redundancy or bloat, fitting the ideal 3-15 range.
The tool surface covers the main lifecycle of tutoring: viewing students, accessing progress, adding session notes and homework, and producing reports. Minor gaps exist (no explicit update/delete for notes or homework), but agents can work around these by logging new notes or assignments.
Maintenance
Related MCP Connectors
AI-native task management: list, create, update and archive tasks with rich context for AI agents
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
ADHD system of record for agents: tasks, goals, loops, calendar, focus stats.
Governed memory and workspace for any AI: tasks, calendar, mail and pages, with per-action consent.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage student profiles, track assessments, calculate topic mastery, identify learning gaps, and recommend focus areas. Integrates with Claude Desktop and Claude Code for interactive learning analytics.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to read MoyKlass CRM data through natural language, providing 16 tools for accessing users, groups, lessons, tasks, and more.-
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to operate Google Classroom, letting users list courses and students, check assignment submissions, and create coursework and announcements through natural language.-
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible AI clients to tutor students through a full learning workflow, including knowledge retrieval, assessments, mastery tracking, and personalized next-action recommendations.MIT