MCP Coursera Learning Server
Enables searching, enrolling, and tracking Coursera courses and certificates through LibreChat, with multi-user secure authentication and caching.
README
š MCP Coursera Learning Server for LibreChat
A custom, secure, and production-ready Model Context Protocol (MCP) server that provides Coursera learning assistant capabilities to LibreChat. Search courses, retrieve detailed syllabi, dynamically enroll in courses, track learning progress, and extract verified accomplishments and certificates.
This server is specifically optimized for multi-user environments, featuring secure personal credential storage, isolated browser sessions, and advanced Cloudflare Turnstile bypass mechanisms.
Changelog:
09/07/26:- Browser Context Isolation: Enforced strict per-request browser context segregation to guarantee no session leakage between LibreChat users.
- Multi-step Login Support: Refactored authentication to handle Coursera's 2-step login page (
Continue->Next). - Cloudflare Turnstile Bypass: Implemented typing delays and natural pauses to simulate human behavior, alongside stealth JavaScript injections to mask automation flags.
- Playwright Session State Persistence: Implemented saving cookies and storage states to disk per user (
sessions/{userId}_state.json), reducing subsequent request time to 7-10s. - Smart Scroll with Retry Buffer: Re-implemented dynamic scrolling with 1.5s delays and 2-consecutive unchanged height checks to bypass slow lazy loading elements.
05/07/26:- Force Overflow Auto: Programmatically injected scripts to override overflow hidden styles commonly applied by popup advertisements that block scrolling.
- Anchor-Upwards Traversal Scraper: Overhauled scrapers to look for unique
/learn/and/accomplishmentsanchors and traverse parents, guaranteeing 100% data extraction. - Certificates Categorization: Supports extracting certificate types (
SpecializationvsCourse) and public verification links from the/accomplishmentspage. - Smart SQLite Caching: Implemented a Key-Value caching system with customizable TTL (3 hours for courses, 12 hours for certificates) and support for a
force_refreshoverride to ensure instantaneous API responses.
š Project Structure
mcp-coursera/
āāā src/
ā āāā index.ts # Express server & Streamable HTTP transport + tools router
ā āāā db.ts # SQLite database manager (credentials storage & key-value cache)
ā āāā encrypt.ts # AES-256-CBC encryption manager for user passwords
ā āāā ...
āāā data/ # [Git Ignored] Local database storage & debug screenshots
ā āāā coursera.db # SQLite Database
ā āāā login_failed.png # Automatic screenshot taken on login/anti-bot failure
āāā Dockerfile # Multi-stage optimized Playwright container
āāā docker-compose.yml # Standalone deployment file
āāā tsconfig.json # TypeScript compiler config
āāā package.json
š ļø Tools Provided
| Tool | Arguments | Required | Description |
|---|---|---|---|
search_courses |
query, difficulty, language, limit |
query |
Search Coursera for courses matching keywords. |
get_course_details |
course_url |
course_url |
Extract syllabus, instructors, duration, skills, and certificate info. |
enroll_course |
course_url, email?, password? |
course_url |
Automatically enroll in a course (uses saved credentials if not passed). |
get_my_courses |
email?, password?, force_refresh? |
None | Fetch enrolled courses, progress percentages, last accessed date, and status. |
get_certificates |
email?, password?, force_refresh? |
None | Extract titles, dates, issuer names, and public verification URLs of earned certificates. |
unlink_coursera_account |
None | None | Securely delete your saved Coursera credentials and all cached data. |
šø Screenshots & Usage Examples
š Searching Courses (search_courses)
Retrieve search results containing courses matching user keywords on Coursera:

š Extracting Course Syllabus (get_course_details)
Scrapes instructors, duration, skills, and weekly syllabus detail of any Coursera course:

š Tracking Progress (get_my_courses)
Fetches all enrolled courses with exact progress percentage metrics and completed status:

š Verifying Accomplishments & Certificates (get_certificates)
Extracts earned Course/Specialization certificates, dates, and official verification links:

š Multi-User Secure Authentication & Web Portal
Rather than hardcoding credentials globally, this server features a secure OAuth-like Web Portal where individual LibreChat users securely link their Coursera accounts:
1. Step-by-Step Account Linking Flow
-
Identifier Extraction: The server extracts the user's ID (
x-user-idheader) from the incoming chat request. -
Dynamic Link Generation: If no credentials exist in the database, the tool interrupts execution and prompts a secure, personalized portal URL:

-
AES-256-CBC Encryption: The user clicks the link and enters their credentials securely in the Web Portal. The server encrypts the password using an AES-256-CBC algorithm with a host-configured
ENCRYPTION_KEYbefore storing it in SQLite:
-
Successful Integration: Once saved, the user is notified of successful account link in LibreChat, with zero password leakage to the LLM (AI) or chat history:

