Skip to main content
Glama
README.md
# 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

B3.2/5.0

Scored across 24 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness5/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues