MCP Servers

A collection of Model Context Protocol servers, templates, tools and more.

MCP server for Coursera — 36 tools: speedrun courses, solve quizzes, manage certificates, LinkedIn integration, adaptive scraping

Created 6/12/2026
Updated about 6 hours ago
Repository documentation and setup instructions

Coursera MCP

The most advanced MCP server for Coursera.
87 tools · 8 integration layers · full course automation · Obsidian export

Setup Tools Architecture License

Python Node.js MCP Scrapling Stealth


 ██████╗ ██████╗ ██╗   ██╗██████╗ ███████╗███████╗██████╗  █████╗       ███╗   ███╗ ██████╗██████╗
██╔════╝██╔═══██╗██║   ██║██╔══██╗██╔════╝██╔════╝██╔══██╗██╔══██╗      ████╗ ████║██╔════╝██╔══██╗
██║     ██║   ██║██║   ██║██████╔╝███████╗█████╗  ██████╔╝███████║█████╗██╔████╔██║██║     ██████╔╝
██║     ██║   ██║██║   ██║██╔══██╗╚════██║██╔══╝  ██╔══██╗██╔══██║╚════╝██║╚██╔╝██║██║     ██╔═══╝
╚██████╗╚██████╔╝╚██████╔╝██║  ██║███████║███████╗██║  ██║██║  ██║      ██║ ╚═╝ ██║╚██████╗██║
 ╚═════╝ ╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚══════╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝      ╚═╝     ╚═╝ ╚═════╝╚═╝

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-4285F4?style=flat-square&logo=googlechrome&logoColor=white - Coursera MCP by VoidChecksum | Chrome Web Store | | Firefox-FF7139?style=flat-square&logo=firefoxbrowser&logoColor=white - Coursera MCP by VoidChecksum | Firefox Add-ons | | Edge-0078D7?style=flat-square&logo=microsoftedge&logoColor=white - Coursera MCP by VoidChecksum | Edge Add-ons |

2. Export Coursera Cookies

  1. Log into coursera.org
  2. Click Cookie-Editor icon → Export → copy CAUTH and CSRF3-Token values
  3. Paste into .env (see Setup)

3. Export LinkedIn Cookies (optional)

  1. Log into linkedin.com
  2. Click Cookie-Editor icon → Export → copy li_at and JSESSIONID values
  3. 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 .env file. If you accidentally expose cookies, log out of Coursera/LinkedIn immediately to invalidate them.


License

MIT


Built for agents that learn faster than humans.

Quick Setup
Installation guide for this server

Install Package (if required)

uvx coursera-mcp

Cursor configuration (mcp.json)

{ "mcpServers": { "voidchecksum-coursera-mcp": { "command": "uvx", "args": [ "coursera-mcp" ] } } }