mcpField
M
mycal

mycal

本地服务
github.com/Junhui20生产力32 天前更新

关于 mycal

mycal 是面向需要查询州属假日、校历和工作日的用户的马来西亚日历 API 与 MCP 服务。它还提供休假规划,并采用马来西亚政府来源的数据。

主要功能

  1. 01按州查询公共假日
  2. 02周末与补假规则
  3. 03工作日计算
  4. 04学期、学校假期与考试
  5. 05休假及长周末规划

适用场景

  1. 01确认某日是否为工作日
  2. 02计算州属工作日数量
  3. 03查询学期与考试日期
  4. 04围绕公共假日规划休假

MCP 相关

MCP 服务向兼容 MCP 的 AI 助手提供 13 种日历工具,支持查询假日、工作日、校历和休假规划。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"junhui20-mycal": {
"command": "npx",
"args": [
"-y",
"@catlabtech/mycal-mcp-server"
]
}
}
}
启动命令npx -y @catlabtech/mycal-mcp-server

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@catlabtech/mycal-mcp-server0.1.4

工具

13

收录的工具列表 · 更新于 2 周前

参数类型必填说明
typeenum否federal | state | islamic | islamic_state | replacement | adhoc
yearinteger是年份(例如 2026)
monthinteger否
statestring否州代码或别名(例如 'selangor'、'KL'、'penang')
statusenum否confirmed | tentative | announced | cancelled

详细介绍

马来西亚日历 API

马来西亚最全面的日历 API——公共假日、学校日历、考试安排,以及面向 AI 工具的 MCP 服务。

npm: mycal-core npm: mycal-sdk npm: mycal-mcp-server License: MIT Deploys on Cloudflare

数据来源:政府官方公报(JPM BKPP)、JAKIM、KPM、MPM。数据并非从第三方网站抓取。

链接

软件包

以 @catlabtech 作用域发布到 npm:

软件包用途安装
@catlabtech/mycal-core共享类型、Zod 模式以及日历和工作日逻辑npm install @catlabtech/mycal-core
@catlabtech/mycal-sdkREST API 的 TypeScript 客户端 SDKnpm install @catlabtech/mycal-sdk
@catlabtech/mycal-mcp-server提供 13 个日历工具的 MCP 服务,供 AI Agent 使用npm install @catlabtech/mycal-mcp-server

功能

  • 2026 年的 50 个公共假日,数据来自官方公报(Warta Kerajaan)——包括联邦假日和州属假日
  • 13 个州 + 3 个联邦直辖区,支持别名(KL、JB、Penang 等)
  • 考虑周末安排——吉打州/吉兰丹州/登嘉楼州采用周五至周六(Kumpulan A),其他地区采用周六至周日(Kumpulan B),并记录柔佛州历史上的周末安排变更
  • Cuti ganti(补假)根据各州周末安排自动计算
  • 工作日计算器——按州计算,并考虑假日
  • 学校日历——学期、假期、KPM 节庆假期(Lampiran A/B/C)
  • 考试安排——SPM、STPM、MUET、PT3
  • iCal 订阅源——各州独立的 .ics 订阅源
  • 面向 AI Agent 的 MCP 服务——提供 13 个工具,适用于 Claude、ChatGPT 和其他助手
  • TypeScript SDK(@catlabtech/mycal-sdk),提供类型化响应
  • OpenAPI 3.1 规范 + 交互式文档
  • 三语支持——马来语、英语和中文名称(三语支持)

快速开始

# Clone and install
git clone https://github.com/Junhui20/malaysia-calendar-api.git
cd malaysia-calendar-api
pnpm install

# Build shared packages
pnpm --filter @catlabtech/mycal-core build
pnpm --filter @catlabtech/mycal-sdk build

# Run API locally (http://localhost:8787)
cd packages/api && npx wrangler dev

# Run web site locally (http://localhost:4321)
pnpm --filter @mycal/web dev

# Validate data
pnpm validate

# Run tests
pnpm test

API 示例

基础 URL:https://mycal-api.huijun00100101.workers.dev/v1

列出假日
# All holidays for Selangor in 2026
curl "https://mycal-api.huijun00100101.workers.dev/v1/holidays?year=2026&state=selangor"

# Islamic holidays only
curl "https://mycal-api.huijun00100101.workers.dev/v1/holidays?year=2026&type=islamic"

# March holidays for KL
curl "https://mycal-api.huijun00100101.workers.dev/v1/holidays?year=2026&state=KL&month=3"
查询日期
# Is March 21 a holiday/weekend/working day?
curl "https://mycal-api.huijun00100101.workers.dev/v1/holidays/check?date=2026-03-21&state=KL"

响应:

