A Model Context Protocol (MCP) server that extends the official Obsidian MCP server with intelligent learning and second-brain features.
- AI-Generated Challenges: Create personalized learning challenges based on topic, difficulty, and type
- Progress Tracking: Monitor time spent and status for each challenge
- Challenge Types: Knowledge, Practical, Teaching, Analysis, Creative
- Difficulty Levels: Beginner, Intermediate, Advanced, Expert
- Activity Recording: Track learning sessions with duration and mastery ratings
- Statistics Dashboard: View time spent, average mastery, and activity trends
- Topic Analysis: See time distribution across different topics
- Performance Insights: Identify areas for improvement
- Smart Scheduling: Automatically schedule reviews based on spaced repetition algorithm
- Performance-Based Intervals: Review intervals adjust based on how well you remember
- Due Review Tracking: Get notifications for overdue reviews
- Note Integration: Link reviews directly to Obsidian notes
- Identify Weak Areas: Find topics with low mastery scores
- Activity Tracking: See which topics haven't been practiced recently
- Personalized Suggestions: Get AI-powered recommendations for what to study next
- Focus Analysis: Analyze specific areas or your entire knowledge base
- Docker and Docker Compose
- Official Obsidian MCP server (from Docker) already set up
- Claude Desktop configured with Obsidian MCP
git clone https://github.com/yourusername/obsidian-learning-extension.git
cd obsidian-learning-extensiondocker-compose builddocker-compose upThe server should start and wait for stdio communication.
Edit your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Add the learning extension server alongside your existing Obsidian server:
{
"mcpServers": {
"obsidian": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "OBSIDIAN_HOST",
"-e", "OBSIDIAN_API_KEY",
"mcp/obsidian"
],
"env": {
"OBSIDIAN_HOST": "host.docker.internal",
"OBSIDIAN_API_KEY": "YOUR_API_KEY"
}
},
"obsidian-learning": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/ABSOLUTE/PATH/TO/obsidian-learning-extension/data:/data:rw",
"obsidian-learning-extension:latest"
]
}
}
}Important: Replace /ABSOLUTE/PATH/TO/obsidian-learning-extension with your actual path!
Completely quit and reopen Claude Desktop to load the new server.
Create a new learning challenge with AI-generated content.
Parameters:
topic(string): Topic to learn (e.g., "Docker Networking")difficulty(enum): beginner, intermediate, advanced, expertchallenge_type(enum): knowledge, practical, teaching, analysis, creativedescription(string, optional): Custom challenge description
Example:
"Create an intermediate practical challenge on Docker networking"
List all challenges with optional filtering.
Parameters:
status(enum, optional): pending, in_progress, completed, archiveddifficulty(enum, optional): Filter by difficulty level
Example:
"Show me all my in-progress challenges"
Get detailed information about a specific challenge.
Parameters:
challenge_id(string): ID of the challenge
Update challenge status and add notes.
Parameters:
challenge_id(string): Challenge IDstatus(enum): pending, in_progress, completed, archivednotes(string, optional): Notes about the status change
Example:
"Mark challenge ch_abc123 as completed with notes: Built a working multi-container app"
Record a learning session.
Parameters:
topic(string): What you studiedactivity(string): What you didduration_minutes(number): Time spentmastery_rating(number): Self-assessment 0-10challenge_id(string, optional): Link to a challengenotes(string, optional): Additional notes
Example:
"Record 45 minutes learning Docker volumes, mastery 7/10, completed tutorial"
View learning statistics and analytics.
Parameters:
topic(string, optional): Filter by topicdays(number, optional): Days to look back (default: 30)
Example:
"Show my learning stats for the last 7 days"
Schedule a review for spaced repetition.
Parameters:
topic(string): Topic to reviewnote_path(string): Path to note in Obsidianinitial_interval_days(number, optional): First review interval
Example:
"Schedule a review for Docker networking, note at Software Development/Docker Networking.md"
Get all reviews that are due or overdue.
Example:
"What reviews are due today?"
Mark a review as completed and schedule the next one.
Parameters:
review_id(string): Review IDperformance(enum): weak, moderate, strong, perfectnotes(string, optional): Review notes
Example:
"Complete review rv_abc123 with strong performance"
Get AI suggestions for what to study next.
Parameters:
area(string, optional): Focus area (e.g., "Docker")
Example:
"What should I study next?"
Analyze your learning to find gaps and weak areas.
Parameters:
focus_area(string, optional): Area to analyze
Example:
"Analyze my knowledge gaps in programming"
Claude: "Create a beginner knowledge challenge on Python async/await"
Claude: "List all my pending challenges"
Claude: "Update challenge ch_abc123 to in_progress"
Claude: "Record 30 minutes studying async programming, mastery 6/10"
Claude: "What are my learning stats this week?"
Claude: "Schedule a review for async programming at Python/Async.md"
Claude: "What reviews are due?"
Claude: "Complete review rv_xyz789 with strong performance"
Claude: "What should I study next?"
Claude: "Analyze my knowledge gaps"
Claude: "Show challenges with low mastery scores"
All data is stored in JSON files in the data/ directory:
challenges.json: Challenge definitions and statusprogress.json: Learning activity logreviews.json: Spaced repetition schedule
These files are automatically created and maintained by the server.
┌─────────────────┐
│ Claude Desktop │
└────────┬────────┘
│
┌────┴─────────────────┐
│ │
┌───▼────────┐ ┌───────▼────────┐
│ Official │ │ Learning │
│ Obsidian │ │ Extension │
│ MCP Server │ │ MCP Server │
└───┬────────┘ └────────┬───────┘
│ │
┌───▼────────────┐ ┌────▼──────┐
│ Obsidian Vault │ │ JSON │
│ (via REST) │ │ Data │
└────────────────┘ └───────────┘
Both servers work together:
- Official server: Handles all Obsidian file operations
- Learning extension: Provides intelligent learning features
# Install dependencies
pip install -r requirements.txt
# Run server
python learning_server.pydocker-compose build# With docker-compose
docker-compose logs -f
# With docker
docker logs obsidian-learning -fUse the MCP Inspector for debugging:
npx @modelcontextprotocol/inspector python learning_server.py- Check Docker is running:
docker ps - Rebuild image:
docker-compose build --no-cache - Check logs:
docker-compose logs
- Verify Claude Desktop config JSON is valid
- Ensure data directory path is absolute (not relative)
- Restart Claude Desktop completely
- Check Claude logs:
~/Library/Logs/Claude/(macOS)
- Verify volume mount in docker-compose.yml
- Check data directory permissions
- Ensure path is absolute
# Fix data directory permissions
chmod 755 data/- Knowledge graph visualization
- Automatic note linking based on topics
- Learning streak tracking
- Challenge templates library
- Export progress reports
- Machine learning for personalized difficulty adjustment
- Collaborative challenges
- Integration with external learning platforms
- Mobile notifications for reviews
- Advanced analytics dashboard
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - feel free to use and modify!
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Built on the Model Context Protocol
- Complements the Official Obsidian MCP Server
- Inspired by spaced repetition research and second brain methodology