ā” Smart SQLite Caching
Scraping dynamic web pages using a headless browser can take 15-20 seconds per request. To deliver an outstanding user experience, this server implements an SQLite-based Key-Value Cache:
- Course Progress Cache: Cached for 3 hours (under key
"courses"). - Certificates Cache: Cached for 12 hours (under key
"certificates"). - Bypassing Cache (
force_refresh): Users can force a real-time scrape (e.g., when they just completed a course) by asking the AI to "refresh my progress" or "check again". The Agent will set theforce_refresh: trueparameter, bypassing the cache.
š”ļø Bypassing Cloudflare Turnstile
Coursera uses Cloudflare Turnstile to protect its login interface. Headless Chromium running inside a Docker container is highly prone to being flagged. This server bypasses detection using:
- Human-like Interaction (Humanization):
- Typing Delays: Instead of immediate form filling, characters are typed one-by-one with a delay of 150ms for emails and 200ms for passwords.
- Natural Pauses: Natural delays of 1.5s - 3.5s are placed between gtyping and clicking actions to simulate human reaction times.
- Stealth Script Injections:
- Nullifies
navigator.webdriverto conceal browser automation. - Mocks the
window.chromeobject and populates a dummy list ofnavigator.plugins.
- Nullifies
- Localization Alignment:
- Configures
Localetoen-USandTimezonetoAsia/Ho_Chi_Minh(customizable) to force the Coursera interface to English, ensuring high accuracy text pattern matching.
- Configures
š Installation & Deployment (Docker Compose)
This server is designed to run alongside LibreChat as a sibling service.
Step 1: Directory Setup
libre/
āāā LibreChat/ ā LibreChat repository root
ā āāā docker-compose.override.yml
ā āāā librechat.yaml
āāā mcp-coursera/ ā This MCP server repository
āāā src/
āāā Dockerfile
āāā .env
Step 2: Configure Environment Variables
Copy .env.example to .env inside mcp-coursera/ and configure:
PORT=3014
ENCRYPTION_KEY=generate_a_secure_32_character_hex_key_here
SERVER_URL=http://localhost:3014
Step 3: Add to docker-compose.override.yml
Add the mcp-coursera service to your LibreChat/docker-compose.override.yml:
services:
mcp-coursera:
container_name: mcp-coursera
build: ../mcp-coursera
restart: always
env_file:
- ../mcp-coursera/.env
environment:
NODE_ENV: ${NODE_ENV:-production}
PORT: 3014
ports:
- "3014:3014" # Maps Web Portal to host
volumes:
- ../mcp-coursera/data:/app/data # Persists database and screenshot data
networks:
- default
Step 4: Register in librechat.yaml
Add the server registration to your librechat.yaml:
mcpSettings:
allowedDomains:
- mcp-coursera
mcpServers:
coursera-learning:
type: streamable-http
url: http://mcp-coursera:3014/mcp
title: Coursera Learning MCP
description: Access Coursera learning progress, certificates, and course enrollment.
timeout: 120000 # Increased timeout to handle multi-step login and navigation retry
headers:
x-user-id: '{{LIBRECHAT_USER_ID}}'
š” Recommended Agent System Instructions
Paste the following into your Agent's Instructions / System Prompt in LibreChat:
You are a Learning Assistant with access to Coursera tools.
1. Checking Progress & Certificates:
When asked to check course progress, certificates, or enroll, invoke the respective tools.
2. Handling "Authentication required" Errors:
If a tool returns an error message like: "Authentication required. Please link your Coursera account securely at: http://...", you MUST present this exact URL returned by the tool to the user as a clickable markdown link. DO NOT replace the userId parameter with placeholders like "xxxx" or "unknown", use the real dynamic URL provided.
3. Security Warning:
NEVER ask the user to type their Coursera password directly into the chat. If they try to do so, politely reject it and instruct them to use the secure link instead.
4. Cache Refreshing:
Default calls to get_my_courses and get_certificates use cached data. If the user explicitly asks to "update", "refresh", or "check again", set the `force_refresh` parameter to `true`.
5. Unlinking Account:
If the user wants to log out or remove their credentials, invoke the `unlink_coursera_account` tool.
š§ Debugging & Troubleshooting
Screenshot Debugging
If a tool execution fails or experiences an anti-bot challenge:
- Open the local directory
mcp-coursera/data/on the host machine. - Open
login_failed.pngto view the exact visual state of the browser.
Inspecting logs
docker logs -f mcp-coursera
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.