{
  "data": {
    "date": "2026-03-21",
    "dayOfWeek": "Saturday",
    "isHoliday": true,
    "isWeekend": true,
    "isWorkingDay": false,
    "isSchoolDay": false,
    "holidays": [
      {
        "id": "2026-hari-raya-aidilfitri-1",
        "name": { "ms": "Hari Raya Aidilfitri", "en": "Eid al-Fitr", "zh": "开斋节" },
        "type": "islamic",
        "status": "confirmed"
      }
    ]
  }
}
工作日
# Count working days in March for Selangor
curl "https://mycal-api.huijun00100101.workers.dev/v1/business-days?start=2026-03-01&end=2026-03-31&state=selangor"

# Add 10 business days to a date
curl "https://mycal-api.huijun00100101.workers.dev/v1/business-days/add?date=2026-03-01&days=10&state=selangor"
学校日历
# Is this a school day?
curl "https://mycal-api.huijun00100101.workers.dev/v1/school/is-school-day?date=2026-03-21&state=selangor"

# School holidays for Kumpulan B
curl "https://mycal-api.huijun00100101.workers.dev/v1/school/holidays?year=2026&group=B"

# Exam schedule
curl "https://mycal-api.huijun00100101.workers.dev/v1/school/exams?year=2026&type=spm"
下一个假日
# Next holiday for Penang
curl "https://mycal-api.huijun00100101.workers.dev/v1/holidays/next?state=penang"
州属解析
# Resolve alias
curl "https://mycal-api.huijun00100101.workers.dev/v1/states/resolve?q=kl"
# -> { "data": { "canonical": "kuala-lumpur", "group": "B" } }

完整 API 参考

