Self-hostable study dashboard with a built-in MCP server, so that your Claude/ChatGPT subscription becomes x10 more effective for your semester
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport streamable-http counts 45 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
add_lecture_topics
-
complete_task
-
create_course
-
create_deliverable
-
create_lecture
-
create_schedule_slot
-
create_study_topic
-
create_task
-
delete_course
-
delete_deliverable
-
delete_lecture
-
delete_schedule_slot
-
delete_study_topic
-
delete_task
-
get_app_settings
-
get_course
-
get_dashboard
-
get_fall_behind
-
list_course_files
-
list_courses
-
list_deliverables
-
list_events
-
list_exams
-
list_lectures
-
list_schedule_slots
-
list_study_topics
-
list_tasks
-
mark_deliverable_submitted
-
mark_lecture_attended
-
mark_studied
-
notify_telegram
-
now_here
-
read_course_file
-
record_event
-
reopen_deliverable
-
reopen_task
-
set_confidence
-
update_app_settings
-
update_course
-
update_deliverable
-
update_exam
-
update_lecture
-
update_schedule_slot
-
update_study_topic
-
update_task
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 0770272 · analyzer v33 · 1w ago
danger signals3
- suspicious endpoint api.telegram.org OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :1129
f"https://api.telegram.org/bot{token}/sendMessage", - suspicious endpoint api.telegram.org OpenStudy-dev-OpenStudy-0770272/app/routers/settings.py :90
f"https://api.telegram.org/bot{sec.telegram_bot_token}/sendMessage", - suspicious endpoint api.telegram.org OpenStudy-dev-OpenStudy-0770272/app/services/telegram.py :30
f"https://api.telegram.org/bot{token}/sendMessage",
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 205
filesystem 13
- fs OpenStudy-dev-OpenStudy-0770272/app/db.py :108
await _pool.open() - fs OpenStudy-dev-OpenStudy-0770272/app/main.py :4
from pathlib import Path - fs OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :1065
doc = fitz.open(stream=data, filetype="pdf") - fs OpenStudy-dev-OpenStudy-0770272/app/services/email.py :14
from pathlib import Path - fs OpenStudy-dev-OpenStudy-0770272/app/services/file_index.py :19
from pathlib import Path - fs OpenStudy-dev-OpenStudy-0770272/app/services/storage.py :31
import shutil - fs OpenStudy-dev-OpenStudy-0770272/app/services/telegram.py :10
from pathlib import Path - fs (weak) OpenStudy-dev-OpenStudy-0770272/scripts/index_files.py :15
from pathlib import Path - fs (weak) OpenStudy-dev-OpenStudy-0770272/scripts/run_migrations.py :26
from pathlib import Path - fs (weak) OpenStudy-dev-OpenStudy-0770272/tests/conftest.py :31
from pathlib import Path - fs (weak) OpenStudy-dev-OpenStudy-0770272/tests/mcp/test_files.py :110
doc = fitz.open() - fs (weak) OpenStudy-dev-OpenStudy-0770272/tests/services/test_file_index.py :17
from pathlib import Path - fs (weak) OpenStudy-dev-OpenStudy-0770272/tests/services/test_storage.py :20
from pathlib import Path
shell / exec 1
- shell (weak) OpenStudy-dev-OpenStudy-0770272/tests/conftest.py :28
import subprocess
network 14
- net OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :1102
import httpx - net OpenStudy-dev-OpenStudy-0770272/app/routers/files.py :23
import httpx - net OpenStudy-dev-OpenStudy-0770272/app/routers/oauth.py :16
from urllib.parse import quote, urlencode - net OpenStudy-dev-OpenStudy-0770272/app/routers/settings.py :3
import httpx - net OpenStudy-dev-OpenStudy-0770272/app/services/storage.py :35
from urllib.parse import quote - net OpenStudy-dev-OpenStudy-0770272/app/services/telegram.py :14
import httpx - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/conftest.py :155
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/mcp/test_bearer_user_binding.py :20
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/mcp/test_files.py :8
so we monkeypatch `httpx.post` for the success path and mock `get_secrets` - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/routers/test_secrets_routes.py :36
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/test_integration_full_flow.py :20
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/test_integration_routes.py :32
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/test_integration_signup.py :12
from httpx import ASGITransport, AsyncClient - net (weak) OpenStudy-dev-OpenStudy-0770272/tests/test_oauth_consent_csrf.py :15
from httpx import ASGITransport, AsyncClient
secrets 4
- secrets OpenStudy-dev-OpenStudy-0770272/app/db.py :82
pw = os.environ["POSTGRES_PASSWORD"] - secrets OpenStudy-dev-OpenStudy-0770272/app/routers/internal.py :27
expected = os.environ.get("INTERNAL_API_SECRET", "").strip() - secrets OpenStudy-dev-OpenStudy-0770272/app/tools/hashpw.py :8
import getpass - secrets (weak) OpenStudy-dev-OpenStudy-0770272/scripts/run_migrations.py :36
pw = os.environ["POSTGRES_PASSWORD"]
tool registrations 45
- get_dashboard OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :127
- get_fall_behind OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :141
- list_courses OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :158
- get_course OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :165
- create_course OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :172
- delete_course OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :220
- update_course OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :231
- list_schedule_slots OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :273
- create_schedule_slot OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :282
- update_schedule_slot OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :321
- delete_schedule_slot OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :350
- list_exams OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :361
- update_exam OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :371
- list_study_topics OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :407
- create_study_topic OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :424
- update_study_topic OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :466
- mark_studied OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :500
- set_confidence OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :507
- add_lecture_topics OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :519
- delete_study_topic OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :570
- list_deliverables OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :583
- create_deliverable OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :606
- update_deliverable OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :641
- mark_deliverable_submitted OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :669
- delete_deliverable OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :676
- list_tasks OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :688
- create_task OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :713
- update_task OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :738
- complete_task OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :763
- reopen_task OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :769
- delete_task OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :775
- list_lectures OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :786
- create_lecture OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :795
- update_lecture OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :829
- mark_lecture_attended OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :853
- delete_lecture OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :859
- reopen_deliverable OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :868
- list_events OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :876
- record_event OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :893
- get_app_settings OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :916
- update_app_settings OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :927
- now_here OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :960
- list_course_files OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :979
- read_course_file OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :1020
- notify_telegram OpenStudy-dev-OpenStudy-0770272/app/mcp_tools.py :1081
declared dependencies 17
- mcp@>=1.2
- fastapi@>=0.115
- pydantic@>=2.9
- pydantic-settings@>=2.6
- uvicorn@>=0.32
- python-multipart@>=0.0.28
- itsdangerous@>=2.2
- argon2-cffi@>=23.1
- httpx@>=0.28
- python-dateutil@>=2.9
- tzdata@>=2024.2
- pymupdf@>=1.24
- pillow@>=10.4
- pyotp@>=2.9
- psycopg@>=3.2
- cryptography@>=42
- jinja2@>=3.1