Skip to content

eshitakundu/study-buddy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

21 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Study Buddy

Study Buddy

Turn your notes and past papers into a focused, local AI study system.

An MCP server that gives Claude structured access to your study material, so it can teach, quiz, and drill you on your own content, and remember how you did.

Python MCP uv SQLite License: MIT

Quick Start Β· How it Works Β· Tools & Prompts Β· Extend Β· Full Tutorial


✨ Why Study Buddy

LLMs can reason. They can't reach into your world: your notes, your past papers, your progress.

Study Buddy closes that gap with the Model Context Protocol (MCP). You drop material into two folders. Your MCP client (Claude Desktop, Cursor, anything MCP-compatible) can now:

πŸ“š Learn

Teach any topic from your material, in any style you ask for: Feynman, Socratic, exam-cram, ELI5, or anything else.

🧠 Practice

Grounded quizzes from your notes. PYQ-pattern practice: real past questions verbatim, or new questions in that exact style.

πŸ“ˆ Track

Local SQLite tracks mastery per topic across sessions. Weakest topics surface first. Archive what you've mastered.

Built to also serve as a complete reference for the MCP protocol: every primitive, exercised with production-shaped code.


⚑ Quick Start

# 1. Clone
git clone https://github.com/eshitakundu/study-buddy.git
cd study-buddy

# 2. Install
uv sync

# 3. Drop notes into materials/content/ and past papers into materials/pyqs/

# 4. Verify the server with the MCP Inspector
uv run mcp dev study_buddy.py

Then connect it to Claude Desktop and start a chat:

"Discover topics in my materials, register the real ones, then quiz me on the weakest one."


🧬 How it Works

flowchart LR
    A[πŸ“ materials/<br/>content + pyqs] --> B[βš™οΈ study_buddy.py<br/>MCP server]
    B --> C[πŸ’Ύ SQLite<br/>topics + results]
    B <-->|stdio| D[πŸ€– Claude Desktop]
    D -->|calls tools| B
    D -->|renders prompts| B
    D -->|reads resources| B
Loading

The three MCP primitives, doing real work

Primitive Role in Study Buddy Examples
πŸ”§ Tools Actions the model invokes search_content, log_result, extract_pyq_style
πŸ“– Resources Browsable, URI-addressed context study://topics, study://content
πŸ’¬ Prompts Parameterized study workflows study, quiz, pyq_test

Plus typed inputs via Pydantic Field, persistent state via SQLite, and path-traversal-safe file access.


πŸ“ Project Structure

study-buddy/
β”œβ”€β”€ πŸ“¦ study_buddy.py         ← the entire server, one file
β”œβ”€β”€ πŸ—„οΈ  study.db              ← auto-created SQLite tracker
β”œβ”€β”€ πŸ“š materials/
β”‚   β”œβ”€β”€ content/            ← notes, slides, textbook extracts
β”‚   β”œβ”€β”€ pyqs/               ← previous-year question papers
β”‚   └── archive/            ← files you've moved aside
β”œβ”€β”€ πŸ–ΌοΈ  assets/banner.png
β”œβ”€β”€ pyproject.toml
β”œβ”€β”€ uv.lock
└── README.md

Subfolders and study.db are auto-created on first run.


πŸ“₯ Setup

Requirements
  • Python 3.10+
  • uv: fast Python package manager
  • MCP-compatible client: Claude Desktop, Cursor, Cline, etc.
  • Node.js: only for the MCP Inspector via mcp dev

Pinned dependencies:

  • mcp[cli]>=1.27,<2: the <2 bound matters; SDK v2 changes import paths
  • pypdf
  • python-docx
Install
git clone https://github.com/eshitakundu/study-buddy.git
cd study-buddy
uv sync
Add your study material

Notes (materials/content/):

dbms-notes.md
transactions.pdf
normalization-slides.docx
er-diagram.png

Past papers (materials/pyqs/):

dbms-midterm-2024.pdf
dbms-final-2023.txt
operating-systems-pyq.docx

Files moved via archive_files land in materials/archive/.


πŸ§ͺ Run and Test

uv run mcp dev study_buddy.py

Opens the MCP Inspector in your browser (via npx). List and call every tool, read resources, and preview rendered prompts, all before touching your client.

MCP Inspector showing the Study Buddy tool list

⚠️ Gotcha: if node stays alive on port 6277 after the Inspector closes, the next mcp dev fails with Proxy Server PORT IS IN USE. Fix on Windows:

Get-Process node | Stop-Process -Force

πŸ”Œ Connect to Claude Desktop

Config file:

  • Windows β†’ %APPDATA%\Claude\claude_desktop_config.json
  • macOS β†’ ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "study-buddy": {
      "command": "C:\\Users\\<you>\\.local\\bin\\uv.exe",
      "args": [
        "--directory",
        "C:\\Users\\<you>\\path\\to\\study-buddy",
        "run",
        "study_buddy.py"
      ]
    }
  }
}

