Timestamp-first perpetual calendar interop for AI agents — MCP server for cross-calendar conversion across East/West calendar systems.
Project description
Clawlendar
Timestamp-first perpetual calendar interop for AI agents.
Clawlendar = Claw (AI agent) + Calendar
Clawlendar helps agents speak the same time language across systems, regions, and calendar traditions. It normalizes an instant first (Unix timestamp), then projects to multiple calendars with a stable JSON contract.
Available as an MCP server (for Claude Desktop / Claude Code), a FastAPI HTTP service, and a CLI tool.
One-line Install
Via ClawHub
clawhub install clawlendar
Via pip + Claude Code
python3 -m pip install -U "clawlendar[all]" && claude mcp add clawlendar -- clawlendar
Minimal install (pip only)
python3 -m pip install -U clawlendar
Full local stack (HTTP + all optional providers)
python3 -m pip install -r requirements.txt
Live Demo (Vercel)
- Frontend demo: https://clawlendar-web.vercel.app/
Agent Access Pattern (Vercel + JSON API)
- Use Vercel frontend for human entry and discovery.
- Use JSON API (
/life-context,/day-profile, etc.) for agent-to-agent integration. - Recommended: add
/api/*proxy routes inclawlendar-webthat forward to your Clawlendar backend. - Guide:
docs/vercel-agent-gateway.md
GitHub Pages Showcase
This repo includes a showcase page at docs/index.html for GitHub Pages.
Enable it via:
- GitHub repository Settings -> Pages
- Build and deployment -> Source =
Deploy from a branch - Branch =
main, Folder =/docs - Save, then open:
https://hosuke.github.io/Clawlendar/
Install as MCP Server
From PyPI
pip install clawlendar
From source
git clone https://github.com/Hosuke/Clawlendar.git
cd Clawlendar
pip install -e .
Claude Desktop configuration
Add to your claude_desktop_config.json:
{
"mcpServers": {
"clawlendar": {
"command": "clawlendar"
}
}
}
Config file location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Claude Code
claude mcp add clawlendar -- clawlendar
Prompt Examples
Convert 2026-03-09 (Gregorian) into Minguo, Japanese era, and sexagenary.Given timestamp 1773014400 in Asia/Taipei, return day profile with Bazi/Huangli and moon phase.Show the true month boundary days for Chinese lunar month 2026-01 (non-leap).Build life context from birth to now with location/weather and identity anchors.
Documentation
- Live demo: https://clawlendar-web.vercel.app/
- Tool reference:
docs/tool-reference.md - Intent recipes (CN/EN):
docs/recipes.md - Locale and I18N notes:
docs/i18n.md - Full JSON examples:
docs/examples/ - Vercel gateway design:
docs/vercel-agent-gateway.md
JSON Contract + Higher-level UX
Clawlendar keeps MCP outputs JSON-first for agent interoperability.
- Tool layer: deterministic structured JSON (
convert,timeline,day_profile, etc.). - Assistant layer: optional natural-language UX such as
/今日吉凶ortoday's astrology, mapped to tool calls.
This separation keeps integrations stable while still supporting rich user-facing prompts.
MCP Tools
Once connected, Claude has access to seven tools:
| Tool | Description |
|---|---|
capabilities |
List all supported calendars, payload schemas, and optional provider status |
convert |
Convert a date from one calendar to one or more target calendars |
timeline |
Normalize an instant (timestamp-first) and project into multiple calendar systems |
astro_snapshot |
Return seven governors, four remainders, and major aspects (approximate) |
calendar_month |
Resolve true month boundaries and day list for non-Gregorian month mode |
day_profile |
One-call day details: calendar profile + optional astro + optional Eastern/Western metaphysics |
life_context |
Build continuity-safe world context from birth time + now + space + subject anchors, with birthday/age and optional weather enrichment |
Supported Calendars
gregorianjulianiso_weekunix_epochminguobuddhistjapanese_erasexagenary(approximate)solar_term_24(approximate)
Optional (install extras)
pip install clawlendar[all] # all optional calendars
pip install clawlendar[lunar] # Chinese lunar only
pip install clawlendar[extra-calendars] # Islamic, Hebrew, Persian
pip install clawlendar[metaphysics] # Bazi + Huangli provider (lunar_python)
chinese_lunar— vialunardateislamic/hebrew/persian— viaconvertdatebazi/huangli(day profile metaphysics block) — via optionallunar_python, fallback to internal approximation- Chinese lunar textual labels (e.g.,
初一,十五) are returned inday_profile.metaphysics.eastern.lunar_date.month_name/day_namewhenlunar_pythonis installed.
CLI Usage
pip install -e .
# List calendars
python3 scripts/calendar_bridge.py capabilities
# Convert a date
python3 scripts/calendar_bridge.py convert \
--source gregorian \
--targets julian,iso_week,minguo,buddhist,japanese_era,sexagenary,solar_term_24 \
--date-json '{"year": 2026, "month": 3, "day": 9}' \
--locale zh-TW
# Timeline projection
python3 scripts/calendar_bridge.py timeline \
--input-json '{"timestamp": 1773014400}' \
--timezone 'Asia/Taipei' \
--date-basis local \
--targets minguo,japanese_era,sexagenary,solar_term_24 \
--locale zh-CN
# Astro snapshot (seven governors + four remainders)
python3 scripts/calendar_bridge.py astro \
--input-json '{"timestamp": 1773014400}' \
--timezone 'Asia/Taipei'
# Day profile (calendar details + optional astro + optional metaphysics)
python3 scripts/calendar_bridge.py day-profile \
--input-json '{"timestamp": 1773014400}' \
--timezone 'Asia/Taipei' \
--locale zh-TW
# True month boundary mode (example: Minguo 115/03)
python3 scripts/calendar_bridge.py calendar-month \
--source minguo \
--month-json '{"year":115,"month":3}'
# Life context (birth -> now continuity context)
python3 scripts/calendar_bridge.py life-context \
--birth-input-json '{"iso_datetime":"2026-03-01T09:00:00+08:00"}' \
--now-input-json '{"iso_datetime":"2026-03-09T18:30:00+08:00"}' \
--timezone 'Asia/Taipei' \
--space-json '{"location_name":"南京·秦淮河","latitude":32.0366,"longitude":118.7895,"background":"春季夜游","climate":"humid subtropical","scenery_note":"夜色与河道灯影","environment_tags":["city","river"]}' \
--subject-json '{"entity_id":"lobster-001","role":"18岁女儿","soul":"温柔且主动问候"}' \
--locale zh-CN
Sample Response (Life Context)
Run:
python3 scripts/calendar_bridge.py life-context \
--birth-input-json '{"iso_datetime":"2026-03-01T09:00:00+08:00"}' \
--now-input-json '{"iso_datetime":"2026-03-09T18:30:00+08:00"}' \
--timezone 'Asia/Taipei' \
--space-json '{"location_name":"南京·秦淮河","latitude":32.0366,"longitude":118.7895}' \
--subject-json '{"entity_id":"lobster-001","role":"18岁女儿"}' \
--locale zh-CN
Returned fields (excerpt):
{
"command": "life_context",
"life": {
"life_id": "lobster-001",
"age": {"readable": "8d 9h 30m", "stage": "juvenile"},
"birthday": {"month": 3, "day": 1, "days_until_next_birthday": 357}
},
"environment": {
"place": {"location_name": "南京·秦淮河"},
"weather": {"provider": "open_meteo", "weather_label": "<dynamic>"}
},
"world_context": {
"scene_prompt": "..."
}
}
Sample Response (Huangli / 吉凶)
Run:
python3 scripts/calendar_bridge.py day-profile \
--input-json '{"timestamp": 1773014400}' \
--timezone 'Asia/Taipei' \
--locale zh-CN
Returned fields (excerpt):
{
"command": "day_profile",
"locale": "zh-Hans",
"bridge_date_gregorian": { "year": 2026, "month": 3, "day": 9 },
"metaphysics": {
"eastern": {
"provider": "lunar_python",
"lunar_date": { "month_name": "正", "day_name": "廿一" },
"huangli": {
"yi": ["祭祀", "嫁娶", "纳婿", "安葬"],
"ji": ["栽种", "盖屋", "作灶", "入宅"],
"clash": "(丙子)鼠",
"sha_direction": "北"
}
}
}
}
This confirms day_profile can directly return almanac-style good/bad actions (yi/ji) plus clash/sha details.
HTTP API (FastAPI)
pip install -e ".[api]"
./scripts/run_api.sh
Endpoints: GET /health · GET /capabilities · POST /convert · POST /timeline · POST /astro · POST /day-profile · POST /calendar-month · POST /life-context
# Smoke test
./scripts/curl_examples.sh
# Convert a date
curl -sS -X POST http://127.0.0.1:8000/convert \
-H "Content-Type: application/json" \
-d '{
"source": "gregorian",
"targets": ["julian", "iso_week", "minguo"],
"source_payload": {"year": 2026, "month": 3, "day": 9},
"locale": "zh-CN"
}' | python3 -m json.tool
Docker
docker build -t clawlendar:mvp .
docker run --rm -p 8000:8000 clawlendar:mvp
Architecture
- Parse input as an instant (
timestamp,timestamp_ms,iso_datetime, orlocal_datetime+ timezone). - Normalize to UTC.
- Choose projection date basis (
localorutc). - Convert from canonical Gregorian bridge date to target calendars.
- Return structured JSON plus warnings for optional/approximate providers.
Repository Structure
src/clawlendar/
__init__.py # package version
bridge.py # core calendar conversion engine
server.py # MCP server entry point
scripts/
calendar_bridge.py # CLI wrapper
api_server.py # FastAPI service layer
run_api.sh # API launch helper
curl_examples.sh # HTTP smoke examples
references/
integration-contract.md
time-wheel-model.md
calendar-landscape.md
mvp-release-notes.md
Known Limitations (MVP)
sexagenaryyear boundary is approximate.solar_term_24is fixed-date approximation, not ephemeris-accurate astronomy.- Western chart values are lightweight analytical model (not ephemeris-grade precision).
- When
lunar_pythonis unavailable, Bazi/Huangli uses internal approximation fallback. sexagenaryandsolar_term_24keep stable machine keys and add localized display fields vialocale(zh-CN,zh-TW, etc.).- Some calendars are available only when optional dependencies are installed.
life_contextweather enrichment is best effort (network/provider dependent) and should be treated as contextual reference, not a certified meteorological record.
Privacy Policy
Clawlendar is a local/self-hosted tool by default. It does not include built-in telemetry or remote data collection in core runtime.
- Local MCP mode: data is processed on user machine.
- Optional HTTP deployment: data handling depends on your own server setup and logs.
If you deploy Clawlendar as a remote service, you are responsible for publishing your own privacy policy for that deployment endpoint.
Support
- ClawHub: https://clawhub.ai/Hosuke/clawlendar
- GitHub Issues: https://github.com/Hosuke/Clawlendar/issues
- Repository: https://github.com/Hosuke/Clawlendar
Roadmap
- Astronomical solar-term provider.
- Higher-precision Chinese lunar provider with regression fixtures.
- Publish to PyPI and MCP server directory.
中文说明
Clawlendar 是一个给 AI agents 用的「时间与历法互通层」,同时也是一个 MCP Server(可直接接入 Claude Desktop / Claude Code)。
核心做法是先用时间戳统一「绝对时间」,再投影到不同时区与历法,输出稳定 JSON,方便多工具接入。
在线演示(Vercel):
安装
clawhub install clawlendar
# 或
pip install clawlendar
在 Claude Desktop 的 claude_desktop_config.json 中加入:
{
"mcpServers": {
"clawlendar": {
"command": "clawlendar"
}
}
}
支持的历法
- 公历、儒略历、ISO 周、Unix 纪元
- 民国纪年、佛历、日本年号
- 干支(近似)、二十四节气(近似)
- 干支/节气支持本地化显示(可传
locale=zh-CN或locale=zh-TW,同时保留机器可读 key) day_profile支持输出:八字、老黄历(宜忌/彭祖/冲煞)、西方日课(月相/行星状态/星座)life_context支持输出:生命起始时间、当前时间、已存活时长、生日与下次生日倒计时、地点锚点、个体角色/性格锚点、可选天气增强- 可选:农历(
lunardate)、伊斯兰历、希伯来历、波斯历(convertdate)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clawlendar-0.4.0.tar.gz.
File metadata
- Download URL: clawlendar-0.4.0.tar.gz
- Upload date:
- Size: 37.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2beba813ad37897c4e72bf9bd9a9544fad324591de571a4ba28e211893de2e1
|
|
| MD5 |
5ce5349bfb44fa48ad3bc6e75000c218
|
|
| BLAKE2b-256 |
48aabc9d3277d3ec57bafd03e77bcc5f558afd98939f6d0b2793fe30404106a5
|
File details
Details for the file clawlendar-0.4.0-py3-none-any.whl.
File metadata
- Download URL: clawlendar-0.4.0-py3-none-any.whl
- Upload date:
- Size: 30.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ed33bca16946b7618f11c23a0125eb21264a783de0afe0d017fbada5006c6cc8
|
|
| MD5 |
61ca43ed1a3ab74c952e61e09777b31a
|
|
| BLAKE2b-256 |
f8aa7a5a9c6bbe20b11eb3d7d1c69b8d71405284b316f8208ddac197f86e3310
|