vit-bhopal-vtop-mcp-server
Connect your AI assistant to your VIT Bhopal VTOP account so you can ask plain-language questions about attendance, marks, timetable, exams, grades, fees, profile and hostel leave — 33 of its 35 tools are strictly read-only, and only two (apply_leave, cancel_leave) write.
Sign in and out — fetch a CAPTCHA (
get_captcha), log in with credentials or env vars (login), log out (logout), check whether the session is live (session_status).Track attendance — per-course attended/total/percentage (
get_attendance), per-class present/absent/on-duty for a course (get_attendance_detail), and a bunk calculator showing how many classes you can skip or must attend to hold 75%, optionally projected to a deadline or term end (calculate_attendance).See your schedule — today's classes with times and venues, holiday- and day-order aware (
get_today_classes), plus full timetable with slots, venues, faculty, credits and every weekly session (get_timetable).Check marks and pass eligibility — CAT/internal component marks with weightage and class average (
get_marks), total internal marks per subject with outstanding components (get_internal_totals), and what you must score in each CAT and the FAT to pass, in both scales (check_pass_eligibility).Plan for exams — CAT-1/CAT-2/FAT dates, sessions, venues and seat numbers (
get_exam_schedule).Review grades and degree progress — grades and GPA for one semester (
get_semester_grades), CGPA and full grade history (get_grade_history), credits earned vs required by category and basket (get_curriculum_progress), programme baskets (get_curriculum_baskets), which basket a course sits in (get_course_basket), and subjects still to complete (get_pending_subjects).Look up the academic calendar — holidays, events, working Saturdays and instructional days (
get_calendar), term bounds and days left (get_semester_info), and your semester list (get_semesters).Access personal records — profile basics plus photo (
get_profile), full five-section profile including family, proctor and hostel info (get_student_profile), proctor contact details (get_proctor_details), admission document checklist (get_acknowledgments), and fee receipts with breakdowns (get_fee_receipts).Search the catalogue — faculty directory with detail cards (
search_faculty) and downloadable course syllabus PDFs (get_course_syllabus).Handle hostel leave — list leave types and the 6 PM in-time rule (
get_leave_types), probe per-type server-side rules without submitting (get_leave_type_rules), view current applications and approval status (get_leave_status), and see full leave history (get_leave_history).Write to your account (only these two) — submit a real hostel leave application (
apply_leave) or withdraw one (cancel_leave); both are two-step, requiring a preview that returns a single-use token and a confirm call repeating identical details, and both are flagged non-read-only so clients prompt.Deliberately not offered — no grade or GPA prediction, since VIT awards letter grades relatively and VTOP exposes neither the class average nor its spread.
VTOP MCP Server for VIT Bhopal
Ask your AI assistant anything about your VIT Bhopal VTOP account — attendance, marks, timetable, exams, grades, pass eligibility, hostel leave — in plain language.
An MCP server. Connect it to OpenCode, Claude Code, Claude Desktop, Cursor or anything else that speaks MCP, then just ask. It signs in to VTOP, reads the page, and answers.
⚠️ Exactly two tools write to your account
Of the 35 tools, 33 are strictly read-only. Two are not:
apply_leavesubmits a real hostel leave application for your proctor, andcancel_leavewithdraws one. Those are the only writes.Neither can fire by accident. Both are two-step — a preview call validates and returns a single-use token without sending anything, and a confirm call must repeat the identical target and that token. Change anything in between and it's refused. Both declare
readOnlyHint: falseso a compliant client prompts rather than auto-approving.Details in docs/hostel-leave.md.
What it looks like
"How many more classes can I skip and still hold 75%?"
You can skip 4 more classes in CSD3002 and still finish at 75.4%. At 5 you'd drop to 74.1%. Last chance is 28 Oct.
Course
Attended
Can skip
Lowest safe %
CSD3002 Secure Software
34/46
4
75.4%
MAT2001 Differential Equations
21/22
1
77.8%
"When is my Database FAT, where, and which seat?"
CSD5003 Database Management Systems — FAT Sat 24 Oct 2026, Morning session, 09:30–11:00 Venue: AB1-305 · Seat B14 · Hall ticket required
"Apply for a day outing on the 20th, Sehore, 9am to 6pm, family function"
Preview only — nothing has been sent. Confirm to apply.
✓ Day Outing (
OG1), returns 18:00 — exactly on the deadline, allowed ✓ 5 classes missed (Sat 24 Oct is the FAT, unaffected) ✓ Visiting place "Sehore" (6 chars), reason providedpreviewToken:
a3f9c1d8e2b40756Reply "confirm" and I'll submit it unchanged.
"Is my leave approved yet?"
L9000001 · WINTER VACATION · Home 30 Oct 17:00 → 15 Nov 21:00 (17 days) Status: PROCTOR APPROVAL PENDING — raised, not yet actioned. Gate Pass OUT/IN not issued.
Related MCP server: mcp-student-assistance
Install
Needs Node.js 20.6 or newer (node -v) and git.
git clone https://github.com/CipherxHub/vtop-bhopal-mcp.git
cd vtop-bhopal-mcp
npm install
npm run builddist/ is not committed, so the build step is required.
Prefer hosted? Use it straight from Glama — no clone or build needed:
Your credentials
Create a .env in the project folder with your own VTOP login
(full details, including the Windows equivalent of chmod 600, are in
Connect it):
VTOP_USERNAME=your-registration-number
VTOP_PASSWORD=your-vtop-passwordIt's gitignored and never committed. If you skip this, the assistant asks you in the chat the first time it needs them.
See .env.example for the full list of optional settings.
Connect it
Three steps for every client: build the server, create the .env, paste the
config. Replace /path/to/vtop-bhopal-mcp with where you cloned it. In JSON
files, use forward slashes (D:/vtop-bhopal-mcp/…) — backslashes need
escaping and are the commonest reason a pasted config silently fails.
1. Build
git clone https://github.com/CipherxHub/vtop-bhopal-mcp.git
cd vtop-bhopal-mcp
npm install # run ON the machine that will use it — see note below
npm run builddist/ is not committed, so the build step is required. Never copy
node_modules/ between machines: sharp ships a platform-specific native
binary, so an install copied from Windows will not start on macOS/Linux (and
vice versa). npm install on the target machine is the fix.
2. Credentials
Create a .env in the project folder with your own VTOP login:
VTOP_USERNAME=your-registration-number
VTOP_PASSWORD=your-vtop-passwordIt's gitignored and never committed. Then lock it down: chmod 600 .env on
macOS/Linux. That command is a no-op on Windows — use this instead so other
local users cannot read your password:
icacls .env /inheritance:r /grant:r "$env:USERNAME:(F)" "BUILTIN\Administrators:(F)" "NT AUTHORITY\SYSTEM:(F)"If you skip the .env, the assistant asks you in the chat the first time it
needs credentials. See .env.example for the full list of
optional settings.
Where each client reads settings from. The server never reads a
.envby itself — something has to hand it the variables. For every client below except Codex, that something is Node's--env-file=flag in the pasted command, so the.envyou just made is what gets loaded. Codex is the exception: it has no--env-filemechanism, so credentials (andVTOP_CAPTCHA_OPEN) go in its own config file'senvblock instead. A.envsitting next to the server is silently ignored by Codex.
3. Paste the config
OpenCode — global config, so it works in every project:
OS | File |
Windows |
|
macOS / Linux |
|
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"servers": {
"vtop": {
"type": "local",
"command": [
"node",
"--env-file=/path/to/vtop-bhopal-mcp/.env",
"/path/to/vtop-bhopal-mcp/dist/index.js"
]
}
}
}
}Then opencode service restart, start a new chat (tools load at session
start), and check with opencode mcp list — you want ✓ vtop connected.
Codex CLI — easiest via its own command (it writes the file for you):
codex mcp add vtop `
--env VTOP_USERNAME=your-registration-number `
--env VTOP_PASSWORD=your-vtop-password `
--env VTOP_BASE_URL=https://vtop.vitbhopal.ac.in/vtop `
-- node D:/vtop-bhopal-mcp/dist/index.jsThat lands in C:\Users\<you>\.codex\config.toml on Windows
(~/.codex/config.toml on macOS/Linux) as:
[mcp_servers.vtop]
command = "node"
args = ['D:/vtop-bhopal-mcp/dist/index.js']
[mcp_servers.vtop.env]
VTOP_BASE_URL = "https://vtop.vitbhopal.ac.in/vtop"
VTOP_USERNAME = "your-registration-number"
VTOP_PASSWORD = "your-vtop-password"Check with codex mcp list. Quit Codex completely (all windows — the
background process holds the old server open), relaunch, and start a new chat.
Optional safety guard — prompt before every login:
[mcp_servers.vtop.tools.login]
approval_mode = "approve"Claude Code:
claude mcp add vtop -s user -- node --env-file=/path/to/vtop-bhopal-mcp/.env /path/to/vtop-bhopal-mcp/dist/index.jsCheck with claude mcp list, then start a new chat.
Claude Desktop — same command + args shape in its config file:
OS | File |
Windows |
|
macOS |
|
Linux |
|
{
"mcpServers": {
"vtop": {
"command": "node",
"args": ["--env-file=/path/to/vtop-bhopal-mcp/.env", "/path/to/vtop-bhopal-mcp/dist/index.js"]
}
}
}Restart Claude Desktop after editing.
Cursor — global ~/.cursor/mcp.json, or <project>/.cursor/mcp.json for
one workspace. Same mcpServers shape as Claude Desktop above.
VS Code — workspace file .vscode/mcp.json (top-level key is servers
here, not mcpServers), or run MCP: Open User Configuration from the
command palette for all workspaces:
{
"servers": {
"vtop": {
"type": "stdio",
"command": "node",
"args": ["/path/to/vtop-bhopal-mcp/dist/index.js"],
"envFile": "/path/to/vtop-bhopal-mcp/.env"
}
}
}VS Code reads envFile natively, so no --env-file flag is needed. Check
with MCP: List Servers.
Antigravity — global ~/.gemini/config/mcp_config.json, or
.agents/mcp_config.json inside one workspace (or open the agent panel
… → MCP Servers → Manage MCP Servers → View raw config):
{
"mcpServers": {
"vtop": {
"command": "node",
"args": ["/path/to/vtop-bhopal-mcp/dist/index.js"],
"env": {
"VTOP_USERNAME": "your-registration-number",
"VTOP_PASSWORD": "your-vtop-password",
"VTOP_BASE_URL": "https://vtop.vitbhopal.ac.in/vtop"
}
}
}
}Troubleshooting
Every entry below was hit on a real machine during testing — symptom, cause, fix.
1. ✗ vtop failed the moment you add it.
Node exits on a missing --env-file instead of ignoring it. Create the
.env first, or drop the --env-file=… argument until the file exists.
2. Request timed out (OpenCode), log says unknown message ID.
You set cwd on the server entry. It connects from some directories and
times out from others. Remove cwd — the server resolves every path
absolutely, so it buys nothing.
3. opencode mcp add rejects --env-file (Unrecognized flag).
As of v2.0.28 the CLI cannot pass it even after --. Hand-edit the JSON
instead, exactly as shown above.
4. The captcha image is not visible.
Some clients drop MCP image content blocks (confirmed: Codex's TUI,
OpenCode's plain TUI). get_captcha always writes the JPEG to disk and
returns the absolute path as captchaFile (default %TEMP%\vtop-mcp-captcha\,
override with VTOP_CAPTCHA_DIR), so open that file and read it. Never let
the model guess the characters — a wrong guess is a real failed login
attempt, and VTOP locks accounts after repeated failures.
Hands-free option (experimental branch): VTOP_CAPTCHA_OPEN=1 makes the
server open the image in a viewer the moment it is written. Put it in the
.env for clients launched with --env-file, or in Codex's
[mcp_servers.vtop.env] block. Local single-user use only — on a shared
connector every call would pop a window on whoever is at the keyboard.
5. INVALID_CAPTCHA over and over.
The image expires in 30–60 seconds, and a slow round trip can outlast it. Ask
for a fresh captcha and answer fast. After three consecutive rejections the
server stops you itself and asks for a human — that is the safety stop
working, not a bug. Do not hammer retries: repeated failures escalate VTOP's
risk scoring toward MAX_LOGIN_ATTEMPTS, which needs a browser reset.
6. UPSTREAM: Request failed with status code 404 on get_captcha,
especially right after logout.
Fixed on this branch: logout() used to keep the dead session cookie, and
VTOP 404s a /login that carries it. Update, rebuild, restart your client.
If you are on main without the fix, restarting the client process also
clears it.
7. RECAPTCHA_REQUIRED — VTOP shows Google reCAPTCHA instead of the image.
VTOP's risk score for your IP/session is high (common after several rapid
logins). Wait a while before retrying. A residential proxy via
VTOP_PROXY_URL also helps; datacentre IPs reliably trigger it.
8. npm run test:all fails on openssl / native modules.
The suite needs openssl for its local HTTPS mock — on Windows that comes
with Git for Windows. And sharp compiles per platform: always run
npm install on the machine itself, never copy node_modules across.
9. Config change not picked up / stale tool list.
MCP servers start with the client session. New chat after any config edit;
full client restart after config.toml / Desktop JSON edits;
opencode service restart for OpenCode. A stale server process also pins old
code — rebuilding dist/ does nothing to a process that already loaded it,
so kill leftovers after every rebuild.
10. apply_leave, cancel_leave and approvals.
Of the 35 tools, 33 are read-only. apply_leave submits a real hostel leave
application to your proctor and cancel_leave withdraws one — both two-step (preview returns a token, confirm
repeats the identical target plus that token), but live writes all the same.
Keep approval prompts on for them (and for login) in clients that support
them, and never share a .env or a config.toml holding someone else's
credentials: the account behind them is the one VTOP sees.
Tools at a glance
Tool | What it does | |
🎓 |
| Attended / total / percentage per course |
🎓 |
| Per-class present/absent per day, or NOT POSTED |
🎓 |
| How many classes you can still skip (or must attend) to hold 75% |
🎓 |
| Today's classes — times and rooms, holiday-aware |
🎓 |
| Registered courses, slots, venues, faculty, credits |
📝 |
| CAT and internal-assessment marks with weightage |
📝 |
| Marks banked per course, plus everything still to come |
📝 |
| CAT-1, CAT-2, FAT — dates, sessions, venues, seats |
📝 |
| What you must score to pass, in both scales |
📊 |
| Grades and GPA for one semester |
📊 |
| CGPA, credits, courses grouped by exam month |
📊 |
| Credits earned vs required, by category |
📊 |
| Which basket a course is in, and its credits |
🔍 |
| Faculty directory search with detail cards (department, email, cabin) |
📄 |
| Downloads a course's syllabus PDF, returns the saved file path |
🗓 |
| Holidays, exams, events, instructional days |
🗓 |
| Term bounds, days left, teaching-over flag |
🗓 |
| All your semesters and their IDs |
🗓 |
| Name, registration number, programme, branch, plus photo file |
🏠 |
| Leave types VTOP currently offers |
🏠 |
| Your leave applications and approval status |
🔐 |
| Whether you're logged in and whether VTOP agrees |
🔐 |
| Signing in and out |
⚠️ |
| Submits a real leave application — two-step, see above |
⚠️ |
| Withdraws an applied leave — two-step, see above |
🔍 |
| Probes VTOP for per-type rules. Never submits |
Full reference, including arguments and return shapes: docs/tools.md.
Two things it deliberately won't do
No grade or GPA predictor. VIT awards letter grades relatively — against the class average and its spread — and VTOP exposes neither. Any prediction would be you supplying a guess and getting a guess back. get_grade_history reports the grades VTOP actually awarded; check_pass_eligibility reports the thresholds the published pass rules impose. Nothing extrapolates.
Read the percentages in get_internal_totals carefully. VTOP omits components that haven't happened yet rather than showing them as zero, and the internal scale isn't a constant 50. Marks scored are exact; percentages are a lower bound. The tool repeats this note on every call.
Docs
All 35 tools — arguments, returns, read/write | |
Leave types, rules, the two-step confirmation | |
Hosting it remotely, and its security model | |
Error codes, recovery paths, troubleshooting | |
How Bhopal's markup and endpoints actually behave | |
Architecture, tests, adding a tool | |
What came from where, with line counts | |
Fixture hygiene — synthetic data only |
Privacy
Your login only goes to VTOP. The server runs on your machine and talks directly to
vtop.vitbhopal.ac.in. It never sends your credentials anywhere else.Nothing is stored. Session cookies live in memory and vanish when the server stops. Your password stays in your own
.env, if you create one.Your assistant sees your data. Whatever the tools return goes to the AI client you connected — the same as anything else you ask it.
This repo contains no student data. No registration numbers, no marks, no CGPA, no leave ids.
npm run test:privacyenforces that on every file, and it will fail the build if real data ever appears.
Limitations
Unofficial. Not affiliated with or endorsed by VIT Bhopal. It reads the same pages your browser does — if VTOP changes them, parts break until updated.
Two tools write. See docs/hostel-leave.md. Everything else only reads; it never registers courses, changes marks, or touches fee and payment pages.
Leave duration limits are partly unknown. VTOP enforces them server-side and publishes none. Only Home Town ≤ 14 days is confirmed. Guessing the rest would block valid requests, so it isn't attempted.
Exam overlap is a warning, not a block. A clash is sometimes unavoidable and isn't this tool's decision to make.
Bunk calculator assumes 75%. Check your own course rules.
The HTTP connector is tested, including a live login. 20 offline checks cover routing, auth, CORS, the MCP transport and page content; it refuses every unauthenticated request; and a full register → captcha → login → real-data pass was run against VTOP on 13 Oct 2026. What remains untested is the network path — whether VTOP serves a Google reCAPTCHA to your host's IP range, which is a property of where you deploy. Recipe and security notes: docs/http-connector.md.
Provenance
Built on earlier work, with each layer credited and sized:
Layer | Author | Licence | Scale |
Original architecture and most parsers | MIT | ~43% inherited | |
Bhopal parser adaptations | Apache-2.0 | ~247 lines, 5 files | |
Leave, pass rules, errors, cache | Apache-2.0 | ~2,563 new lines |
Behavioural reference only (no code copied): android-vtop-chennai, GPL-3.0.
Full detail, including why only one MIT notice is reproduced: docs/provenance.md. Licence texts: LICENSE, NOTICE, LICENSE-MIT-upstream.
Not affiliated with or endorsed by VIT Bhopal University.
Available Tools
33 toolsapply_leaveA
Apply for hostel leave on VTOP. THIS WRITES TO VTOP and creates a real request for your proctor, so it is deliberately two-step. Call 1 (preview): pass the details with confirm OMITTED or false. Nothing is sent. You get back the normalised values, every rule that fired, any classes the leave would make you miss, and a previewToken. Call 2 (submit): repeat the SAME details plus confirm=true and the previewToken. The token is server-signed, single-use and expires after 10 minutes, so if anything changed since the preview the submission is refused and you must preview again. Always show the user the preview and get their agreement before calling with confirm=true. Never invent a previewToken or set confirm=true on a first call. Rules enforced before submitting: OG1 (Day Outing) must return by 18:00 inclusive; dates must be ISO YYYY-MM-DD and not in the past; to-date cannot precede from-date; visiting place is required and capped at 150 characters; reason is required. Times are normalised, so '6:00 PM' becomes '18:00'. Requires login.
Inputs: reason (required), toTime (required), fromTime (required), leaveCode (required), +5 more.
calculate_attendanceARead-onlyIdempotent
Attendance / bunk calculator. Per course: current %, whether you're safe (strictly above 74.0% by default — 74.0 is debarred; override via targetPercent), how many more classes you can skip ('bunkBuffer'), and how many to attend to recover ('classesToRecover'). For the key real use case — 'I'm at the line; if I skip today can I still make 75% by the time attendance closes?' — pass untilDate (the attendance-closing date; ASK THE USER for it) or toTermEnd: true to project to the last instructional day of the term automatically, plus bunkDates (the days you'd skip, e.g. today's date). Using the timetable + academic calendar (holidays, working Saturdays / day-orders) it returns per course: upcomingSessions until the deadline, ifAttendAllPercent/ifSkipAllPercent, maxSkippableInRange, mustAttendInRange, canBeSafeByDeadline, and — when bunkDates is given — plannedBunk (your final % and whether you're still safe if you skip exactly those days and attend everything else). Also returns a perDay breakdown of which classes fall on each upcoming day. If the response contains NOT_AUTHENTICATED, call get_captcha then login then retry. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if it reports credentials missing, ask the user for them. Requires login.
Inputs: bunkDates, toTermEnd, untilDate, courseCode, +3 more.
cancel_leaveADestructive
Withdraw a hostel leave application on VTOP. THIS WRITES TO VTOP, so it is deliberately two-step like apply_leave. Call 1 (preview): pass leaveId with confirm OMITTED or false. Nothing is withdrawn. You get back the leave's current record — type, dates, and approval status exactly as VTOP prints it — plus whether VTOP publishes a withdraw control for it, and a previewToken. Call 2 (withdraw): repeat the SAME leaveId plus confirm=true and the previewToken. The token is bound to this exact leave id and caller. Always show the user the preview — including the approval state — and get their agreement before calling with confirm=true. An already-approved leave may no longer offer a withdraw control; the preview says so. Never invent a previewToken or set confirm=true on a first call. Requires login.
Inputs: leaveId (required), confirm, previewToken.
check_pass_eligibilityARead-onlyIdempotent
Answer 'will I pass this course?' for every subject, using VIT Bhopal's actual pass rules rather than guessing. ALWAYS quote BOTH scales when asked what to score. Each CAT is a 50-mark paper needing 20, which is worth 6 of the 15 that CAT carries on the 100-point course scale. The TEE (FAT) is a 100-mark paper worth 30 of 100, and must reach 40 - worth 12 of those 30. So the canonical answer is '20/50 in each CAT, worth 6 of 15 each, and 40/100 in the TEE, worth 12 of 30'. Rules applied: passing is 80 raw marks out of 200 (CAT-I 20 + CAT-II 20 + TEE 40), equivalently CAT-I + CAT-II + TEE >= 80 raw. The TEE's own end goal is 40 of 100, and whatever the two CATs fall SHORT of 40 BETWEEN THEM is added to it - this is net, so a CAT above 20 offsets one below it (10 and 10 needs the TEE at 60, but 30 and 10 needs only 40). There is no re-test. Attendance must be >= 75.0% exactly to sit any exam. READ teeRequiredRaw AS THE ANSWER to 'what do I need in the TEE'. Do NOT present totalIfTeeClearedAtMinimum as a requirement - it is an OUTCOME: the course total you would finish with by scoring exactly the TEE minimum, i.e. bankedSoFar + teeRequiredMarks. The attendance marks are excluded from it because they are a projection awarded only after the last instructional day. Working-day and class counts come from the academic calendar and timetable, so holidays and day-order Saturdays are accounted for. If the calendar cannot be read, upcomingClasses is null and calendarAvailable is false with a calendarNote explaining why - that means UNKNOWN, not zero. semesterId is optional; omit for current semester. Requires login.
Inputs: refresh, semesterId.
get_acknowledgmentsARead-onlyIdempotent
Admission document checklist: which joining documents VTOP shows as Submitted, Not Applicable, or Not Submitted (e.g. mark lists, transfer/migration/conduct certificates, affidavits). A 'Not Submitted' line is actionable — it names a document the student still owes. Read-only. Requires login.
Inputs: no named parameters.
get_attendanceARead-onlyIdempotent
Get attendance records for all courses (attended/total/percentage per course). If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. semesterId is optional; omit for current semester. Requires login.
Inputs: refresh, semesterId.
get_attendance_detailARead-onlyIdempotent
Per-class attendance for one course: every posted session with its date and outcome (Present / Absent / On Duty). Ask 'was I present on 2026-10-12 in BCSE302L?' with courseCode + date; omit date to list all posted sessions. A date with no row means VTOP posted nothing for it — NOT POSTED, never absent. If the response contains NOT_AUTHENTICATED, call get_captcha then login then retry. Requires login.
Inputs: courseCode (required), date, refresh, semesterId.
get_calendarARead-onlyIdempotent
Look up the academic calendar: holidays, events (e.g. TechnoVIT), working Saturdays / day-orders, and which days are instructional. Use query to find a named event/holiday (e.g. 'technovit', 'pongal'), month ('YYYY-MM') to list a month, or holidaysOnly for just the no-class days; with no filter it returns the semester's notable days (holidays + working-Saturday day-orders). Festivals/holidays belong to the term they fall in, so if a query finds nothing, call get_semesters and retry with that semester's id. If the response contains NOT_AUTHENTICATED, call get_captcha then login then retry. Requires login.
Inputs: month, query, classGroup, semesterId, +1 more.
get_captchaA
Step 1 of login: fetch a CAPTCHA image from VTOP. Returns the image AND saves it to a file. CRITICAL - never invent the characters. If no image is rendered above, you cannot read the captcha: do NOT guess. Open captchaFile from the response and read that, or ask the user to open it and tell you the characters. A guess is always wrong and counts as a real failed login attempt against the student's account. After reading it, immediately call login — the image is only valid for 30-60 seconds. Failures come back as structuredContent.error.code (e.g. RECAPTCHA_REQUIRED, CAPTCHA_NOT_FOUND) with an ordered recovery plan.
Inputs: no named parameters.
get_course_basketARead-onlyIdempotent
Which curriculum basket a course belongs to: pass a course code (e.g. 'CSD3002') or a title fragment (e.g. 'salesforce') and get back every matching catalogue course with its basket (Programme Core, Programme Elective, …), credits and completion state. Works for courses you have never taken — it reads the programme catalogue, not your records. Read-only. Requires login.
Inputs: query (required).
get_curriculum_basketsARead-onlyIdempotent
Programme curriculum baskets: every category (Programme Core, Programme Elective, University Core/Electives, …) with its courses — code, title, type, version, L/T/P/J and credits. Each row also carries vtopMarkedCompleted, VTOP's own completion marking, reported verbatim. Use get_pending_subjects when you want completed-vs-left rather than the raw baskets. Read-only. Requires login.
Inputs: no named parameters.
get_curriculum_progressARead-onlyIdempotent
Get degree progress: total credits earned vs required (and remaining), per-category breakdown (Foundation Core, Discipline Core, Discipline Electives, Open Electives, Projects/Internship, etc.), per-basket completion (HSM Elective, Foreign Language, Extra-curricular, ...), CGPA, and grade-letter counts across all semesters. Use this for any 'how many credits left?', 'how close am I to graduating?', 'which baskets do I still need?', or 'how many of each grade have I gotten?' questions. If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. Requires login.
Inputs: no named parameters.
get_exam_scheduleARead-onlyIdempotent
Get exam schedule (CAT1/CAT2/FAT dates, timings, venues, seat numbers, row/col). If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. semesterId is optional; omit for current semester. Requires login.
Inputs: refresh, semesterId.
get_fee_receiptsARead-onlyIdempotent
Fee payment receipts: receipt number, date, amount and campus for every payment VTOP has on record. Pass receiptNo (from a previous call) to get that receipt's detail breakdown instead of the list. Amounts are as printed; no currency conversion is applied. Read-only. Requires login.
Inputs: receiptNo.
get_grade_historyARead-onlyIdempotent
Get cumulative grade history (CGPA, total earned credits, per-semester GPA + courses + grades, grouped by exam month). If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. Requires login.
Inputs: no named parameters.
get_internal_totalsARead-onlyIdempotent
TOTAL internal marks for every subject, out of the 100-mark course scale (internal assessment 40 = lab/class 35 + attendance 5; CAT-I 15 + CAT-II 15 = 30; Term End Examination 30). ORDER MATTERS when reporting: give every subject with its full component breakdown FIRST, then the totals at the END. For each course: scoredSoFar (exact), percentOfScale, and outstanding - components VTOP has not published yet, since it omits them rather than showing zero. Your marks can only rise. Where the attendance component is still outstanding, attendanceForecast projects what your current attendance is worth out of 5 — remember these marks are only awarded after the last instructional day, so it is a projection, not a settled score. outstanding means no mark is published yet: usually the faculty has not entered it, which is not the same as the component being unconducted. The letter grade is awarded RELATIVELY against the class average, so the 100 total does not map directly to an S/A/B. semesterId is optional; omit for current semester. Requires login.
Inputs: refresh, semesterId.
get_leave_historyARead-onlyIdempotent
Full hostel leave history: every leave application on record — id, type, place, reason, from/to, status, approver remarks, and gate-pass OUT/IN state. Use this for 'what leaves have I taken?' or past-leave questions; use get_leave_status for the current state. Statuses are reported exactly as VTOP prints them. Read-only. Requires login.
Inputs: no named parameters.
get_leave_statusARead-onlyIdempotent
Get hostel leave applications and their approval status: leave id, type, place, from/to, status (reported verbatim, e.g. REQUEST RAISED / PROCTOR APPROVAL PENDING / REQUEST APPROVED), approver remarks, and gate-pass OUT/IN flags where VTOP publishes them. Read-only. Requires login.
Inputs: no named parameters.
get_leave_type_rulesARead-onlyIdempotent
Diagnostic: ask VTOP what rules apply to each hostel leave type (max days, limits, required fields) by triggering the same request the leave-type dropdown makes when you change the selection. READ-ONLY - this never submits a leave application. It exists because the day limits are server-side rules that are otherwise only discoverable by submitting and being rejected (e.g. HOME TURN caps at 14 days). Omit leaveCode to probe every type. Returns the raw text VTOP replies with for each, so limits can be read directly rather than guessed.
Inputs: leaveCode.
get_leave_typesARead-onlyIdempotent
List the hostel leave types VTOP currently offers, read from the live leave form (so a newly added or retired type is reflected rather than assumed). Use the CODE, not the label. Also states the 6 PM in-time rule: it applies to OG1 (Day Outing) only, and 18:00 itself is allowed. Requires login.
Inputs: no named parameters.
get_marksARead-onlyIdempotent
Get internal marks/assessment scores: per component the raw marks, max marks, weightage (the marks that component contributes to the internal total), max weightage, class average and status. Use get_internal_totals instead when you want the TOTAL for each subject rather than the component breakdown. semesterId is optional; omit for current semester. If the response contains NOT_AUTHENTICATED, follow the error's recovery array and retry. Requires login.
Inputs: refresh, semesterId.
get_pending_subjectsARead-onlyIdempotent
Subjects still to complete: the curriculum baskets minus grade-history passes, with names and credits. Completion is decided ONLY by course code against the latest grade on record (a pass is any grade except F; N never counts as a pass) — period labels are never compared, because timetable labels are instructional semesters while grade-history labels are result-publication months. VTOP's own row marking is reported alongside, and any disagreement lands in discrepancies rather than being resolved silently. For elective baskets only N of M credits are required, so every uncompleted basket course is listed and the category totals say how far short. Read-only. Requires login.
Inputs: no named parameters.
get_proctor_detailsARead-onlyIdempotent
Proctor (faculty mentor) contact details: faculty id, name, designation, school, department, cabin, email, intercom and mobile. Same data as the proctor section of get_student_profile, via the standalone proctor page. Read-only. Requires login.
Inputs: no named parameters.
get_profileARead-onlyIdempotent
Get student profile (name, registration number, application number, program, branch, school, email, phone, blood group). If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. Requires login.
Inputs: no named parameters.
get_semester_gradesARead-onlyIdempotent
Get grades for a specific semester (course-wise letter grades + GPA). IMPORTANT: for a semester still in progress VTOP publishes no results, and this tool then returns published: false, gpa: null and an explanatory message — that is NOT a GPA of 0. semesterId is optional; omit for current semester. If the response contains NOT_AUTHENTICATED, follow the error's recovery array and retry. Requires login.
Inputs: refresh, semesterId.
get_semester_infoARead-onlyIdempotent
Term bounds for a semester: id, name, first/last instructional day from the academic calendar, instructional-day totals, days remaining, and whether teaching is over. When teachingOver is true, no more classes can occur — attendance figures are final (locked), not projectable. Use this to answer 'when does my semester end?' or 'how many teaching days are left?'. Requires login.
Inputs: refresh, semesterId.
get_semestersARead-onlyIdempotent
Get list of available semesters (id + name). IMPORTANT ORDERING: VTOP returns these NEWEST-FIRST -- index 0 is the current (in-progress) term and the LAST element is the OLDEST. To reach the most recent COMPLETED term use index 1, not the last element; taking the last element silently returns the student's first semester. Most data tools accept the semesterId, but they also default to the current semester if omitted — so you usually don't need to call this unless the user asks about a specific past semester. On failure the response carries structuredContent.error.code; if it is NOT_AUTHENTICATED, follow the error's recovery array (get_captcha then login) and retry this tool.
Inputs: no named parameters.
get_student_profileARead-onlyIdempotent
Full student profile: the five accordion sections of VTOP's profile page (personal, educational, family, proctor, hostel information), exactly as VTOP groups them with verbatim values. Use this instead of get_profile when you need anything beyond name/programme/branch/email/phone — date of birth, addresses, board/school, parents, proctor contact, hostel block and room. Privacy: this returns sensitive PII verbatim — keep it in the student's own session, don't paste it elsewhere. If the response contains NOT_AUTHENTICATED, immediately call get_captcha then login then retry this tool. login auto-uses VTOP_USERNAME/VTOP_PASSWORD env vars if set; if login replies that credentials are missing, ask the user for their VTOP username and password and call login again with them. Requires login.
Inputs: no named parameters.
get_timetableARead-onlyIdempotent
Get class timetable: registered courses with slots, venues, faculty and credits, plus the actual weekly schedule. Each course carries a sessions array with every meeting it has (day, slot, THEORY/LAB, start and end time, venue) — a course with two slots a week appears twice. The top-level day/startTime/endTime mirror the first session. Use get_today_classes for 'what do I have today' (it applies the academic calendar and day-order overrides). semesterId is optional; omit for current semester. If the response contains NOT_AUTHENTICATED, follow the error's recovery array and retry. Requires login.
Inputs: refresh, semesterId.
get_today_classesARead-onlyIdempotent
List the classes scheduled for today (or a given date) with their time and venue, accounting for the academic calendar — returns a holiday/no-class result on non-instructional days, and follows the correct day-order on working Saturdays (e.g. a Saturday running the Thursday timetable). Pass date (ISO YYYY-MM-DD) to check another day. If the response contains NOT_AUTHENTICATED, call get_captcha then login then retry. Requires login.
Inputs: date.
loginA
Step 2 of login: submit credentials + the captcha you just OCR'd. Username/password are optional — if VTOP_USERNAME and VTOP_PASSWORD are set as env vars on the MCP server, omit them and the server uses the stored values. Only ask the user for credentials if the server reports they're not configured. Failures return structuredContent.error with a code and needsUserInput; on CREDENTIALS_REQUIRED the captcha you already hold is still valid, so reuse it rather than fetching a new one.
Inputs: captcha (required), password, username.
logoutA
Logout from VTOP and clear the session.
Inputs: no named parameters.
session_statusARead-onlyIdempotent
Report the current VTOP session state: whether a session is active, the registration number, whether credentials are configured, and (with probe: true) whether VTOP still considers the session valid. Call this before logging in if unsure, or when a data tool returns NOT_AUTHENTICATED. Read-only — it never changes anything. Does not require login.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 33 tools
Most tools target clearly distinct resources and actions, and the descriptions proactively resolve near-overlaps (e.g. get_profile vs get_student_profile, get_marks vs get_internal_totals, get_leave_status vs get_leave_history, get_semesters vs get_semester_info). A few clusters remain somewhat confusable (the four curriculum tools and four marks/grades tools), but the descriptions generally steer correctly.
The set is uniformly snake_case with predictable verb_noun naming (get_*, apply_leave, cancel_leave, calculate_attendance, check_pass_eligibility). The only deviations are the verb-less auth tools (login, logout, session_status), which are reasonable given their role.
33 tools is heavy and sits in the over-large range, with some genuine redundancy (get_profile/get_student_profile, get_marks/get_internal_totals, three overlapping curriculum tools). However, the portal's breadth (auth, attendance, marks, curriculum, profile, fees, hostel leave, exams) justifies a large surface more than most.
Coverage is broad and lifecycle-aware: read access across attendance, marks, grades, curriculum, profile, fees and exams, plus a full two-step apply/cancel leave flow and a full auth flow. Only minor gaps exist (write operations for functions outside hostel leave, no exam re-evaluation/registration), which agents can work around.
Maintenance
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
MCP server providing attendance data queries via the CloudTime API.
PLATO (Pusan National University LMS) MCP server via Moodle Web Service API + ubboard scraping
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server for Universidade de São Paulo's student systems (Moodle, JupiterWeb) enabling assistants to query grades, schedule, tasks, and more via secure backend.205GPL 3.0
- AlicenseNot gradedqualityDmaintenanceMCP server that provides intelligent student assistance tools for academic calculations, attendance tracking, marks analysis, and syllabus reading via Groq LLM.15 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables an AI assistant to securely access a student's own VIT VTOP account through a read-only, structured MCP interface, providing academic summaries, CGPA, courses, attendance, assignments, events, feedback, and session status.MIT
- AlicenseNot gradedqualityBmaintenanceA read-only MCP server that exposes courses, assignments, calendar events, announcements, participants, and course materials from IIIT Hyderabad's Moodle instance through browser automation with persistent CAS-authenticated sessions.1MIT