MCP server for Coursera — 36 tools: speedrun courses, solve quizzes, manage certificates, LinkedIn integration, adaptive scraping
The most advanced MCP server for Coursera.
87 tools · 8 integration layers · full course automation · Obsidian export
██████╗ ██████╗ ██╗ ██╗██████╗ ███████╗███████╗██████╗ █████╗ ███╗ ███╗ ██████╗██████╗
██╔════╝██╔═══██╗██║ ██║██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗ ████╗ ████║██╔════╝██╔══██╗
██║ ██║ ██║██║ ██║██████╔╝███████╗█████╗ ██████╔╝███████║█████╗██╔████╔██║██║ ██████╔╝
██║ ██║ ██║██║ ██║██╔══██╗╚════██║██╔══╝ ██╔══██╗██╔══██║╚════╝██║╚██╔╝██║██║ ██╔═══╝
╚██████╗╚██████╔╝╚██████╔╝██║ ██║███████║███████╗██║ ██║██║ ██║ ██║ ╚═╝ ██║╚██████╗██║
╚═════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝
Give any AI agent — Claude, GPT, or your own — full programmatic access to Coursera. Enroll in courses, speedrun lectures, solve quizzes, submit assignments, earn certificates, and push them to LinkedIn. All from a single MCP server.
Highlights
| | Feature | How |
|---|---|---|
| 🚀 | Speedrun entire courses | speedrun_course completes lectures, quizzes, discussions, and graded exams in one call |
| 🔓 | Freemium bypass | Auto-detects enrolledViaFreemiumAt restrictions and re-enrolls without the flag |
| 🧠 | Solve quizzes via GraphQL | Elimination-learning solver: submits, learns from feedback, retries until passing |
| 📝 | Submit everything | Written, peer review, discussion prompts, programming assignments — all automated |
| 📊 | Full analytics | Learner stats, XP, streaks, goals, module progress, detailed grades, timelines |
| 🔗 | LinkedIn integration | Auto-add certificates to your profile with duplicate detection |
| 🕷️ | Scrapling scraping | Adaptive parser (1775× faster than BeautifulSoup) + JS rendering |
| 🛡️ | Stealth browser | rebrowser-puppeteer + fingerprint injection defeats Cloudflare/bot detection |
| 🔑 | Cookie-based auth | No passwords stored — session cookies via Cookie-Editor |
| 📓 | Obsidian export | Summarize courses into structured study notes and write directly to your Obsidian vault |
Prerequisites
1. Install Cookie-Editor
All authentication uses browser session cookies. Install Cookie-Editor to export them:
| Browser | Install |
|:---:|:---|
| | Chrome Web Store |
|
| Firefox Add-ons |
|
| Edge Add-ons |
2. Export Coursera Cookies
- Log into coursera.org
- Click Cookie-Editor icon → Export → copy
CAUTHandCSRF3-Tokenvalues - Paste into
.env(see Setup)
3. Export LinkedIn Cookies (optional)
- Log into linkedin.com
- Click Cookie-Editor icon → Export → copy
li_atandJSESSIONIDvalues - Paste into
.env
Setup
git clone https://github.com/VoidChecksum/coursera-mcp.git
cd coursera-mcp
uv venv .venv
uv pip install -p .venv/bin/python mcp curl_cffi skipera requests "scrapling[fetchers]"
.venv/bin/scrapling install
npm install rebrowser-puppeteer puppeteer-extra puppeteer-extra-plugin-stealth \
fingerprint-generator fingerprint-injector
cp .env.example .env
chmod 600 .env
.env format
COURSERA_CAUTH=<paste CAUTH cookie value>
COURSERA_CSRF3=<paste CSRF3-Token cookie value>
LINKEDIN_LI_AT=<paste li_at cookie value>
LINKEDIN_JSESSIONID=<paste JSESSIONID value, without quotes>
[!NOTE] When Coursera or LinkedIn logs you out, re-export cookies with Cookie-Editor and update
.env.
Connect to Your AI Client
Claude Desktop / Claude Code
Add to your MCP config (claude_desktop_config.json or via CLI):
{
"mcpServers": {
"coursera": {
"command": "/path/to/coursera-mcp/run.sh"
}
}
}
Or via CLI:
claude mcp add coursera /path/to/coursera-mcp/run.sh
Other MCP Clients
Any MCP-compatible client that supports stdio transport works.
Point it at run.sh which loads .env and starts the server.
Tools (87)
Course Discovery & Enrollment
| Tool | Description |
|:---|:---|
| whoami | Verify session, return user ID |
| my_courses | List enrolled courses (name, slug, role) |
| search | Search Coursera catalog via GraphQL |
| course_details | Full course metadata by slug |
| enroll_course | Enroll in a course, auto-bypassing freemium restrictions |
| unenroll_course | Delete course enrollment |
| batch_enroll | Enroll in multiple courses at once with freemium bypass |
| reset_course_deadlines | Reset/extend deadlines to unlock expired submissions |
Speedrunning
| Tool | Description |
|:---|:---|
| speedrun_course | Complete an entire course in one call: freemium bypass → lectures → quizzes → discussions → graded exams with elimination learning |
| speedrun_all | Speedrun every enrolled course, skipping 100% courses |
| complete_course_lectures | Mark all lectures, readings, widgets, and labs as completed in parallel |
Progress, Grades & Certificates
| Tool | Description |
|:---|:---|
| get_course_grades | Grades, outcomes, and passing state for all graded items |
| get_course_progress | Overall progress % and per-item completion status |
| get_detailed_grades | Full grade breakdown with item outcomes and assignment group grades |
| get_module_progress | Per-module completion status (completed/in-progress/not-started) |
| get_home_progress | Modules completed and modules passed counts |
| get_certificates | All certificates with codes and verification URLs |
| get_certificate_details | Certificate grade, grant date, verification URL, preview image |
| get_certificate_image | Certificate preview image URL |
Learner Analytics (Reverse-Engineered GraphQL)
| Tool | Description |
|:---|:---|
| get_learner_stats | Total XP, items completed, learning minutes, active days, weekly stats |
| get_weekly_streaks | Current and target weekly learning streaks |
| get_weekly_goals | Day-by-day goal tracking and progress status |
| get_course_timeline | Start/end dates, ahead/behind/overdue schedule status |
| get_profile | User ID, full name, locale, timezone, profile photos |
| get_subscription_status | Coursera Plus/trial/payment status and subscription details |
| check_product_ownership | Enrollment type (freemium/paid/Plus), ownership status |
| send_learning_heartbeat | Send learning time heartbeat (registers active time on a course item) |
| get_cohorts | Social learning cohorts the user belongs to |
| get_item_deadlines | Per-item content deadlines (more granular than session deadlines) |
Skill & Career Intelligence
| Tool | Description |
|:---|:---|
| get_skill_xp | Skill area XP breakdown per course (gained vs potential) |
| get_item_xp | XP earned vs potential for a specific course item |
| get_learning_plan | AI-generated personalized learning plan (role, skills, courses) |
| get_related_courses | Related course recommendations |
| get_interested_careers | User's interested career roles |
| get_career_roles | Career role recommendations for a specialization |
| get_specialization_progress | Progress across all courses in a specialization |
| get_course_info | Course description, partners, instructors, workload, primary specialization |
Quiz & Assessment (GraphQL — no browser)
| Tool | Description |
|:---|:---|
| get_quiz_questions_api | Fetch questions + option IDs via GraphQL, handles START_NEW_ATTEMPT |
| submit_quiz_answers_api | Submit answers, get instant grade + per-question feedback |
| get_quiz_state | Check quiz attempt status, grade, and rate-limit info without starting |
| get_discussion_prompt | Get discussion prompt content and metadata |
| submit_discussion_prompt_answer | Post answer to discussion prompt |
Content Extraction
| Tool | Description |
|:---|:---|
| get_video_transcript | Clean text transcript of any lecture video (VTT dedup) |
| get_supplement_content | Clean text of any reading/supplement |
| get_lecture_assets | Downloadable slides, PDFs, and supplementary files |
| get_course_references | Glossary and reference materials |
| get_instructor_notes | Module-level instructor notes |
| get_learning_objectives | Module learning objectives |
| get_user_notes | Personal study notes for a course item |
| create_user_note | Create study notes on lectures/readings with video timestamps |
Course Structure & Navigation
| Tool | Description |
|:---|:---|
| course_materials | Full course syllabus: modules, lessons, items |
| module_items | Items in a specific module (lectures, quizzes, readings) |
| get_course_navigation | Full navigation with deadline status per module |
| get_course_schedule | Session deadlines per module and item |
| get_forum_structure | Full forum hierarchy (IDs, types, descriptions) |
| get_specialization_info | Specialization courses, partners, pricing |
| get_career_roles | Career role recommendations for specializations |
| get_ai_grading_eligibility | Check if AI peer review grading is available |
Browser Automation (stealth Chromium)
| Tool | Description |
|:---|:---|
| get_quiz_attempt | Start/resume quiz in browser, extract all questions |
| submit_quiz_attempt | Answer quiz, sign honor code, submit |
| get_assignment_instructions | Extract assignment instructions + form fields |
| submit_assignment | Submit written/peer assignment (text + files) |
| get_workspace_url | Get Jupyter/lab workspace URL |
| mark_item_completed | Trigger completion by loading item page |
| get_forum_threads | Extract discussion forum threads |
| post_forum_thread | Post new thread in forums |
| get_peer_review_questions | Get peer review criteria + rubrics |
| submit_peer_review_evaluation | Submit peer review grading |
| get_programming_assignment_instructions | Get programming assignment schema |
| submit_programming_api | Submit code to Coursera autograder |
Scrapling (adaptive web scraping)
| Tool | Description |
|:---|:---|
| scrapling_api_fetch | Fast API call via Scrapling (stealth httpx) |
| scrape_course_page | Scrape authenticated pages with JS rendering (Playwright) |
| scrape_url | General-purpose scraper with CSS selectors |
LinkedIn Integration
| Tool | Description |
|:---|:---|
| get_linkedin_certifications | Fetch existing certs on LinkedIn profile |
| add_certificate_to_linkedin | Add cert to LinkedIn (auto-skips duplicates) |
| add_all_certificates_to_linkedin | Batch-add all Coursera certs (dedup) |
Study & Planning
| Tool | Description |
|:---|:---|
| course_content_digest | Bundle a module's transcripts + readings into one study document |
| search_course_transcripts | Full-text search across a course's lecture transcripts |
| learning_dashboard | Progress %, certificate, and grade across all enrolled courses |
| get_upcoming_deadlines | Session end dates across enrolled courses, soonest first |
| export_deadlines_ics | Export deadlines as an importable .ics calendar |
| get_specialization | Specialization details + its course list |
Obsidian Integration
| Tool | Description |
|:---|:---|
| summarize_module | Summarize a module's lectures and readings into concise study notes |
| summarize_course | Summarize an entire course organized by module |
| export_course_to_obsidian | Summarize + write to Obsidian vault with frontmatter, wiki-links, callouts, and tags |
| export_module_to_obsidian | Export a single module to Obsidian |
| export_all_courses_to_obsidian | Batch export all enrolled courses to Obsidian |
Reverse Engineering
Several tools were built by intercepting live browser traffic and reverse-engineering Coursera's internal APIs:
Freemium Bypass — Coursera sets enrolledViaFreemiumAt on free enrollments, which causes all opencourse.v1 video-event and supplement-completion endpoints to return 403. The bypass deletes the enrollment via DELETE /api/openCourseMemberships.v1/{uid}~{courseId} (with an empty {} body — Akka backend requires it) and re-creates it via POST without the freemium flag.
GraphQL Gateway — 48+ operations captured from graphql-gateway, including GetLearnerStats, WeeklyStreaks_QueryWeeklyStreaks, GetLearnerWeeklyGoals, GetCourseBranchModuleProgressByCourse, GetLearnerCourseTimeline, GetMyCertificateByProduct, CourseNavigation, GetAiGradingEligibilityByCourse, CareerRolesQuery, and GetProductOwnership.
REST APIs — 61+ endpoints mapped from browser network traffic, including onDemandCourseViewGrades.v1, onDemandReferences.v1, onDemandLectureAssets.v1, onDemandInstructorNotes.v1, userNotes.v1, onDemandCourseForums.v1, onDemandLearningObjectives.v2, and subscriptions.v1.
Quiz Solver — Elimination-learning algorithm: submits first-option answers, gets per-question feedback marking options correct/incorrect, persists learned answers to ~/.skipera/gradedData/, and retries with improved answers until passing (≥70%). Handles START_NEW_ATTEMPT, rate limits, and MultipleChoiceReflectQuestion types.
Architecture
coursera-mcp/
├── server.py Python MCP server — all 87 tools
├── automation.mjs Stealth browser automation (Node.js)
├── run.sh Launcher (loads .env, starts stdio)
├── .env Your cookies (gitignored)
├── .env.example Template
└── .gitignore
┌──────────────────────────────────────────────────────────────────────┐
│ MCP Clients (Claude / GPT / Custom) │
├──────────────────────────────────────────────────────────────────────┤
│ server.py · FastMCP stdio │
├─────────┬─────────┬──────────┬───────────┬──────────┬────────┬───────┤
│ REST │ GraphQL │ Scrapling│ Browser │ LinkedIn │ gRPC │Obsidi-│
│ API │ Gateway │ │ Stealth │ Voyager │ API │an API │
│ │ │ │ Puppeteer │ + Browser│ │ │
├─────────┴─────────┤ ├───────────┤ │ │ │
│ curl_cffi │ Fetcher │automation │automation│ │ REST │
│ skipera │ Dynamic │ .mjs │ .mjs │ │:27123 │
│ requests │ Fetcher │ (Node.js) │ (Node.js)│ │ │
└───────────────────┴──────────┴───────────┴──────────┴────────┴───────┘
Security
| | |
|---|---|
| No passwords stored | Cookie-based auth only — session tokens from your browser |
| .env is gitignored | Secrets never enter version control |
| No hardcoded credentials | All secrets read from os.environ at runtime |
| No secret logging | Cookies are never printed or logged to stdout/stderr |
| .env.example is safe | Contains only empty placeholders |
[!CAUTION] Never commit your
.envfile. If you accidentally expose cookies, log out of Coursera/LinkedIn immediately to invalidate them.
License
Built for agents that learn faster than humans.