edstem-mcp
# edstem-mcp
MCP server for [Ed Discussion](https://edstem.org) — expose Ed's full API to Claude and other MCP clients.
## Setup
```bash
npm install
npm run build
```
Set your API token (get one at https://edstem.org/us/settings/api-tokens):
```bash
export ED_API_TOKEN=your_token
export ED_REGION=us # optional: us (default), au, etc.
```
## Claude Code
Add to `~/.claude.json`:
```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:
```markdown
# 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
```bash
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).
TDQS
Scored across 24 tools
Most tools have distinct purposes targeting specific resources and actions (e.g., get_thread vs. list_threads, post_thread vs. edit_thread). However, some overlap exists between post_comment and reply_to_comment, as both involve adding comments, though the latter specifies replying to an existing comment. Tools like star_thread and unstar_thread are clearly paired opposites, reducing ambiguity.
Tool names follow a highly consistent verb_noun pattern throughout, using snake_case uniformly. Actions are clear (e.g., get, list, post, edit, lock, unlock) and paired opposites are consistently prefixed (e.g., endorse/unendorse, pin/unpin). This predictability makes it easy for an agent to understand and select tools.
With 24 tools, the count is borderline high for a discussion forum server, potentially feeling heavy. While the tools cover many operations, some might be niche (e.g., format_content, upload_file_from_url) or staff-only (e.g., endorse_comment), which could be consolidated or omitted without losing core functionality. A more streamlined set of 15-20 tools might be more appropriate.
The tool surface provides comprehensive coverage for a discussion forum domain, including full CRUD/lifecycle operations for threads and comments (create, read, update, delete via editing/removing actions), moderation features (lock, pin, endorse), search, user management, and file uploads. There are no obvious gaps, and agents can handle typical workflows without dead ends.