πŸ”‘ Three things that trip everyone up:

  1. Use absolute paths: Claude Desktop's working directory isn't your project folder.
  2. On Windows, escape backslashes as \\.
  3. Fully quit Claude Desktop from the system tray before reopening. Closing the window isn't enough.

Debug logs β†’ %APPDATA%\Claude\logs\mcp-server-study-buddy.log

Claude Desktop with Study Buddy connected


πŸ”§ Tools

πŸ“š Material
Tool Purpose
list_content List files in materials/content/
list_pyqs List files in materials/pyqs/
read_file Read a file from content, pyqs, or archive
search_content Substring search across content files
archive_files Physically move files into materials/archive/
🎯 Topics & Progress
Tool Purpose
discover_topics Rank candidate topics from headings, bold text, question stems
register_topic Add a topic to the tracker
list_topics Active topics with attempts, mastery %, last-attempt time
archive_topic Mark a topic as mastered (metadata only)
log_result Record a quiz score against a registered topic
weakest_topics Lowest-mastery active topics
πŸ“‹ PYQ Analysis
Tool Purpose
extract_pyq_style Structural profile: types, marks, stems, samples
extract_pyq_questions Parsed list of actual questions from a past paper

πŸ“– Resources

URI Content
study://content Markdown index of materials/content/
study://pyqs Markdown index of materials/pyqs/
study://topics Mastery tracker: active + archived

πŸ’‘ Important: in Claude Desktop, resources are user-attached, not auto-fetched. Tools are model-initiated. Design accordingly.

Claude Desktop's + menu showing study-buddy's resources and prompts available to attach


πŸ’¬ Prompts

πŸŽ“ study

Teach a topic from your content in any style.

topic:  normalization
style:  feynman

Styles: default, feynman, socratic, eli5, summary, exam-cram, or anything else the model can interpret.

🏫 study_all

Walk through every active registered topic.

style:  default
order:  weakest_first | registered

πŸ“ quiz

Grounded quiz drawn only from your content. One question at a time. Results logged automatically.

topic:  functional dependencies
n:      5

🎯 pyq_test

Real past questions or new ones matching the paper's style.

topic:  normalization
mode:   ask | verbatim | style
n:      5

πŸ›‘οΈ Safety

  • All file access confined to materials/content/, materials/pyqs/, materials/archive/
  • Paths validated via Path.is_relative_to: blocks ../../.env traversal
  • Topic strings normalized and fuzzy-matched against registered rows: no silent row creation
  • Every input bound (n, days, max_results) enforced via Pydantic Field metadata

πŸ“„ Supported Files

Type Extensions Handling
Text .txt, .md Direct read
PDF .pdf pypdf text extraction
Word .docx python-docx extraction
Image .png, .jpg, .jpeg, .webp Returned as MCP ImageContent: vision-capable clients read it directly

⚠️ Scanned PDFs have no extractable text. pypdf returns empty. OCR (Tesseract) or a text-based version before dropping in.


🎬 Example Session

1. Discover topics from my material.
2. Register normalization and functional dependencies.
3. Teach me normalization in exam-cram style.
4. Quiz me on normalization with 5 questions.
5. Show my weakest topics.
6. Give me a PYQ-style test on functional dependencies.

The client chains discovery β†’ registration β†’ retrieval β†’ quiz β†’ logging, all against your own material.

Claude Desktop running a 5-question quiz, grading each answer and logging the result


πŸš€ Extend

Same MCP scaffolding, different domain:

πŸ“„ Research-paper assistant πŸ“š Local docs navigator πŸ§‘β€πŸ’» Codebase explainer
πŸ’Ό Job-application tracker πŸ’° Personal finance coach 🍳 Recipe & meal planner

The recipe:

safe data access
+ tools           (actions)
+ resources       (browsable context)
+ prompts         (workflows)
+ persistent state (SQLite)
= a practical MCP server

πŸ› οΈ Built With

Python MCP SDK Pydantic SQLite uv

  • Official MCP Python SDK: mcp[cli] with FastMCP
  • SQLite: persistent state (stdlib)
  • Pydantic: typed inputs (via the SDK)
  • pypdf, python-docx: file extraction
  • uv: dependency management

πŸ“œ License

MIT Β© Eshita Kundu (see LICENSE).


Built for the CodΓ©dex Monthly Challenge, June 2026

⭐ Star if this taught you something Β· πŸ› Issues Β· πŸ’¬ Discussions

About

An MCP server that gives Claude Desktop structured access to your notes and past papers. Discovers topics, teaches in any style, quizzes you on grounded content, extracts PYQ patterns, and tracks mastery in local SQLite. Built with the official MCP Python SDK + FastMCP.

Topics

Resources

License

Stars

2 stars

Watchers

0 watching

Forks

Contributors

Languages