MCP server for Ed Discussion to expose Ed's full API to MCP clients.
edstem-mcp
MCP server for Ed Discussion — expose Ed's full API to Claude and other MCP clients.
Setup
npm install
npm run build
Set your API token (get one at https://edstem.org/us/settings/api-tokens):
export ED_API_TOKEN=your_token
export ED_REGION=us # optional: us (default), au, etc.
Claude Code
Add to ~/.claude.json:
{
"mcpServers": {
"edstem": {
"command": "node",
"args": ["/path/to/edstem-mcp/dist/index.js"],
"env": {
"ED_API_TOKEN": "your_token"
}
}
}
}
Tools (22)
| Tool | Description |
|---|---|
get_user |
Get authenticated user info and enrolled courses |
list_threads |
List threads in a course (sortable, paginated) |
get_thread |
Get thread by global ID with comments |
get_course_thread |
Get thread by course-local number (the # in the UI) |
search_threads |
Search threads by title, content, or category |
post_thread |
Create a new thread (supports markdown input) |
edit_thread |
Edit an existing thread |
lock_thread |
Lock a thread |
unlock_thread |
Unlock a thread |
pin_thread |
Pin a thread |
unpin_thread |
Unpin a thread |
endorse_thread |
Endorse a thread |
unendorse_thread |
Remove thread endorsement |
star_thread |
Star/bookmark a thread |
unstar_thread |
Remove star |
post_comment |
Post a comment or answer on a thread |
reply_to_comment |
Reply to an existing comment |
endorse_comment |
Endorse a comment |
unendorse_comment |
Remove comment endorsement |
accept_answer |
Accept a comment as the answer |
list_users |
List course roster (staff/admin) |
list_user_activity |
List a user's threads and comments |
upload_file_from_url |
Upload a file to Ed from a URL |
format_content |
Preview markdown to Ed XML conversion |
Resources (2)
| Resource | URI | Description |
|---|---|---|
| User Info | edstem://user |
Authenticated user details |
| Courses | edstem://courses |
Enrolled courses list |
Prompts (3)
| Prompt | Description |
|---|---|
check_assignment |
Look up assignment details, requirements, and staff clarifications |
unanswered_questions |
List unresolved questions in a course |
my_activity |
Show your recent posts and comments in a course |
Content Format
Thread and comment content uses Ed's XML document format. This server auto-converts markdown to Ed XML, so you can write content naturally:
# Heading
**Bold** and *italic* text with `inline code`
- Bullet list
- Items
1. Numbered
2. List
> [!info] This becomes an Ed callout
Pass raw Ed XML (starting with <document) to bypass conversion.
Testing
npm test
Uses Node's built-in test runner (node:test). Tests cover the markdown-to-XML content converter and API client (URL construction, headers, error handling).
Tools (24)
get_userGet authenticated user info and enrolled courseslist_threadsList threads in a course (sortable, paginated)get_threadGet thread by global ID with commentsget_course_threadGet thread by course-local numbersearch_threadsSearch threads by title, content, or categorypost_threadCreate a new thread (supports markdown input)edit_threadEdit an existing threadlock_threadLock a threadunlock_threadUnlock a threadpin_threadPin a threadunpin_threadUnpin a threadendorse_threadEndorse a threadunendorse_threadRemove thread endorsementstar_threadStar/bookmark a threadunstar_threadRemove starpost_commentPost a comment or answer on a threadreply_to_commentReply to an existing commentendorse_commentEndorse a commentunendorse_commentRemove comment endorsementaccept_answerAccept a comment as the answerlist_usersList course roster (staff/admin)list_user_activityList a user's threads and commentsupload_file_from_urlUpload a file to Ed from a URLformat_contentPreview markdown to Ed XML conversionEnvironment Variables
ED_API_TOKENrequiredAPI token from Ed Discussion settingsED_REGIONEd Discussion region (e.g., us, au)Configuration
{"mcpServers": {"edstem": {"command": "node", "args": ["/path/to/edstem-mcp/dist/index.js"], "env": {"ED_API_TOKEN": "your_token"}}}}