Skip to content
MCP · MODEL CONTEXT PROTOCOL

Kalender Libur Nasional Sekarang Bisa Diajak Ngobrol: Bikin MCP Server buat Calendar

Fitur calendar hari libur nasional yang viral organik sekarang punya MCP server sendiri di /calendar/mcp. Bahas cara connect dari Claude Desktop/web/Cursor, enam tools yang tersedia, dua MCP Apps interaktif, dan technical gotchas soal dual-era protocol dan trailing-slash redirect yang diam-diam bikin POST gagal.

HUSNI ADIL MAKMUR · · 8 MIN READ · 1.479 KATA

Long Weekend 2026 Kapan Aja?

Coba ketik ini ke Claude kamu:

“long weekend 2026 kapan aja, dan berapa hari cuti yang gue butuh?”

Kalau kamu udah connect ke server yang bakal saya certain di post ini, Claude bakal jawab langsung — bukan nebak dari training data yang bisa aja outdated, tapi dari data kalender hari libur nasional yang sama persis dengan yang di husniadil.com/calendar. Lengkap sama berapa hari cuti yang perlu diambil buat dapetin long weekend itu.

Ini sequel dari post soal fitur calendar yang viral organik beberapa bulan lalu. Kalau dulu ceritanya “orang nemu calendar ini lewat Google Search”, sekarang ceritanya beda: calendar-nya sekarang bisa diakses langsung sama AI agent, tanpa perlu buka browser sama sekali. Namanya MCP — Model Context Protocol, standar dari Anthropic buat ngasih AI agent akses ke tools dan data eksternal.

Ga usah panjang lebar, ini yang berubah: /calendar/mcp sekarang live, public, dan gratis dipakai siapa aja.

Connect-nya Gampang: Satu URL, No Auth

Endpoint-nya cuma satu:

https://husniadil.com/calendar/mcp

Ga ada API key, ga ada login, ga ada rate limit per-client. Server-nya public dan read-only — cuma nge-serve data kalender, jadi ga ada alasan buat auth-gate.

Claude Desktop / Claude web — tambahin ke claude_desktop_config.json (atau connector settings di web):

{
  "mcpServers": {
    "calendar-indonesia": {
      "url": "https://husniadil.com/calendar/mcp"
    }
  }
}

Cursor — sama polanya, tinggal masukin URL yang sama ke MCP settings-nya.

Mau coba-coba dulu tanpa setup client? MCP Inspector-nya official dari Anthropic bisa langsung dipake dari terminal:

npx @modelcontextprotocol/inspector https://husniadil.com/calendar/mcp

Itu doang. Restart client kamu, dan calendar Indonesia udah jadi salah satu tools yang bisa dipanggil.

Enam Hal yang Bisa Kamu Tanyain

Daripada nge-dump schema JSON (boring, dan lo ga butuh itu buat pake-nya), ini enam tools-nya dalam bentuk pertanyaan manusia:

  • “Libur apa aja bulan Desember 2026?”list_holidays, kasih semua hari libur dalam range yang kamu mau.
  • “Kapan tanggal Idul Fitri 2026?”get_holiday, cari satu hari libur spesifik.
  • “Ada libur yang namanya ada ‘Imlek’ ga?”search_holidays, cari berdasarkan nama.
  • “31 Desember 2026 itu hari libur, weekend, atau hari kerja?”check_date, cek satu tanggal spesifik.
  • “Long weekend 2026 kapan aja, dan berapa hari cuti yang gue butuh?”find_long_weekends, ini yang paling berguna buat planning liburan.
  • “Kalau gue kerja dari 1 Januari sampai 31 Maret 2026, berapa hari kerja aktualnya?”count_workdays, ngitung hari kerja dalam range, udah exclude weekend dan libur nasional.

Semua enam tools ini pake nama snake_case — bukan keputusan sembarangan, itu ekosistem norm-nya MCP (~90% tools yang ada pake pattern ini), dan konsistensi nama measurably ngaruh ke seberapa akurat model milih tools yang tepat.

