studylife-mcp
An MCP server exposing StudyLife(a self-hosted Blazor WASM + ASP.NET Core study-management platform) to Claude andother MCP clients.
Deliberately scoped narrower than its sister projectstudylife-ai: no RAG, no agent loop — theMCP client (e.g. Claude Desktop) is the agent, this server just exposes cleanlymodeled tools and resources.
Status: S3 complete — five read-only tools plus two write tools (create_note,create_session) over stdio, with a per-tool-call audit log. Verified end-to-endagainst a real StudyLife instance and inside Claude Desktop, including adedicated McpApiKeyHash key slot (see docs/decisions.md).
Setup (Claude Desktop, stdio)
Copy
.env.exampleto.envand fill in your StudyLife instance URL and API key(Setup page in StudyLife → "StudyLife MCP Server" card → generate a dedicated key;S1/S2 used the "Home Assistant" key slot as an interim measure, seedocs/decisions.md).Install dependencies:
uv syncAdd to your Claude Desktop config (
claude_desktop_config.json):{ "mcpServers": { "studylife": { "command": "uv", "args": ["run", "--directory", "/absolute/path/to/studylife-mcp", "studylife-mcp"] } } }Where to find that file depends on how Claude Desktop was installed:
- Classic installer:
%APPDATA%\Claude\claude_desktop_config.json(Windows) /~/Library/Application Support/Claude/claude_desktop_config.json(macOS). - MSIX-packaged app (Microsoft Store-style install, package id starting
Claude_...):%APPDATA%is redirected to%LOCALAPPDATA%\Packages\Claude_<id>\LocalCache\Roaming\Claude\claude_desktop_config.json.In-app: Settings → Developer → "Local MCP servers" opens this same file. Note theapp's "Benutzerdefinierten Connector hinzufügen" dialog is for remote MCP servers(URL-based, Streamable HTTP) only — it does not accept a local command; local stdioservers are configured exclusively via this JSON file.
- Classic installer:
Restart Claude Desktop (fully quit, not just close the window). The
list_coursestool should appear.
Configuration
| Variable | Description |
|---|---|
STUDYLIFE_BASE_URL |
Base URL of your StudyLife instance, e.g. https://studylife.example.com/ |
STUDYLIFE_API_KEY |
API key from StudyLife's setup page, sent as the X-Api-Key header |
Tools
| Tool | Effect |
|---|---|
list_courses |
Read-only. Lists all courses of the active study program (semester, code, color, icon, topics, ECTS). Does not modify any data. |
list_notes |
Read-only. Lists all notes (title, content, course/session link, timestamps). Does not modify any data. |
search_notes |
Read-only. Full-text searches notes by title and content. Does not modify any data. |
list_sessions |
Read-only. Lists all study sessions/calendar entries (course, time range, topic, notes, completion status). Does not modify any data. |
list_course_goals |
Read-only. Lists per-course learning goals (target date, completion status, grade, completed topics, tag). No aggregate ECTS total. Does not modify any data. |
create_note |
Creates a new note (title, content, optional course/session link). Does not modify or delete existing data. |
create_session |
Creates a new study session/calendar entry for a course and time range. Does not modify or delete existing data. |
Development
uv sync
uv run ruff check .
uv run mypy src
uv run pytest
See docs/decisions.md for the reasoning behind notable design decisions.