1 · Get the server
The server is a single Python file that ships in our public examples repo. It talks only to https://api.coursesmith.ai and your key never leaves your machine — it goes into the client's env block, not into any config we host.
git clone https://github.com/propfuturesbot/coursesmith-api-examples.git
pip install "mcp[cli]" httpx
# server file: coursesmith-api-examples/mcp/coursesmith_mcp.py2 · Connect your client
Use the absolute path to coursesmith_mcp.py and a Python that has the mcp package installed. Restart the client after editing its config.
claude mcp add coursesmith \
-e COURSESMITH_API_KEY=cs_live_... \
-- python /abs/path/coursesmith-api-examples/mcp/coursesmith_mcp.pyThen ask Claude to make a video — the tools appear automatically.
{
"mcpServers": {
"coursesmith": {
"command": "python",
"args": ["/abs/path/coursesmith-api-examples/mcp/coursesmith_mcp.py"],
"env": { "COURSESMITH_API_KEY": "cs_live_..." }
}
}
}{
"mcpServers": {
"coursesmith": {
"command": "python",
"args": ["/abs/path/coursesmith-api-examples/mcp/coursesmith_mcp.py"],
"env": { "COURSESMITH_API_KEY": "cs_live_..." }
}
}
}{
"servers": {
"coursesmith": {
"type": "stdio",
"command": "python",
"args": ["/abs/path/coursesmith-api-examples/mcp/coursesmith_mcp.py"],
"env": { "COURSESMITH_API_KEY": "cs_live_..." }
}
}
}VS Code uses "servers" with an explicit "type": "stdio".
{
"mcpServers": {
"coursesmith": {
"command": "python",
"args": ["/abs/path/coursesmith-api-examples/mcp/coursesmith_mcp.py"],
"env": { "COURSESMITH_API_KEY": "cs_live_..." }
}
}
}The repo also ships a ready-made skill at skills/coursesmith-video/ — copy the folder into ~/.claude/skills/ and Claude Code drives the REST API directly with curl, no server process needed.
3 · Just ask
Long renders outlive a single tool call — agents poll with wait_for_job (bounded at 120 s per call) and keep going. Generation and render calls are idempotent, so a retried tool call never double-charges.
The 17 tools
list_options— Formats, lengths, tones, resolutions — never hardcode enumslist_voices— Built-in, premium, and your cloned voicesget_credits— Balance check before spending
list_courses— Your courses, paginatedget_course— Full tree: topics → lessonscreate_course— Empty course shellcreate_lesson— One-call standalone lesson — the unit videos hang off
ingest_source— URL, raw text, YouTube, or GitHub repoprocess_source— LLM split into concepts + proposed lecturescommit_source— Turn the split into grounded lessons
generate_lecture— Script generation across every format familyget_storyboard— Compact scene-by-scene view of the scriptupdate_scene— edit | rewrite | remap — one tool, three modesadd_scene— LLM-authored scene from a descriptiondelete_scene— Remove a scene
render_video— The whole pipeline: TTS → timeline → MP4wait_for_job— Bounded long-poll on any job id
Rather call the API directly?
Everything the agent does is plain REST — the examples repo has runnable scripts for the same flows, and the reference documents every endpoint.