Skip to main content
Glama

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.

License: Apache 2.0 Node 20.6+ MCP vtop-bhopal-mcp MCP server – quality and maintenance score on Glama

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_leave submits a real hostel leave application for your proctor, and cancel_leave withdraws 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: false so 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 provided

previewToken: a3f9c1d8e2b40756 Reply "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 build

dist/ is not committed, so the build step is required.

Prefer hosted? Use it straight from Glama — no clone or build needed:

vtop-bhopal-mcp MCP server – quality and maintenance score on Glama

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-password

It'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 build

dist/ 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-password

It'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 .env by 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 .env you just made is what gets loaded. Codex is the exception: it has no --env-file mechanism, so credentials (and VTOP_CAPTCHA_OPEN) go in its own config file's env block instead. A .env sitting 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

C:\Users\<you>\.config\opencode\opencode.jsonc

macOS / Linux

~/.config/opencode/opencode.jsonc

{
  "$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.js

That 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.js

Check with claude mcp list, then start a new chat.

Claude Desktop — same command + args shape in its config file:

OS

File

Windows

%APPDATA%\Claude\claude_desktop_config.json

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

{
  "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

🎓

get_attendance

Attended / total / percentage per course

🎓

get_attendance_detail

Per-class present/absent per day, or NOT POSTED

🎓

calculate_attendance

How many classes you can still skip (or must attend) to hold 75%

🎓

get_today_classes

Today's classes — times and rooms, holiday-aware

🎓

get_timetable

Registered courses, slots, venues, faculty, credits

📝

get_marks

CAT and internal-assessment marks with weightage

📝

get_internal_totals

Marks banked per course, plus everything still to come

📝

get_exam_schedule

CAT-1, CAT-2, FAT — dates, sessions, venues, seats

📝

check_pass_eligibility

What you must score to pass, in both scales

📊

get_semester_grades

Grades and GPA for one semester

📊

get_grade_history

CGPA, credits, courses grouped by exam month

📊

get_curriculum_progress

Credits earned vs required, by category

📊

get_course_basket

Which basket a course is in, and its credits

🔍

search_faculty

Faculty directory search with detail cards (department, email, cabin)

📄

get_course_syllabus

Downloads a course's syllabus PDF, returns the saved file path

🗓

get_calendar

Holidays, exams, events, instructional days

🗓

get_semester_info

Term bounds, days left, teaching-over flag

🗓

get_semesters

All your semesters and their IDs

🗓

get_profile

Name, registration number, programme, branch, plus photo file

🏠

get_leave_types

Leave types VTOP currently offers

🏠

get_leave_status

Your leave applications and approval status

🔐

session_status

Whether you're logged in and whether VTOP agrees

🔐

get_captcha · login · logout

Signing in and out

⚠️

apply_leave

Submits a real leave application — two-step, see above

⚠️

cancel_leave

Withdraws an applied leave — two-step, see above

🔍

get_leave_type_rules

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

docs/tools.md

All 35 tools — arguments, returns, read/write

docs/hostel-leave.md

Leave types, rules, the two-step confirmation

docs/http-connector.md

Hosting it remotely, and its security model

docs/errors.md

Error codes, recovery paths, troubleshooting

docs/bhopal-vtop.md

How Bhopal's markup and endpoints actually behave

docs/development.md

Architecture, tests, adding a tool

docs/provenance.md

What came from where, with line counts

CONTRIBUTING.md

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:privacy enforces 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

Vikranth Jagdish

MIT

~43% inherited

Bhopal parser adaptations

divyarthjain

Apache-2.0

~247 lines, 5 files

Leave, pass rules, errors, cache

CipherxHub

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 tools
apply_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_attendanceA
Read-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_leaveA
Destructive

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_eligibilityA
Read-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_acknowledgmentsA
Read-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_attendanceA
Read-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_detailA
Read-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_calendarA
Read-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_basketA
Read-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_basketsA
Read-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_progressA
Read-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_scheduleA
Read-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_receiptsA
Read-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_historyA
Read-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_totalsA
Read-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_historyA
Read-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_statusA
Read-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_rulesA
Read-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_typesA
Read-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_marksA
Read-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_subjectsA
Read-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_detailsA
Read-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_profileA
Read-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_gradesA
Read-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_infoA
Read-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_semestersA
Read-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_profileA
Read-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_timetableA
Read-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_classesA
Read-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_statusA
Read-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

    A4.1/5.0

    Scored across 33 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count3/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers