This catalog lists the 23 tools the Ed Discussion Model Context Protocol (MCP) server provides, in the order it lists them. Descriptions are the exact text the server ships for each tool. Every tool is listed on every surface — stdio (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_thread and reply_thread post publicly to a course. They fail with INSUFFICIENT_SCOPE unless posting is allowed: EDSTEM_ALLOW_POSTING=1 for stdio, MCP_ALLOW_POSTING=1 for a self-deployed Worker, or the write scope granted during the hosted service’s OAuth consent.
  • mark_lessons_read, submit_slide_answer and submit_slide write 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.
See Security for the full gating model. For the CLI equivalents, see /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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

get_lesson

Get one lesson with slide content.
integer
required
Ed lesson ID as returned by list_lessons.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only. Returns a JSON block plus one 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.
Available on: stdio, self-deployed Worker, hosted. Read-only. Returns a JSON block plus one 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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

list_slide_responses

List saved quiz responses for one lesson slide.
integer
required
Ed slide ID as returned by get_lesson.
Available on: stdio, self-deployed Worker, hosted. Read-only.

get_slide

Get one lesson slide with its content.
integer
required
Ed slide ID as returned by get_lesson.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Read-only.

read_lesson

Read one lesson and its slides as Markdown.
integer
required
Ed lesson ID.
Available on: stdio, self-deployed Worker, hosted. Read-only.

read_slide

Read one lesson slide as Markdown.
integer
required
Ed lesson slide ID.
Available on: stdio, self-deployed Worker, hosted. Read-only.

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.
Available on: stdio, self-deployed Worker, hosted. Writes to Ed (marks progress). Requires write access, not the posting flag: unconditional on stdio and a self-deployed Worker, the OAuth write scope on hosted.

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.
Available on: stdio, self-deployed Worker, hosted. Writes to Ed. Requires write access, not the posting flag: unconditional on stdio and a self-deployed Worker, the OAuth write scope on hosted.

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.
Available on: stdio, self-deployed Worker, hosted. Writes to Ed. Requires write access, not the posting flag: unconditional on stdio and a self-deployed Worker, the OAuth write scope on hosted.

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.
Available on: stdio, self-deployed Worker, hosted. Writes to Ed, publicly by default. Gated by the posting flag: 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.
Available on: stdio, self-deployed Worker, hosted. Writes to Ed, publicly by default. Gated by the posting flag: 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.
Available on: stdio, self-deployed Worker, hosted. Read-only.