端点描述
GET /v1/holidays列出节假日(可按年份、州属、类型、状态和月份筛选)
GET /v1/holidays/check该日期是节假日、周末、工作日还是上学日?
GET /v1/holidays/today今天的节假日状态
GET /v1/holidays/next下一个即将到来的节假日
GET /v1/holidays/between日期范围内的节假日
GET /v1/holidays/leave-optimizer建议如何使用年假,以获得最长的连续假期
GET /v1/business-days计算日期之间的工作日数
GET /v1/business-days/add从某个日期起增加 N 个工作日
GET /v1/states全部 13 个州和 3 个联邦直辖区及其周末设置
GET /v1/states/resolve将别名(KL、penang、jb)解析为规范代码
GET /v1/school/terms学期日期和天数
GET /v1/school/holidays学校假期和 KPM 节庆假期
GET /v1/school/examsSPM、STPM、MUET、PT3 考试安排
GET /v1/school/is-school-day这一天是上学日吗?
GET /v1/feed/ical/:stateiCal 订阅源
GET /v1/feed/csv/:state节假日的 CSV/电子表格导出
GET /v1/data/*原始、可缓存的开放数据快照——manifest、states、holidays/:year、all(无需 API 密钥)
GET /v1/prayer-times/:zone指定区域的 JAKIM 祷告时间(采用 MYT 格式);GET /v1/prayer-times/zones 列出区域目录
POST /v1/keys签发 API 密钥(目前需要管理员权限;GET /v1/keys/whoami 用于检查调用方的等级)

请求/响应架构请参阅完整的 OpenAPI 3.1 规范。

SDK 用法

import { MyCalClient } from "@catlabtech/mycal-sdk";

const cal = new MyCalClient();

// Check if a date is a working day
const result = await cal.check("2026-03-21", "selangor");
console.log(result.isWorkingDay); // false

// List holidays
const holidays = await cal.holidays({ year: 2026, state: "KL" });

// Business days
const workDays = await cal.businessDays("2026-03-01", "2026-03-31", "selangor");
console.log(workDays.businessDays); // 22

// School calendar
const terms = await cal.school.terms({ year: 2026, group: "B" });
const exams = await cal.school.exams({ year: 2026, type: "spm" });
const isSchool = await cal.school.isSchoolDay("2026-03-21", "selangor");

MCP 服务

将 Malaysia Calendar API 连接到 Claude、ChatGPT 或任何兼容 MCP 的 AI 助手。

使用 Claude Desktop / Claude Code 进行设置

添加到 MCP 配置中:

{
  "mcpServers": {
    "malaysia-calendar": {
      "command": "npx",
      "args": ["@catlabtech/mycal-mcp-server"]
    }
  }
}
可用工具(13 个)
工具描述
get_malaysia_holidays获取公共假期(可按年份、州属和类型筛选)
check_malaysia_holiday检查某个日期是否为节假日或工作日
next_malaysia_holiday查找下一个即将到来的节假日
malaysia_business_days计算两个日期之间的工作日数
malaysia_long_weekends查找长周末(3 天及以上)
malaysia_leave_optimizer查找最有效的请假日期,以尽可能延长连续休假时间
list_malaysia_states列出所有州属及其周末设置
resolve_malaysia_state将别名(KL、JB)解析为规范代码
malaysia_holiday_changes最近的数据变更
malaysia_school_terms学期日期和天数
malaysia_school_holidays学校假期(cuti penggal、cuti perayaan)
malaysia_examsSPM、STPM、MUET、PT3 考试安排
malaysia_is_school_day检查某个日期是否为上学日

州属代码

代码别名组别周末
johorjhr, jbB周六至周日(2014–2024 年为周五至周六)
kedahkd, kdhA周五至周六
kelantankel, kbA周五至周六
terengganutrg, ktA周五至周六
perakprk, ipohB周六至周日
pulau-pinangpenang, pgB周六至周日
selangorsel, sgrB周六至周日
negeri-sembilanns, n9B周六至周日
melakamlk, malaccaB周六至周日
pahangphg, kuantanB周六至周日
perlispls, kangarB周六至周日
sabahsbh, kkB周六至周日
sarawakswk, kuchingB周六至周日
kuala-lumpurklB周六至周日
wp-putrajayaputrajaya, pjyB周六至周日
wp-labuanlabuan, lbnB周六至周日

州属别名不区分大小写。使用 GET /v1/states/resolve?q=kl 可将任何别名解析为规范代码。

项目结构

malaysia-calendar-api/
├── data/                        # JSON data files (source of truth / 数据源)
│   ├── holidays/
│   │   ├── 2024.json            # Holiday data per year
│   │   ├── 2025.json
│   │   └── 2026.json
│   ├── school/
│   │   ├── terms-2026.json      # School terms (Kumpulan A + B)
│   │   ├── holidays-2026.json   # School holidays + KPM cuti perayaan
│   │   └── exams-2026.json      # SPM, STPM, MUET, PT3 schedules
│   ├── states.json              # 13 states + 3 FT, aliases, weekend history
│   └── known-fixed-holidays.json
├── packages/
│   ├── core/                    # Shared business logic (types, schemas, utils)
│   │   └── src/
│   │       ├── types.ts         # Holiday, State, SchoolTerm, Exam interfaces
│   │       ├── schemas.ts       # Zod validation schemas
│   │       ├── filter.ts        # Query filtering logic
│   │       ├── replacement.ts   # Cuti ganti calculation
│   │       ├── state-resolver.ts
│   │       ├── business-days.ts
│   │       └── school.ts        # School term/holiday/exam logic
│   ├── api/                     # Hono API on Cloudflare Workers
│   ├── mcp-server/              # MCP Server (13 tools)
│   ├── sdk/                     # TypeScript client SDK (@catlabtech/mycal-sdk)
│   └── web/                     # Astro + Starlight — marketing site, demos, docs
├── scripts/
│   ├── validate-data.ts         # 5-layer data validation pipeline
│   └── sync-to-kv.ts           # JSON -> Cloudflare KV denormalization
├── openapi.yaml                 # OpenAPI 3.1 spec (spec-first)
├── pnpm-workspace.yaml
└── turbo.json

数据来源

所有数据均来自马来西亚政府官方出版物:

来源数据URL
JPM BKPP联邦公报 / Warta Kerajaan(公共假期)kabinet.gov.my
JAKIMTakwim Hijri-Miladi(伊斯兰历)e-solat.gov.my
KPMKalendar Akademik / 校历(Lampiran A/B/C)moe.gov.my
MPMSTPM 和 MUET 考试安排mpm.edu.my
州门户网站各州特定假期(13 个州)*.gov.my

假期数据包含公报引用编号(例如,P.U.(B) 305/2025),以便追溯。

部署

两部分独立部署:

API → Cloudflare Workers
pnpm --filter @catlabtech/mycal-core build
cd packages/api && npx wrangler deploy
网站 → Cloudflare Pages
pnpm --filter @catlabtech/mycal-core build
pnpm --filter @catlabtech/mycal-sdk build
pnpm --filter @mycal/web build

# Direct upload via wrangler (requires CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID)
cd packages/web
npx wrangler pages deploy dist --project-name=mycal-web

首次设置 Pages:

  1. 在 Cloudflare 控制面板中创建一个名为 mycal-web 的 Pages 项目。
  2. 连接 GitHub 仓库以自动构建,或使用 GitHub Actions 工作流(.github/workflows/deploy.yml)通过 wrangler pages deploy 推送。
  3. 必需的 GitHub 密钥:CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID。
CI/CD

GitHub Actions 负责:

  1. PR 门禁 — 每个 PR 都会进行 Zod 架构验证和跨来源检查
  2. 部署 — 合并到 main 后:并行构建并将 API 部署到 Workers、将 Web 部署到 Pages
  3. 每日抓取 — 监控政府门户网站更新
  4. Rukyah 监控 — 跟踪伊斯兰历日期确认情况

贡献

请参阅 CONTRIBUTING.md,了解如何:

  • 报告缺失的假期或 cuti peristiwa
  • 修复数据错误
  • 添加新功能

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。