MCP Apps: Kalender yang Muncul di Chat

Yang bikin ini beda dari sekadar tool call biasa yang balikin teks: dua dari enam tools di atas punya UI interaktif yang muncul langsung di dalam chat kamu, bukan cuma teks jawaban.

Pas kamu minta list_holidays buat satu tahun penuh, hasilnya dirender sebagai grid kalender tahunan — persis kayak yang kamu lihat di halaman /calendar/[year] di website, tapi muncul inline di percakapan.

Pas kamu minta find_long_weekends, hasilnya dirender sebagai timeline long weekend yang nunjukkin setiap kesempatan long weekend beserta leave cost-nya — berapa hari cuti yang perlu diambil buat dapetin berapa hari libur berturut-turut.

Ini namanya MCP Apps, ekstensi dari protocol yang ngasih host (kayak Claude Desktop) cara buat render UI resource di dalam sandboxed iframe, bukan cuma nampilin teks mentah. Sayangnya untuk post ini saya belum sempat capture screenshot-nya dari MCP Inspector session — itu jadi follow-up yang perlu saya lengkapi nanti. Tapi kalau kamu udah connect, coba aja langsung minta long weekend 2026 dan lihat sendiri.

Buka Website-nya Langsung? Tools yang Sama Juga Ada

Kalau kamu browsing pake agentic browser (yang support WebMCP), buka aja husniadil.com/calendar langsung — enam tools yang sama otomatis available buat agent kamu, tanpa perlu setup MCP server terpisah. Ini bukan implementasi kedua yang terpisah dan gampang drift — WebMCP dan remote MCP server sama-sama baca dari satu tool registry yang sama persis, dan ada parity test yang guard supaya dua surface ini ga pernah beda nama atau schema.

Sebelumnya WebMCP integration di site ini cuma punya 3 tools, dan ada bug spec-conformance yang saya temuin pas nyatuin dua surface ini: dia balikin plain object padahal spec WebMCP expect MCP result yang proper. Udah kefix sekarang, sekalian upgrade ke 6 tools.

Gimana Cara Bikinnya

Ini bagian yang lebih technical — kalau kamu cuma mau tau cara pakenya, bagian di atas udah cukup. Tapi kalau kamu penasaran, ada beberapa gotcha yang lumayan bikin mikir.

Dual-era protocol itu wajib, bukan opsional

MCP protocol punya beberapa revisi. Revisi terbaru, 2026-07-28, menghapus initialize handshake, session, dan GET stream — semuanya jadi per-request, stateless. Tapi masalahnya, sebagian besar MCP client yang beneran dipake orang sekarang masih pake revisi lama (2025-06-18 atau 2025-11-25), yang justru butuh handshake itu.

Spec-nya sendiri ga ngasih cara buat client lama “fallback” ke server baru. Jadi server ini harus ngerti dua era sekaligus — modern era yang stateless per-request, dan legacy era yang tetep butuh initialize di awal. Untungnya @modelcontextprotocol/server v2 udah nge-handle dual-era ini secara default lewat legacy: 'stateless' option, jadi ga perlu hand-roll logic-nya sendiri.

SDK v2 itu Web-standard, cocok banget sama Workers

Beda dari v1 yang pake Node http module, SDK v2 pake Request/Response standar Web API. Ini penting karena site ini deploy di Cloudflare Workers, yang emang Web-standard dari sononya — ga ada Node built-ins yang perlu di-polyfill, ga ada masalah bundling yang biasa muncul kalau paksain library Node-oriented jalan di edge runtime.

SDK-nya ga ngasih CORS gratis

Ini yang lumayan gotcha: SDK-nya sendiri ga handle CORS. OPTIONS request balikin 405 tanpa header Access-Control-* apa pun. Kalau dibiarin gitu, client berbasis browser (termasuk MCP Inspector) bakal gagal di preflight check. Jadi route Astro-nya harus intercept OPTIONS sendiri sebelum delegate ke handler, dan nambahin header CORS yang proper ke response-nya.

Trailing-slash redirect yang diam-diam bunuh POST request

