Lessonly AI
An AI workspace for teachers: governed chat, agents, specialist MCP tools, essay grading and scheduled project work.
- Role
- Full Stack AI Engineer
- When
- 2026
- Status
- Delivered to a client
- Stack
- React, TypeScript, Node.js, Express, MongoDB, Redis, Python, FastAPI, LangChain, PostgreSQL + pgvector, Azure OpenAI, Google Gemini, MCP
Results
- Features in one workspace
- 9
- Specialist MCP services
- 6
This was employer and client work. The details stay at the level I can share publicly.
Approach
A customised open-source chat base turned into an education workspace: governed teacher chat with curated model presets, an agent marketplace, opt-in tools per chat, and an admin console with an audit log.
Specialist MCP services handle lesson planning against standards data, Office document creation, image generation, podcast audio, video discovery and web search. A separate Python service embeds uploaded files for retrieval with citations.
Cowork projects give an agent its own workspace, skills, code execution and the user's own connected SaaS tools, with routines that run on a schedule.
Simplified, illustrative diagram
Lessonly AI
Teachers chat, pick agents, launch lesson plans, grade essays and run Cowork projects in one app.
- Essay grading
6 specialist MCP services
9 features in one app
Web app
Teachers chat, pick agents, launch lesson plans, grade essays and run Cowork projects in one app.
Uses: Essay grading
Key decisions
Resumable streams
Each answer is a generation job streamed over server-sent events, with job state in Redis, so a dropped connection can resume and the API can run as several replicas.
Memory with a budget
A small model condenses recent turns into a token-capped set of preferences, so personalisation doesn't grow the prompt without limit.
Retrieval as its own service
Chunking and embedding run in a separate FastAPI and LangChain service with pgvector, keeping heavy file work out of the chat server.
Users connect their own tools
SaaS connectors use each user's own OAuth account, so the agent acts with that user's permissions, not a shared one.