edstem-mcp), a self-deployed Worker, and the hosted https://edstem.tuuhub.com/mcp service. Gating happens when a tool is called, not when it is listed:
create_threadandreply_threadpost publicly to a course. They fail withINSUFFICIENT_SCOPEunless posting is allowed:EDSTEM_ALLOW_POSTING=1for stdio,MCP_ALLOW_POSTING=1for a self-deployed Worker, or the write scope granted during the hosted service’s OAuth consent.mark_lessons_read,submit_slide_answerandsubmit_slidewrite too, but only require write access, not the posting flag. stdio and a self-deployed Worker grant write access to the token holder unconditionally; the hosted service still requires the same OAuth write scope that gates posting.
/edstem/reference.
get_user
Get the current Ed identity and enrolled courses. Available on: stdio, self-deployed Worker, hosted. Read-only.list_courses
List enrolled courses; archived courses are omitted by default.boolean
default:"false"
Also return courses Ed marks as archived; defaults to false.
list_lessons
List compact lesson summaries for one course. courseId accepts a numeric ID or course code. Call without filters first: an empty list means the course has no Ed Lessons. Filters are case-insensitive; use all or omit a filter to include every value.integer | string
required
Ed course ID or exact course code.
string
Exact lesson type, for example
"general". Use "all" or omit to include every type.string
Module ID or case-insensitive text from the module name. Use
"all" or omit to include every module.string
Exact availability state, for example
"active" or "scheduled". Use "all" or omit to include every state.string
Exact progress status:
"unattempted", "attempted", or "completed". Use "all" or omit to include every status.get_lesson
Get one lesson with slide content.integer
required
Ed lesson ID as returned by
list_lessons.list_lesson_files
List Ed-hosted downloadable files and direct resource links for one lesson.integer
required
Ed lesson ID as returned by
list_lessons.resource_link content item per file.
list_thread_files
List Ed-hosted downloadable files and direct resource links attached to one thread, including its answers and comments.integer
required
Global thread ID as returned by
list_threads.resource_link content item per file.
list_slide_questions
List quiz questions for one lesson slide.integer
required
Ed slide ID as returned by
get_lesson.list_slide_responses
List saved quiz responses for one lesson slide.integer
required
Ed slide ID as returned by
get_lesson.get_slide
Get one lesson slide with its content.integer
required
Ed slide ID as returned by
get_lesson.list_threads
List compact thread summaries for one course. courseId accepts a numeric ID or course code. Categories are hierarchical: category is top-level and subcategory is second-level. Sort defaults to new; Ed may keep pinned threads first.integer | string
required
Ed course ID or exact course code.
boolean
Keep answered threads when true, unanswered when false; omit for both.
string
Exact top-level category.
string
Exact second-level subcategory.
string
Exact thread type, for example
"question" or "post".string
default:"new"
new, old, top, or hot. Ed may keep pinned threads ahead of this order.string
Only threads created at or after this time: an ISO date, an ISO datetime, or a relative offset such as
"7d", "12h", or "2w".integer
default:"30"
Maximum threads to return, capped at 100.
integer
default:"0"
Threads to skip in the unfiltered Ed stream before filtering.
search_threads
Search threads in one course. Every query word must appear, case-insensitively, in the thread title or body; Ed is paged client-side until limit threads match. Accepts the same filters as list_threads.integer | string
required
Ed course ID or exact course code.
string
required
Words that must all appear, case-insensitively, in the thread title or body.
boolean
Keep answered threads when true, unanswered when false; omit for both.
string
Exact top-level category.
string
Exact second-level subcategory.
string
Exact thread type.
string
default:"new"
new, old, top, or hot.string
Only threads created at or after this time.
integer
default:"30"
Maximum threads to return, capped at 100.
integer
default:"0"
Threads to skip in the unfiltered Ed stream before filtering.
get_thread
Get a compact thread detail by global thread ID.integer
required
Global Ed thread ID as returned by
list_threads; for the number shown inside a course use get_course_thread.boolean
default:"false"
Also return Ed’s XML content; the plain-text document is always returned.
get_course_thread
Get a compact thread detail by course ID or code and course-local number.integer | string
required
Ed course ID or exact course code.
integer
required
One-based thread number as shown inside the course, the #N in the Ed thread list.
boolean
default:"false"
Also return Ed’s XML content; the plain-text document is always returned.
list_activity
List compact current-user activity, optionally filtered by course ID or code.integer | string
Ed course ID or exact course code to filter by. Omit for every course.
string
default:"all"
all, thread, answer, or comment.integer
default:"30"
Maximum items, capped at 50.
read_thread
Read one thread as Markdown. Pass either threadId, or courseId plus the course-local number.integer
Global Ed thread ID; use instead of
courseId and number.integer | string
Ed course ID or exact course code.
integer
Course-local thread number; requires
courseId.read_lesson
Read one lesson and its slides as Markdown.integer
required
Ed lesson ID.
read_slide
Read one lesson slide as Markdown.integer
required
Ed lesson slide ID.
mark_lessons_read
Mark matching lessons and slides as read using a course ID or code.integer | string
required
Ed course ID or exact course code.
boolean
default:"false"
Mark every lesson in the course; required when
queries is empty.string[]
default:"[]"
Case-insensitive substrings that must all appear in the lesson title or module name; at most 10. When
queries is empty, all must be true to mark every lesson of the course.number
default:"0"
Seconds to pause after each slide, 0 to 10. Raise it to go easy on Ed.
submit_slide_answer
Submit one-based quiz choices for one question.integer
required
Ed question ID as returned by
list_slide_questions.integer[]
required
One-based answer indexes as shown by
list_slide_questions; pass several for multiple-selection questions.boolean
default:"false"
Overwrite an answer already saved for this question.
submit_slide
Submit all saved answers for one quiz slide.integer
required
Ed slide ID whose saved answers are submitted, as returned by
get_lesson.create_thread
Create a thread in one course. body is Markdown and is converted to Ed’s document format. The thread is posted publicly to the course as the token owner and cannot be removed from here; ask the user before calling it.integer | string
required
Ed course ID or exact course code.
string
required
Thread title shown in the course thread list.
string
required
Post body in Markdown. It is converted to Ed’s document format before posting.
string
required
question to ask, post to discuss; announcement needs staff rights.string
Exact top-level category for the course.
boolean
default:"false"
Hide the author name from other students. Staff can still see it.
boolean
default:"false"
Post privately to course staff instead of the whole course.
EDSTEM_ALLOW_POSTING=1, MCP_ALLOW_POSTING=1, or the hosted service’s write scope.
reply_thread
Reply to one thread, or to one comment inside it. body is Markdown and is converted to Ed’s document format. The reply is posted publicly as the token owner and cannot be removed from here; ask the user before calling it.integer
required
Global Ed thread ID to reply to.
string
required
Reply body in Markdown. It is converted to Ed’s document format before posting.
integer
Reply under this comment of the thread instead of at the top level. The comment must belong to
threadId.string
answer or comment. Defaults to answer on question threads and comment elsewhere.boolean
default:"false"
Hide the author name from other students. Staff can still see it.
boolean
default:"false"
Post privately to course staff instead of the whole course.
EDSTEM_ALLOW_POSTING=1, MCP_ALLOW_POSTING=1, or the hosted service’s write scope.
list_modules
List the lesson modules of one course with the number of lessons in each. courseId accepts a numeric ID or course code. Use it to pick a module value for list_lessons.integer | string
required
Ed course ID or exact course code.