@techprofessor/mcp
v0.2.2
Published
MCP server to create, read, and update TechProfessor artifacts (quizzes, tours, flashcards, playgrounds, exams, syllabi) from any MCP client — you author the content, this persists it.
Downloads
666
Readme
TechProfessor MCP server
A push-based CRUD surface over TechProfessor artifacts (quizzes, tours, flashcards, playgrounds, exams, syllabi, showcases) for any MCP client (Claude Desktop, Cursor, other agents). This server never generates content — you (the client) author the artifact, and the MCP persists, reads, and updates it. Create and Update just push what you made: no server-side AI, no provider key, no serverless time limit.
The flow for every type is the same: call get_artifact_schema for the exact
shape, author the artifact, push_artifact to save it, then read it back with
get_artifact / list_artifacts and edit it with update_artifact. Optionally
group existing artifacts into a course with the course tools.
Tools
| Tool | What it does |
|------|--------------|
| push_artifact | Create — upload one artifact you authored (quiz/tour/flashcards/playground/exam/syllabus/showcase). |
| push_artifacts | Create (bulk) — upload authored artifact JSON files (a directory or single file). |
| get_artifact | Read — fetch one artifact in full, including every item with its id. |
| list_artifacts | Read (list) — list your artifacts and their session_id. |
| update_artifact | Update — edit an artifact in place: title/description and/or items by id. |
| get_artifact_schema | Return the exact package shape (+ example) for a type, so an authored artifact validates on the first upload. |
| list_repos | List your repositories and their repo_id (to attach a pushed artifact to a repo). |
| list_teams | List your teams and their team_id (target for pushes). |
| list_courses | List your courses and their course_id. |
| create_course | Create a new (empty) course. |
| get_course | Fetch one course's items, each with the session it points to. |
| add_course_item | Add an existing artifact (by session_id) as a step in a course. |
Create an artifact (push)
You author the artifact; this server persists it. Steps:
get_artifact_schema({ type })— get the exact package shape (+ an example) forquiz/tour/flashcards/playground/exam/syllabus/showcase.- Author the package JSON yourself (one artifact per package).
push_artifact({ artifact, repo_id?, team_id? })— save it.repo_idattaches it to a repo (fromlist_repos); omit for a standalone artifact.team_id(fromlist_teams) saves to a team space instead of your private one. Re-pushing the samesource_refupdates that artifact (idempotent full-replace) instead of creating a duplicate.
push_artifacts does the same from .json files — a directory or a single
file. The response includes a web_link you can open to study or share.
The link is placement-aware: root artifacts use their flat type home, while
repo-backed artifacts use the nested repository/view home. All links returned
by push, list, get, and update are canonical browser links.
To read and edit existing artifacts, follow the flow list_artifacts →
get_artifact → update_artifact. Call list_artifacts to find a session_id,
then get_artifact to fetch every item with its id and current values, then
update_artifact to change the title/description and/or specific items by id.
Edits happen in place (no new version is created) and are strictly
owner-scoped — you only ever see or edit artifacts you own.
push_artifacts takes a path (a directory of artifact JSON files or a single
.json file; defaults to .techprof) and an optional team_id. It POSTs each
file to the ingest endpoint and reports one line per file. The server caps
ingests at 30/min; larger batches may be rate-limited (429).
Exams and syllabi
push_artifact/push_artifacts also accept type: "exam" and
type: "syllabus" — call get_artifact_schema({ type: "exam" }) or
get_artifact_schema({ type: "syllabus" }) for the exact shape before
authoring one:
- An exam's
items[]interleaves questions and coding exercises in one ordered list, each keyed bykind: "question" | "playground". Exam questions supportmultiple_choice/freeformonly — nofill_blank. - A syllabus's
materials[]holdshtml/mermaidcontent — the field isbody(notcontent). PDF materials are upload-only (not supported viapush_artifact).
Both are editable with update_artifact the same way as any other artifact:
get_artifact returns each exam item's kind and each syllabus material's
fields, and you patch them by id (an exam question edits like a quiz
question, an exam playground edits like a playground spec, a syllabus
material edits title/body/sort_order).
Showcase
A showcase is marketing/positioning copy, not a learning artifact — one
shared brief re-told as audience-shaped content. push_artifact/
push_artifacts accept type: "showcase"; call
get_artifact_schema({ type: "showcase" }) for the exact shape before
authoring one.
showcase_formatis"explainer"(cold web visitor, landing-page style),"one_pager"(customer/partner/press, dense one-page sheet), or"posts"(followers/subscribers, ready-to-post blog + email copy)."pitch_deck"is a real format value but Phase 2 (slide model +.pptxexport) — not yet pushable.sections[]holds the content, each{ kind, heading, body }in order.kindis per-format convention (not schema-enforced): explainer useshero | problem | how | benefits | faq | cta; one_pager usesheader | problem | what | benefit | who | proof | cta; posts usesblog | email.- Either inline a new
brief(one_liner,who_for,problem,how_it_works,why_different,proof,business_model,team,cta,tone) or link an existing one you own withbrief_id— the two are mutually exclusive.
Like exam/syllabus, showcase is author-only (no generate_showcase tool).
update_artifact does not yet support editing showcase sections.
Courses
A course groups existing artifacts (by session_id) into an ordered
sequence — it is not an artifact type itself and is never pushed via
push_artifact. Typical flow: push the pieces you want (a tour, an exam, a
syllabus, …) with push_artifact, create_course to make the container, then
add_course_item once per piece with its session_id. Use list_courses /
get_course to review what's already in a course before adding more.
Setup
- In TechProfessor, open Account → Developer & MCP and create a token
(
tp_pat_…). Copy it — it is shown only once. No AI provider key is needed — this server never generates content, it only stores what you author. - Add the server to your MCP client (below). Prefer the hosted HTTP endpoint
(
https://tech-professor.com/api/mcp) — no clone or build needed. To run the local stdio package from source instead, see Local development.
Configure your MCP client
Hosted HTTP (recommended)
No local Node/npx required. Point any MCP client at the hosted Streamable HTTP
endpoint and pass your token as a Bearer header — same shape as GitHub Copilot's
remote MCP:
claude mcp add-json techprofessor \
'{"type":"http","url":"https://tech-professor.com/api/mcp","headers":{"Authorization":"Bearer tp_pat_xxx"}}'claude mcp add --transport http techprofessor https://tech-professor.com/api/mcp \
--header "Authorization: Bearer tp_pat_xxx"Cursor / Claude Desktop / .mcp.json:
{
"mcpServers": {
"techprofessor": {
"type": "http",
"url": "https://tech-professor.com/api/mcp",
"headers": { "Authorization": "Bearer tp_pat_xxx" }
}
}
}For local development, use http://localhost:1420/api/mcp (or your Vite port)
against a token minted on that instance. Account → Developer & MCP also
shows a ready-made add-json command with your freshly created token filled in.
Local stdio (npx) — optional
Prefer HTTP above. Use the published package when you need filesystem
push_artifacts (bulk upload from a directory):
claude mcp add techprofessor -s user \
-e TECHPROF_API_TOKEN=tp_pat_xxx \
-- npx -y @techprofessor/mcpclaude mcp add-json techprofessor \
'{"type":"stdio","command":"npx","args":["-y","@techprofessor/mcp"],"env":{"TECHPROF_API_TOKEN":"tp_pat_xxx"}}'-s user registers it for every project; drop it to add only the current one.
TECHPROF_BASE_URL defaults to https://tech-professor.com (the hosted app);
set it only to point at your own deployment or http://localhost:1420 for local
development.
Local development
From a clone of the repo (to hack on the server itself):
cd mcp-server
bun install
TECHPROF_API_TOKEN=tp_pat_xxx TECHPROF_BASE_URL=http://localhost:1420 bun src/index.tsInspect tools interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector npx -y @techprofessor/mcp