MCP Server

The bilauitmcuti MCP server lets AI assistants read the UiTM academic calendar and Malaysia public holidays in plain language. It is read-only and sits on top of the public API, so there is no API key and nothing can be changed.

For example, ask “When does lecture week 1 start for session B-20264?” or “List the public holidays in Selangor for 2026.”

Quick start

The server is hosted — there is nothing to install. Point your MCP client at the URL:

In a client that uses a JSON config (like Cursor), add the server by URL:

{
  "mcpServers": {
    "bilauitmcuti": {
      "type": "http",
      "url": "https://mcp.bilauitmcuti.com/mcp"
    }
  }
}

When it connects, try one of the example prompts.

Auth & limits

No API key. The server is public and read-only — tools only issue GET requests. Calls share the same public API rate limits (500 requests / minute per IP, plus a heavy bucket for full-dataset queries). GET /mcp/health is not rate limited. See Rate limits for details.

Legal: Privacy Policy · Terms of Use · hello@bilauitmcuti.com

Add to Claude (custom connector)

  1. Open Settings → Connectors (or the + menu in chat → Connectors) and choose Add custom connector.
  2. Set Connector name to Bila UiTM Cuti, Server URL to https://mcp.bilauitmcuti.com/mcp, leave OAuth fields empty, and click Add.
  3. In a chat, open Connectors, enable Bila UiTM Cuti, and ask a question (for example public holidays in Selangor for 2026).

What is MCP?

The Model Context Protocol is an open protocol for connecting AI assistants to outside data and tools. Through this server, your assistant can read:

  • Academic calendar — sessions, activities, breaks, and exam weeks for groups A and B.
  • Lecture weeks — the 14 teaching weeks in a session.
  • Today — what is on for a given date.
  • Public holidays — Malaysia holidays by year, coverage, and state.

How it works

The server runs remotely over the Streamable HTTP transport at /mcp. Your client connects to the URL, and the server turns each request into a GET call to /api/v1/* and hands back the result. There is nothing to install or run locally. Source: bilauitmcuti/mcp.

Available tools

Each tool calls one endpoint. Boolean query flags accept real booleans. get_calendar and get_public_holidays also accept limit / compact to trim large payloads. For endpoint field details, see the Academic calendar and Public holidays pages.

ToolEndpointDescription
get_academic_metaGET /api/v1/metaList UiTM sessions & programs — use first for valid session IDs (group A/B or all).
get_calendarGET /api/v1/calendarGet academic calendar activities — lectures, breaks, exams for a session or group.
get_today_statusGET /api/v1/todayCheck if a date is a class day, break, exam week, or study week (group required).
get_lecture_weeksGET /api/v1/lecture-weeksGet lecture week dates (Week 1–14) for one session.
get_public_holiday_metaGET /api/v1/public-holiday/metaList public holiday filters — years, coverage, and state slugs.
get_public_holidaysGET /api/v1/public-holidayList Malaysia public holidays by year, coverage, and state.

Example call

A typical tools/call request (Streamable HTTP POST body) looks like this:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_today_status",
    "arguments": {
      "group": "B",
      "date": "2026-03-09"
    }
  }
}

The tool returns both a text block (stringified JSON) and structuredContent for clients that prefer typed results:

{
  "content": [
    {
      "type": "text",
      "text": "{ \"date\": \"2026-03-09\", \"group\": \"B\", ... }"
    }
  ],
  "structuredContent": {
    "date": "2026-03-09",
    "group": "B"
  }
}

Verify it works

Use the MCP Inspector against the hosted URL:

npx @modelcontextprotocol/inspector https://mcp.bilauitmcuti.com/mcp

Or list tools with curl (POST only — a bare GET /mcp returns 405, which is expected):

curl -s -X POST 'https://mcp.bilauitmcuti.com/mcp' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Uptime monitors (Better Stack) should GET https://mcp.bilauitmcuti.com/mcp/health and expect HTTP 200 — not GET /mcp.

Configuration

Any client that supports a remote (Streamable HTTP) MCP server works. Point it at https://mcp.bilauitmcuti.com/mcp — setup for common clients is below.

Cursor

Add the server to .cursor/mcp.json, then switch it on under Cursor Settings → MCP:

{
  "mcpServers": {
    "bilauitmcuti": {
      "type": "http",
      "url": "https://mcp.bilauitmcuti.com/mcp"
    }
  }
}

Claude Code

Add it from the CLI:

claude mcp add --transport http bilauitmcuti https://mcp.bilauitmcuti.com/mcp

Or commit it to a project by adding this to .mcp.json — remote servers need "type": "http":

{
  "mcpServers": {
    "bilauitmcuti": {
      "type": "http",
      "url": "https://mcp.bilauitmcuti.com/mcp"
    }
  }
}

Claude Desktop and Claude web/mobile use custom connectors instead of this CLI — see ChatGPT & Claude below.

VS Code

VS Code (GitHub Copilot) uses a servers key in .vscode/mcp.json:

{
  "servers": {
    "bilauitmcuti": {
      "type": "http",
      "url": "https://mcp.bilauitmcuti.com/mcp"
    }
  }
}

Codex

Add it from the CLI:

codex mcp add bilauitmcuti --url https://mcp.bilauitmcuti.com/mcp

Or edit ~/.codex/config.toml yourself, then restart Codex:

[mcp_servers.bilauitmcuti]
url = "https://mcp.bilauitmcuti.com/mcp"

OpenCode

Add it from the CLI:

opencode mcp add bilauitmcuti --url https://mcp.bilauitmcuti.com/mcp

Or under the mcp key in opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bilauitmcuti": {
      "type": "remote",
      "url": "https://mcp.bilauitmcuti.com/mcp",
      "enabled": true
    }
  }
}

ChatGPT & Claude (web & mobile)

Both add remote servers as custom connectors. In ChatGPT, turn on Developer mode under Settings → Apps & Connectors → Advanced settings, then Create a connector with this URL and set authentication to None — this server is public and read-only. In Claude (Desktop, web, or mobile), add a custom connector the same way. A connector you add on the web shows up in the mobile apps too.

ChatGPT custom connectors need a paid plan (Plus, Pro, Business, Enterprise, or Edu); on Business/Enterprise/Edu an admin enables Developer mode first.

Official setup guides from each provider:

Example prompts

Once it is connected, ask things like:

  • When does lecture week 1 start for session B-20264?
  • Is 2026-03-09 a class day for Group B Diploma?
  • List Malaysia public holidays in Selangor for 2026.
  • What UiTM sessions are available for Group A?

Troubleshooting

  • Tools don't show up — remove any existing bilauitmcuti MCP server or connector, add it again with https://mcp.bilauitmcuti.com/mcp, then restart the client and refresh the tools list. Tool schemas are sanitized for Claude, Cursor, ChatGPT, and VS Code (no $schema key).
  • Can't connect / fetch failed — use Streamable HTTP with type: "http" where supported, and double-check the URL is exactly https://mcp.bilauitmcuti.com/mcp.
  • GET /mcp returns 405 — expected. Use POST (or the Inspector) for Streamable HTTP.
  • Rate limited (429) — you are sending too many requests. Wait the seconds in the Retry-After header, then retry.
  • Still stuck? — run the Verify steps with MCP Inspector.

Changelog

  • 1.0.2 — remote Streamable HTTP server with calendar and public-holiday tools, resources, prompts, and structured tool results.