Ini bug yang paling sneaky. Site ini punya middleware yang redirect trailing slash buat SEO canonicalization — misalnya /calendar/ jadi /calendar. Masalahnya, middleware itu awalnya redirect semua method, termasuk POST. Dan MCP client ngirim request-nya lewat POST.

Hasilnya: setiap request ke /calendar/mcp balik jadi 301 redirect, dan MCP client — yang ga expect redirect di tengah-tengah protocol negotiation — langsung gagal connect. Diam-diam, tanpa error message yang jelas. Fix-nya simpel begitu ketemu: canonicalization sekarang cuma jalan buat GET/HEAD, method lain di-skip.

Satu algoritma, dua tempat munculnya jawaban

find_long_weekends tools ini ga bikin logic baru — dia delegate langsung ke findBridgeOpportunities, algoritma bridge/long-weekend yang udah lama dipake di halaman planning calendar website. Konsekuensinya: jawaban yang dikasih MCP server dan yang dirender di halaman calendar ga akan pernah beda. Satu source of truth, dua permukaan.

Batasannya: Data 2020–2029, Bukan Cuma 2020–2026

Ini bagian yang paling penting buat dipahami sebelum kamu percaya penuh sama jawabannya — dan ini juga bagian paling menarik dari cerita korekksi yang terjadi selama development.

Dataset-nya nyakup 2020 sampai 2029, tiga tier yang beda tingkat kepastiannya:

  • 2020–2026: resmi, berdasarkan SKB 3 Menteri (Surat Keputusan Bersama) — dasar hukum yang sama dipake pemerintah buat nentuin tanggal merah dan cuti bersama.
  • 2027–2029: prediksi, dihitung dari pola tahun-tahun sebelumnya. Ini bukan data kosong atau tebakan asal — ini prediksi yang website-nya sendiri udah tampilin lengkap dengan disclaimer “perkiraan/prediksi”.
  • 2030 ke atas: ga ada data sama sekali. Tools yang dipanggil buat tahun-tahun ini fallback ke ngitung weekend doang.

Kenapa ini penting: setiap hasil dari tools ini bawa coverage block yang bilang tahun mana yang official, mana yang prediksi, mana yang ga ada datanya sama sekali. Dan setiap kali jawaban nyentuh tahun prediksi, teks jawabannya selalu nge-flag itu secara eksplisit — bukan cuma di data terstruktur yang bisa aja di-skip model, tapi di teks yang beneran dibaca. Jadi kalau kamu tanya soal long weekend 2028, Claude bakal jawab sambil bilang “ini prediksi, bukan keputusan resmi” — bukan nyajiin tebakan seolah-olah itu fakta.

Satu hal lagi yang perlu diinget: SKB buat satu tahun biasanya baru terbit sekitar kuartal 3 tahun sebelumnya. Jadi kalau kamu nanya soal 2027 sekarang, jawabannya emang masih prediksi — bukan karena server-nya kurang update, tapi karena keputusan resminya sendiri emang belum ada.

Kesimpulan

  • Endpoint-nya satu: https://husniadil.com/calendar/mcp, gratis, no auth.
  • Enam tools yang sama persis dipake dua tempat: remote MCP server dan WebMCP di website, dijamin ga drift lewat parity test.
  • Dua MCP Apps bikin jawabannya bukan cuma teks — ada grid kalender dan timeline long weekend yang muncul langsung di chat.
  • Data-nya jujur soal ketidakpastian: 2020–2026 resmi, 2027–2029 prediksi yang selalu di-flag, 2030+ ga ada data.

Yang paling saya suka dari proyek ini: ini bukan fitur baru yang berdiri sendiri, tapi cara baru buat ngakses fitur yang udah ada dan udah viral organik itu. Data-nya sama, algoritma-nya sama, cuma permukaannya yang nambah. Kalau kamu udah connect calendar ini ke Claude atau Cursor kamu, coba tanyain soal long weekend berikutnya — dan kasih tau saya kalau ada yang aneh dari jawabannya.