# Send EdStem to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "edstem",
    "name": "EdStem",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/axel5o5/edstem",
    "canonicalUrl": "https://clawhub.ai/axel5o5/edstem",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/edstem",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=edstem",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "CHANGELOG.md",
      "MIGRATION_NOTES.md",
      "PUBLISHING.md",
      "README.md",
      "SKILL.md",
      "scripts/fetch-edstem.py"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "slug": "edstem",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T00:27:15.319Z",
      "expiresAt": "2026-05-07T00:27:15.319Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=edstem",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=edstem",
        "contentDisposition": "attachment; filename=\"edstem-1.1.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "edstem"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/edstem"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/edstem",
    "downloadUrl": "https://openagent3.xyz/downloads/edstem",
    "agentUrl": "https://openagent3.xyz/skills/edstem/agent",
    "manifestUrl": "https://openagent3.xyz/skills/edstem/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/edstem/agent.md"
  }
}
```
## Documentation

### EdStem

Fetch and organize EdStem discussion threads from any course or institution with automatic staff/student differentiation.

### Quick Start

Fetch recent threads for any course:

cd /home/axel/.openclaw/workspace/skills/edstem/scripts
python3 fetch-edstem.py <course_id> [output_dir] [--course-name "Course Name"]

Examples:

# Fetch to default directory (./edstem-<course_id>)
python3 fetch-edstem.py 92041

# Fetch to specific directory
python3 fetch-edstem.py 92041 ./machine-learning

# Specify course name for clearer output
python3 fetch-edstem.py 92041 --course-name "Machine Learning"

# Combine directory and course name
python3 fetch-edstem.py 92041 ./ml-course --course-name "Machine Learning"

# Fetch more threads (default is 10)
python3 fetch-edstem.py 92041 --limit 25

### Finding Your Course ID

To find your EdStem course ID:

Log into EdStem and navigate to your course
Look at the URL: https://edstem.org/us/courses/<course_id>/
The number in the URL is your course ID

Alternatively, use the API to list your courses:

curl -H "Authorization: Bearer YOUR_TOKEN" https://us.edstem.org/api/user | jq '.courses[] | {id: .course.id, name: .course.name}'

### What Gets Fetched

For each course:

threads.json - Full thread list with metadata
thread-XXX.md - Individual threads formatted as markdown

Thread title, category, timestamps
Original post content
All answers and comments
[STAFF] or [STUDENT] tags on every post

### Features

Institution-agnostic: Works with any school using EdStem
Staff differentiation: Clearly marks instructor/TA posts vs student posts
Structured output: Markdown format for easy reading and searching
API-based: Uses EdStem's official API (no scraping)
Flexible output: Choose your own output directory and organization scheme

### Authentication

The skill uses a bearer token stored in the Python script. To use with your own account:

Log into EdStem in your browser
Open Developer Tools → Network tab
Reload any EdStem page
Find an API request and copy the Authorization: Bearer ... token
Update ED_TOKEN in scripts/fetch-edstem.py

Current token location: Line 20 in scripts/fetch-edstem.py

If API calls fail (401 Unauthorized), your token likely expired and needs refresh.

### fetch-edstem.py (recommended)

Full-featured Python script with markdown formatting and staff/student differentiation.

Usage:

python3 scripts/fetch-edstem.py <course_id> [output_dir] [options]

Options:

output_dir - Where to save threads (default: ./edstem-<course_id>)
--course-name NAME - Display name for the course
--limit N - Number of threads to fetch (default: 10)

Features:

Fetches thread metadata and full details
Full markdown formatting with answers and comments
Automatic staff role detection
JSON cache of thread list
Auto-creates output directory

### fetch-edstem.sh (lightweight alternative)

Bash/curl version for raw JSON fetching without dependencies.

Usage:

bash scripts/fetch-edstem.sh <course_id> [output_dir]

Outputs:

Raw JSON files for each thread
Requires manual formatting or post-processing

### Check for new posts

python3 scripts/fetch-edstem.py 92041 ~/courses/ml-spring-2025

### Sync multiple courses

# Create a simple sync script
for course in "92041:machine-learning" "94832:advanced-rl"; do
    IFS=':' read -r id name <<< "$course"
    python3 scripts/fetch-edstem.py $id ~/courses/$name --course-name "$name"
done

### Review recent activity

After fetching, check the markdown files:

ls -lt ./edstem-92041/*.md | head
cat ./edstem-92041/thread-001.md

### Search across threads

grep -r "gradient descent" ./edstem-92041/*.md

### Output Structure

<output_dir>/
├── threads.json              # Thread metadata
├── thread-001.md             # Individual threads
├── thread-002.md
└── ...

Each markdown file contains:

Thread metadata (number, title, category, timestamps)
Original post with author role
All answers (sorted, with role tags)
All comments (with role tags)

### With LLM agents

# Fetch threads and analyze with your agent
python3 fetch-edstem.py 92041 ./course-data
# Then: "Summarize the most common questions in ./course-data/"

### Automated monitoring

# Add to cron for daily sync
0 9 * * * cd /path/to/skills/edstem/scripts && python3 fetch-edstem.py 92041 ~/courses/ml

### Custom organization

# Organize by semester and institution
python3 fetch-edstem.py 92041 ~/school/stanford/2025-spring/cs229
python3 fetch-edstem.py 94832 ~/school/mit/2025-spring/6.7920

### Troubleshooting

401 Unauthorized: Token expired. Re-authenticate and update ED_TOKEN in the script.

Course not found: Verify the course ID and that your account has access.

Empty threads: Check that the course has discussion posts and you're enrolled.

Rate limiting: EdStem may rate-limit API requests. Add delays between fetches if needed.

### Contributing

This skill is open-source and institution-agnostic by design. Improvements welcome:

Better content parsing (EdStem uses XML-based document format)
Support for filtering by category or date range
Incremental sync (only fetch new threads)
Export to other formats (JSON, HTML, etc.)

### Version History

1.1.0 - Made institution-agnostic with flexible parameters
1.0.0 - Initial release
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: axel5o5
- Version: 1.1.0
## Source health
- Status: healthy
- Item download looks usable.
- Yavira can redirect you to the upstream package for this item.
- Health scope: item
- Reason: direct_download_ok
- Checked at: 2026-04-30T00:27:15.319Z
- Expires at: 2026-05-07T00:27:15.319Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/edstem)
- [Send to Agent page](https://openagent3.xyz/skills/edstem/agent)
- [JSON manifest](https://openagent3.xyz/skills/edstem/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/edstem/agent.md)
- [Download page](https://openagent3.xyz/downloads/edstem)