cafe-mcp
cafe-mcp computes Korean Saju / Chinese BaZi (Four Pillars) charts and calendar data as structured JSON for any MCP client — all 6 tools free, no API key.
saju_chart— full Four Pillars natal chart: stems/branches, Day Master, Ten Gods (十神), hidden stems, five-element ratios, Spirit Stars (神殺), Twelve Life Stages — the base other tools build on.ohaeng_balance— Five Elements (五行) distribution with hidden-stem weighting, plus dominant and weakest element.gyeokguk— chart structure (格局): named pattern and grade, body strength (strong/weak), sub-patterns and the reasoning elements.eumyang_johu— Yin-Yang ratio and climate balance (hot/cold, dry/wet) and how it shifts across 10-year and yearly luck cycles.yongshin_candidates— favorable element (用神) candidates from 5 classical methods (격국, 억부, 병약, 조후, 통관); no final engine verdict.manse_calendar— manseryeok calendar for a month or single day: day/month/year pillars, lunar dates, 24 solar terms with exact start times (KST), holidays, 손없는날 and 황도일 flags; needs no birth input.Handles Korean conventions as switchable inputs: 야자시/조자시 Rat-hour rule, 입춘 vs 동지 year boundary, solar/lunar calendars with leap months, unknown birth time, and overseas births via
loccity ID (or IANA timezone for Asia/Seoul).Returns
structuredContentwith anoutputSchema(engine, contract, input_echo, panels, links, disclaimer) so models read numbers rather than prose; every tool is read-only, idempotent, and non-destructive.Also exposes an OWL 2 ontology resource (
cafe://ontology, 1,711 triples, CC BY 4.0) and afull_readingprompt.Connect remotely at
https://mcp.24plus.ai.kr/mcpwith no install, or locally vianpx -y @dangamsoft/cafe-mcp(stdio) /cafe-mcp-httpfor self-hosting.
cafe-mcp: Saju & BaZi (Four Pillars of Destiny) MCP server
Korean astrology (Saju, 사주) and Chinese BaZi (八字) for AI agents. Computed, not guessed. Give Claude, ChatGPT, Cursor or any MCP client a birth date and time. cafe-mcp returns the Four Pillars chart, Day Master, Five Elements balance, chart structure, favorable-element candidates and a manseryeok (만세력) calendar as structured, reproducible JSON from the CAFE engine. Your AI writes the reading in the user's language.
Why not just ask the LLM? A general model improvises the chart: the same birth data gives a different Day Master on different days, and solar-term boundaries, hidden stems and luck cycles are routinely wrong. cafe-mcp calculates them with an engine built since 2019 (3,000+ chart features, interpretation method reviewed by a PhD in Myeongri, favorable-element model validated at 91.1% accuracy). Same input, same chart, every time. All 6 tools are free. No API key.
Quick start
No API key, no local engine, no database. Two ways to connect:
1. Remote (no install): add a custom connector with this URL, e.g. in Claude (Settings > Connectors), ChatGPT (Developer mode) or any client that supports Streamable HTTP:
https://mcp.24plus.ai.kr/mcp2. Local (stdio): Claude Desktop claude_desktop_config.json (Cursor: ~/.cursor/mcp.json, Claude Code: claude mcp add cafe-mcp -- npx -y @dangamsoft/cafe-mcp):
{
"mcpServers": {
"cafe-mcp": {
"command": "npx",
"args": ["-y", "@dangamsoft/cafe-mcp"]
}
}
}Self-host the remote server: npx -p @dangamsoft/cafe-mcp cafe-mcp-http (env PORT, HOST, TRUST_PROXY=1 behind a proxy, RATE_LIMIT_PER_MIN).
Related MCP server: mcp-luopan
What you can ask
"Show my BaZi chart for 1990-01-15 10:30, male."
"What is my Day Master, and which element am I missing?"
"Is my chart hot or cold? Which element balances it?"
"What are my favorable element (Yongshin) candidates, and why?"
"What is today's day pillar?" / "When exactly does Lichun (입춘) start in 2027?"
"Good days to move house next month?" (손없는날 / 황도일 flags)
"내 사주 격국이랑 조후 봐줘" (Korean works too; the tools are language-neutral)
Works in Claude (web, desktop, mobile), Claude Code, ChatGPT, Cursor, Windsurf and any client that speaks MCP.
Tools (free, no key)
Tool | Returns |
| Four Pillars (四柱八字): stems and branches, Day Master (日干), Ten Gods (十神), hidden stems, Spirit Stars (神殺), Twelve Life Stages (十二運星) |
| Five Elements (五行) distribution, dominant / weakest element |
| Chart structure (格局) and Day Master strength (身强 / 身弱) |
| Yin-Yang and climate (陰陽 調候) balance across luck cycles (大運) |
| Favorable element (用神) candidates from 5 classical methods (격국, 억부, 병약, 조후, 통관) |
| Manseryeok (萬歲曆): day / month / year pillars, lunar dates, 24 solar terms (節氣) with exact start time (KST), Korean holidays, 손없는날 / 황도일, for a month ( |
Every tool is read-only and returns structuredContent (with an outputSchema) plus a short text summary,
so the model reads the numbers instead of parsing prose.
Input (chart tools)
field | example | notes |
|
| local time; legacy |
|
| legacy |
|
|
|
|
| 야자시 / 조자시 (late vs early Rat hour) |
|
| 입춘 / 동지 (year starts at Lichun or the winter solstice) |
|
| hour pillar marked as estimated |
|
| births outside Korea (24Plus world-city ID); other IANA time zones are rejected rather than guessed |
Errors return isError: true, a readable first text block, and a JSON second block {"error": {"code", "field?", "message"}} with codes invalid_input, rate_limited, timeout, backend_unavailable.
Resources & prompts: cafe://ontology (OWL 2 Turtle, CC BY 4.0) and the full_reading prompt.
Calculation tools stay free. The engine's final favorable-element decision (ML cross-validated) and full reports are part of the 24Plus service; a keyed
yongshin_recommendtool may be added in a later minor version without changing these tools.
Custom backend: set CAFE_MCP_API_URL (the server POSTs to
${CAFE_MCP_API_URL}/try/panels; default https://24plus.ai.kr/api).
Why cafe-mcp
LLM-only readings | Calculator-only servers | cafe-mcp | |
Chart math (pillars, hidden stems, solar terms) | improvised | computed | computed |
Ten Gods, Spirit Stars, Twelve Life Stages | often wrong | sometimes | computed |
Chart structure (格局) and favorable-element candidates | guessed | usually absent | classical rules, ML-validated engine |
Korean Saju conventions (야자시, 입춘 / 동지, 손없는날) | no | rarely | yes, switchable |
Output | prose | text |
|
Setup | none | npm install | remote URL, no install (or npx) |
Price | n/a | varies | free, no key |
Saju or BaZi?
Korean Saju (사주명리학) and Chinese BaZi (八字命理) share the same chart and the same classical roots (子平眞詮, 滴天髓, 窮通寶鑑 and others). The differences are conventions: Korea commonly applies the late Rat hour (야자시) rule, starts the year at Lichun (입춘), and uses its own manseryeok and holiday calendar. cafe-mcp follows the Korean school by default and exposes those switches, so it serves both audiences. Names use Korean romanization with Hanja kept: Yongshin = 用神 (favorable element), Gyeokguk = 格局 (chart structure), Sinsal = 神殺 (Spirit Stars), Ilgan = 日干 (Day Master). See Notes on traditions.
What the MCP does not do
It does not write the reading. It returns the chart and the classical analysis; the client model interprets it in the user's language. It also does not return the engine's single final Yongshin decision (see the note above).
Ontology
1,711 RDF triples, SPARQL-queryable, W3C OWL 2 conformant
Models:
60갑자 (Sexagenary cycle)
75 sinsal (special-star annotations)
18 patterns: 정격 10 + 특수격 8
5 yongshin types: 격국, 억부, 병약, 조후, 통관
12 life stages (12운성)
Grounded in 6 classical treatises:
적천수 (Diqianshui)
자평진전 (Zipingzhenquan)
난강망 (Lanjiangwang)
궁통보감 (Qiongtongbaojian)
연해자평 (Yuanhaiziping)
삼명통회 (Sanmingtonghui)
See ontology/ for module structure, SPARQL examples, and
the integrated turtle file (cafe-ontology.ttl). The ontology is the public layer of the CAFE engine
(Cross-weighted Analysis of the Five Elements), released under CC BY 4.0 for academic use,
system integration and downstream development.
CAFE engine performance
The CAFE engine, the inference system this ontology models, operates inside the 24Plus platform. Validated performance on 5-class yongshin classification (목/화/토/금/수, 5-fold cross-validated):
Metric | Result |
Accuracy | 91.10% |
F1-Score (Macro) | 91.08% |
Precision (Macro) | 91.16% |
Recall (Macro) | 91.10% |
ROC AUC (Macro) | 97.76% |
Random baseline = 20% (5 classes). 4.56x better than random. ML ensemble with weighted voting and probability calibration.
The engine itself remains proprietary; the ontology models the domain structure it operates on.
Note on East Asian Myeongli traditions
This MCP focuses on the Korean Myeongli (사주명리학) tradition, which shares its classical roots (子平眞詮 Zipingzhenquan, 滴天髓 Diqianshui, 窮通寶鑑 Qiongtongbaojian, 淵海子平 Yuanhaiziping, 三命通會 Sanmingtonghui, 欄江網 Lanjiangwang) with the Chinese BaZi (八字) tradition.
Romanization uses Korean Revised Romanization (e.g., Yongshin, Sinsal). Hanja (정자) is preserved throughout the ontology.
Documentation
Ontology specification: formal OWL ontology with SPARQL examples
Built by
Dangamsoft (단감소프트), a Korean AI company specializing in classical East Asian knowledge systems. The same engine powers the 24Plus Saju service.
Privacy
The server receives only the tool arguments (birth date and time, sex, calendar options, optional city ID). No accounts, no cookies, no conversation text. Birth data is not stored beyond a same-day result cache. Full policy: PRIVACY.md.
License
Code (live since v0.6.0): Apache 2.0
Public OWL ontology (
ontology/): CC BY 4.0
The CAFE inference engine, scoring algorithms, ML model weights, and interpretation templates remain proprietary.
한국어 요약
cafe-mcp는 사주명리 계산을 AI 에이전트에 붙이는 MCP 서버입니다. Claude, ChatGPT, Cursor 등 MCP를 지원하는
클라이언트에 원격 URL(https://mcp.24plus.ai.kr/mcp) 하나만 등록하면 설치 없이 바로 쓸 수 있고,
npx -y @dangamsoft/cafe-mcp로 로컬(stdio) 실행도 됩니다.
도구 6종 모두 무료, API 키 없음: 사주 원국(
saju_chart), 오행 분포(ohaeng_balance), 격국(gyeokguk), 음양·조후(eumyang_johu), 용신 후보(yongshin_candidates), 만세력(manse_calendar: 일진·월주·년주, 음력, 절기 입절 시각, 공휴일, 손없는날·황도일)야자시/조자시, 입춘/동지 기준, 음력·윤달, 시간 미상, 해외 출생지를 입력으로 지정할 수 있습니다.
결과는
structuredContent+outputSchema로 돌려주므로 모델이 문장을 파싱하지 않고 숫자를 그대로 읽습니다.온톨로지(OWL 2, 1,711 트리플)는 CC BY 4.0, 코드는 Apache 2.0입니다. 엔진의 최종 용신 판정과 전체 리포트는 24Plus 서비스(https://24plus.ai.kr)에서 제공합니다.
Available Tools
6 toolseumyang_johuYin-Yang and climate balanceARead-onlyIdempotentInspect
Yin-Yang (陰陽) ratio and climate (調候: hot/cold, dry/wet) balance, and how they shift across 10-year and yearly luck cycles. Use for 'is my chart hot or cold', '조후 분석'.
| Name | Required | Description | Default |
|---|---|---|---|
| loc | No | 24Plus world-city ID for births outside Korea. | |
| sex | No | Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given. | |
| name | No | Optional display name. | |
| birth | Yes | Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown. | |
| gender | No | Legacy form of sex: 0 female, 1 male. | |
| option1 | No | Legacy form of rat_hour_rule (1 = early). | |
| option2 | No | Legacy form of year_boundary (-1 = winter_solstice). | |
| calendar | No | Calendar of the birth date. Default solar. | |
| is_lunar | No | Legacy form of calendar=lunar. | |
| timezone | No | IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'. | |
| is_leap_year | No | Legacy form of lunar_leap_month. | |
| time_unknown | No | Birth time unknown; the hour pillar is marked as estimated. | |
| rat_hour_rule | No | Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시. | |
| year_boundary | No | Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지. | |
| lunar_leap_month | No | Lunar leap month (윤달). Only with calendar=lunar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| tool | Yes | |
| basis | No | Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start. |
| links | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes | |
| input_echo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the tool analyzes shifts across 10-year and yearly luck cycles, which is useful behavioral context but not extensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler: it states the core subject, then adds an explicit usage signal. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and safety annotations, the description is sufficient for an agent to select the tool. It lacks only an explicit relationship to sibling tools or a note about output shape, but those gaps are minor given the structured context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 15 parameters are documented in the schema. The description adds no parameter-level detail, and it does not need to because the schema already carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific subject matter — Yin-Yang ratio and climate (調候) balance — and how it shifts across luck cycles. It also gives concrete query examples ('is my chart hot or cold', '조후 분석'). However, it does not explicitly differentiate this tool from the sibling ohaeng_balance, so it stops short of full sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear use guidance with quoted user intents ('is my chart hot or cold', '조후 분석'). It does not mention when not to use the tool or name alternatives, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gyeokgukChart structure (格局)ARead-onlyIdempotentInspect
Gyeokguk (格局) chart structure by classical rules: named pattern and grade, body strength (strong/weak), sub-patterns, and the elements behind the judgment. Use for 'what is my chart pattern', '내 격국'.
| Name | Required | Description | Default |
|---|---|---|---|
| loc | No | 24Plus world-city ID for births outside Korea. | |
| sex | No | Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given. | |
| name | No | Optional display name. | |
| birth | Yes | Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown. | |
| gender | No | Legacy form of sex: 0 female, 1 male. | |
| option1 | No | Legacy form of rat_hour_rule (1 = early). | |
| option2 | No | Legacy form of year_boundary (-1 = winter_solstice). | |
| calendar | No | Calendar of the birth date. Default solar. | |
| is_lunar | No | Legacy form of calendar=lunar. | |
| timezone | No | IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'. | |
| is_leap_year | No | Legacy form of lunar_leap_month. | |
| time_unknown | No | Birth time unknown; the hour pillar is marked as estimated. | |
| rat_hour_rule | No | Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시. | |
| year_boundary | No | Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지. | |
| lunar_leap_month | No | Lunar leap month (윤달). Only with calendar=lunar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| tool | Yes | |
| basis | No | Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start. |
| links | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes | |
| input_echo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the important behavioral profile: readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the 'classical rules' framing and output contents but no additional behavioral caveats such as handling unknown birth times or limitations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loads the tool's output, and then gives targeted query examples. There is no filler or redundant restating of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, strong annotations, and presence of an output schema, the description covers the core user intent well. The only notable gap is not naming or disambiguating against sibling chart tools, but the description is otherwise sufficient for a read-only lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage across all 15 parameters, including legacy alternatives like 'gender' and 'option1'. The tool description does not add parameter-level meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (gyeokguk chart structure) and lists concrete outputs: named pattern, grade, body strength, sub-patterns, and the elements behind the judgment. It is clear and actionable, but it does not explicitly differentiate this tool from siblings like saju_chart or ohaeng_balance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use-case examples in both English and Korean ('what is my chart pattern', '내 격국'), which helps an agent select the tool. However, it does not mention when not to use it or name alternative tools for comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manse_calendarManse-ryeok calendar (day pillars)ARead-onlyIdempotentInspect
Korean manse-ryeok (萬歲曆) calendar for a month or a single day: each day's pillar (日辰), month and year pillars, lunar date, solar term (節氣) with its exact start time (Korea time) when one falls on that day, 손없는날 and 황도일 flags. No birth data needed. Use for 'what is today's day pillar', '이번 달 손없는날', '2027년 2월 일진'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | A single day 'YYYY-MM-DD'. When given, only that day is returned and 'month' is ignored. | |
| month | No | Month to list, 'YYYY-MM' (1900-01 to 2100-12). Default: the current month in Korea (Asia/Seoul). |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| tool | Yes | |
| links | Yes | |
| month | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotent behavior. The description adds meaningful context: results are in Korea time, solar-term start times appear only on days when a term falls, and no birth data is needed. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the first lists the calendar contents, the second clarifies no birth data is needed, and the third gives usage examples. No sentence is wasted, and the main purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description is sufficient for an agent to decide when to call and what inputs to provide. It explains the scope (month/day), timezone, and the nature of the data, leaving only input format details to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's mention of 'month or a single day' and its example queries map to the date and month parameters, but it adds no semantic detail beyond what the schema already states (e.g., date overrides month).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (manse-ryeok calendar) and the exact data it returns: day/month/year pillars, lunar date, solar terms with Korea-time start times, and two flag types. It also gives concrete example queries that distinguish it from sibling tools like saju_chart, which require birth data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit example use cases ('what is today's day pillar', '이번 달 손없는날', '2027년 2월 일진'), making it clear when an agent should call this tool. It does not name sibling tools or state when not to use it, but the examples are strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ohaeng_balanceFive Elements balanceARead-onlyIdempotentInspect
Five Elements (五行: Wood, Fire, Earth, Metal, Water) distribution with hidden-stem weighting; dominant and weakest element. Use for 'which element am I missing', '오행 분석'.
| Name | Required | Description | Default |
|---|---|---|---|
| loc | No | 24Plus world-city ID for births outside Korea. | |
| sex | No | Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given. | |
| name | No | Optional display name. | |
| birth | Yes | Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown. | |
| gender | No | Legacy form of sex: 0 female, 1 male. | |
| option1 | No | Legacy form of rat_hour_rule (1 = early). | |
| option2 | No | Legacy form of year_boundary (-1 = winter_solstice). | |
| calendar | No | Calendar of the birth date. Default solar. | |
| is_lunar | No | Legacy form of calendar=lunar. | |
| timezone | No | IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'. | |
| is_leap_year | No | Legacy form of lunar_leap_month. | |
| time_unknown | No | Birth time unknown; the hour pillar is marked as estimated. | |
| rat_hour_rule | No | Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시. | |
| year_boundary | No | Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지. | |
| lunar_leap_month | No | Lunar leap month (윤달). Only with calendar=lunar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| tool | Yes | |
| basis | No | Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start. |
| links | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes | |
| input_echo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds computational context beyond annotations: hidden-stem weighting and which outputs (dominant, weakest) are reported. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the core output and then give concrete example queries. No filler or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 15-parameter tool, the required input is clear from the schema and the description states the result semantics (weighted distribution, dominant/weakest). The presence of an output schema means return values don't need to be described; only marginal context such as typical use cases is absent, which is already covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 15 parameters. The description adds no parameter-level details, which is acceptable at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what the tool computes – Five Elements distribution with hidden-stem weighting, plus dominant and weakest element – so an agent can tell it handles element-balance queries. It doesn't explicitly compare itself to sibling tools, but the named terms (五行, dominant/weakest) are distinctive enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger: 'which element am I missing' and '오행 분석'. It doesn't state exclusions or alternatives, but for a read-only analysis tool this is clear directional guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saju_chartSaju / BaZi natal chartARead-onlyIdempotentInspect
Four Pillars (四柱八字) natal chart: year/month/day/hour stems and branches, Ten Gods (十神), hidden stems, five-element ratios, Spirit Stars (神殺) and Twelve Life Stages (十二運星) per pillar. The foundation other tools build on. Use for 'show my saju / bazi chart', '내 사주 봐줘'.
| Name | Required | Description | Default |
|---|---|---|---|
| loc | No | 24Plus world-city ID for births outside Korea. | |
| sex | No | Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given. | |
| name | No | Optional display name. | |
| birth | Yes | Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown. | |
| gender | No | Legacy form of sex: 0 female, 1 male. | |
| option1 | No | Legacy form of rat_hour_rule (1 = early). | |
| option2 | No | Legacy form of year_boundary (-1 = winter_solstice). | |
| calendar | No | Calendar of the birth date. Default solar. | |
| is_lunar | No | Legacy form of calendar=lunar. | |
| timezone | No | IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'. | |
| is_leap_year | No | Legacy form of lunar_leap_month. | |
| time_unknown | No | Birth time unknown; the hour pillar is marked as estimated. | |
| rat_hour_rule | No | Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시. | |
| year_boundary | No | Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지. | |
| lunar_leap_month | No | Lunar leap month (윤달). Only with calendar=lunar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| tool | Yes | |
| basis | No | Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start. |
| links | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes | |
| input_echo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds useful context about chart content and foundational role, but it does not disclose operational behaviors such as how unknown birth time is handled, timezone assumptions, or how lunar/legacy parameters affect computation. With annotations present, this is an acceptable but not rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The first sentence front-loads the chart contents, the second establishes its role relative to other tools, and the third gives concrete usage examples. Every sentence earns its place and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (15 parameters) but the presence of a rich input schema and an output schema, the description does not need to restate parameter details or return values. It provides the key contextual signals an agent needs for selection: what the chart contains, that it is foundational, and example user phrasings. A small gap is the lack of any hint about when not to use this tool or which sibling addresses more specialized chart-reading tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds no parameter-level meaning beyond what the schema provides. Per the baseline rule, a 3 is appropriate when the schema carries the full semantic burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly explains that the tool produces a Four Pillars natal chart and enumerates the chart components (stems/branches, Ten Gods, hidden stems, five-element ratios, Spirit Stars, Twelve Life Stages). It does not use a direct verb like 'calculate' or 'generate', and it does not explicitly contrast itself with any sibling tool, though labeling it 'the foundation other tools build on' provides some positional clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit user-intent examples ('show my saju / bazi chart', '내 사주 봐줘'), which tells an agent when to invoke this tool. It also states that it is the foundation for other tools, implying it is the right first step for chart-related requests. It does not enumerate exclusions or alternative tool conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
yongshin_candidatesFavorable element candidatesARead-onlyIdempotentInspect
Classical Yongshin (用神, favorable element) candidates from five methods (Eokbu, Byeongyak, Tonggwan, Johu, Gyeokguk) with each method's pick. No final engine decision. Use for 'my favorable element candidates', '용신 후보'.
| Name | Required | Description | Default |
|---|---|---|---|
| loc | No | 24Plus world-city ID for births outside Korea. | |
| sex | No | Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given. | |
| name | No | Optional display name. | |
| birth | Yes | Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown. | |
| gender | No | Legacy form of sex: 0 female, 1 male. | |
| option1 | No | Legacy form of rat_hour_rule (1 = early). | |
| option2 | No | Legacy form of year_boundary (-1 = winter_solstice). | |
| calendar | No | Calendar of the birth date. Default solar. | |
| is_lunar | No | Legacy form of calendar=lunar. | |
| timezone | No | IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'. | |
| is_leap_year | No | Legacy form of lunar_leap_month. | |
| time_unknown | No | Birth time unknown; the hour pillar is marked as estimated. | |
| rat_hour_rule | No | Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시. | |
| year_boundary | No | Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지. | |
| lunar_leap_month | No | Lunar leap month (윤달). Only with calendar=lunar. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| tool | Yes | |
| basis | No | Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start. |
| links | Yes | |
| engine | Yes | |
| contract | Yes | |
| disclaimer | Yes | |
| input_echo | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior. The description adds meaningful beyond-annotation context: it returns only candidates, not a final engine decision, and enumerates the five methods included. That is useful behavioral disclosure not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences. It front-loads the core resource and scope, adds the critical 'no final engine decision' caveat, and includes practical query examples without any filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, annotations, and output schema, the description is nearly complete: it states the tool's purpose, scope, methods, non-decision behavior, and example user intents. It does not explicitly situate itself against each sibling tool, but the provided usage triggers reduce ambiguity enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all 15 parameters and their constraints. The description adds no parameter-level meaning beyond the schema, which matches the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource: classical Yongshin (favorable element) candidates from five named methods, with each method's pick. It also explicitly states what the tool does not do ('No final engine decision'), which distinguishes it from any final-answer sibling and makes its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete user-intent triggers ('Use for 'my favorable element candidates', '용신 후보''), which tells an agent when to invoke this tool. It does not explicitly name sibling tools to avoid or state when not to use it, so it falls just short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.1- Changed
eumyang_johu30 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / birth / descriptionPrevious value: -"Birth date & time, 12 digits YYYYMMDDHHMM (e.g. 199001151030). Use 1230 for unknown time."New value: +"Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown." - added
Input schema / properties / calendarAdded value: +{ + "description": "Calendar of the birth date. Default solar.", + "enum": [ + "solar", + "lunar" + ], + "type": "string" +} - added
Input schema / properties / gender / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / gender / descriptionPrevious value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male." - removed
Input schema / properties / gender / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / gender / typeRemoved value: -"integer" - changed
Input schema / properties / is_leap_year / descriptionPrevious value: -"Optional. true if the lunar birth month is a leap month (윤달). Only meaningful with is_lunar=true."New value: +"Legacy form of lunar_leap_month." - changed
Input schema / properties / is_lunar / descriptionPrevious value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar." - changed
Input schema / properties / loc / descriptionPrevious value: -"Optional birthplace region ID for overseas births (24Plus world-city ID). Omit for Korea."New value: +"24Plus world-city ID for births outside Korea." - added
Input schema / properties / loc / maximumAdded value: +9007199254740991 - added
Input schema / properties / loc / minimumAdded value: +-9007199254740991 - added
Input schema / properties / lunar_leap_monthAdded value: +{ + "description": "Lunar leap month (윤달). Only with calendar=lunar.", + "type": "boolean" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name." - added
Input schema / properties / name / maxLengthAdded value: +40 - added
Input schema / properties / option1 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / option1 / descriptionPrevious value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)." - removed
Input schema / properties / option1 / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / option1 / typeRemoved value: -"integer" - added
Input schema / properties / option2 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": -1, + "type": "number" + } +] - changed
Input schema / properties / option2 / descriptionPrevious value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)." - removed
Input schema / properties / option2 / enumRemoved value: -[ - 0, - -1 -] - removed
Input schema / properties / option2 / typeRemoved value: -"integer" - added
Input schema / properties / rat_hour_ruleAdded value: +{ + "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.", + "enum": [ + "late", + "early" + ], + "type": "string" +} - added
Input schema / properties / sexAdded value: +{ + "description": "Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.", + "enum": [ + "female", + "male" + ], + "type": "string" +} - changed
Input schema / properties / time_unknown / descriptionPrevious value: -"Optional. true if the birth time is unknown — the chart header marks the hour pillar as estimated. Pair with HHMM=1230."New value: +"Birth time unknown; the hour pillar is marked as estimated." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.", + "type": "string" +} - added
Input schema / properties / year_boundaryAdded value: +{ + "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.", + "enum": [ + "lichun", + "winter_solstice" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "birth", - "gender" -]New value: +[ + "birth" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "basis": { + "description": "Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.", + "type": "string" + }, + "contract": { + "type": "string" + }, + "data": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "panel_count": { + "type": "number" + }, + "panels": {} + }, + "required": [ + "panels" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "engine": { + "const": "cafe", + "type": "string" + }, + "input_echo": { + "additionalProperties": false, + "properties": { + "birth": { + "type": "string" + }, + "calendar": { + "type": "string" + }, + "sex": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "birth", + "calendar", + "sex", + "timezone" + ], + "type": "object" + }, + "links": { + "additionalProperties": false, + "properties": { + "web": { + "type": "string" + } + }, + "required": [ + "web" + ], + "type": "object" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "engine", + "contract", + "tool", + "input_echo", + "data", + "links", + "disclaimer" + ], + "type": "object" +}
- Changed
gyeokguk30 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / birth / descriptionPrevious value: -"Birth date & time, 12 digits YYYYMMDDHHMM (e.g. 199001151030). Use 1230 for unknown time."New value: +"Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown." - added
Input schema / properties / calendarAdded value: +{ + "description": "Calendar of the birth date. Default solar.", + "enum": [ + "solar", + "lunar" + ], + "type": "string" +} - added
Input schema / properties / gender / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / gender / descriptionPrevious value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male." - removed
Input schema / properties / gender / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / gender / typeRemoved value: -"integer" - changed
Input schema / properties / is_leap_year / descriptionPrevious value: -"Optional. true if the lunar birth month is a leap month (윤달). Only meaningful with is_lunar=true."New value: +"Legacy form of lunar_leap_month." - changed
Input schema / properties / is_lunar / descriptionPrevious value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar." - changed
Input schema / properties / loc / descriptionPrevious value: -"Optional birthplace region ID for overseas births (24Plus world-city ID). Omit for Korea."New value: +"24Plus world-city ID for births outside Korea." - added
Input schema / properties / loc / maximumAdded value: +9007199254740991 - added
Input schema / properties / loc / minimumAdded value: +-9007199254740991 - added
Input schema / properties / lunar_leap_monthAdded value: +{ + "description": "Lunar leap month (윤달). Only with calendar=lunar.", + "type": "boolean" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name." - added
Input schema / properties / name / maxLengthAdded value: +40 - added
Input schema / properties / option1 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / option1 / descriptionPrevious value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)." - removed
Input schema / properties / option1 / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / option1 / typeRemoved value: -"integer" - added
Input schema / properties / option2 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": -1, + "type": "number" + } +] - changed
Input schema / properties / option2 / descriptionPrevious value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)." - removed
Input schema / properties / option2 / enumRemoved value: -[ - 0, - -1 -] - removed
Input schema / properties / option2 / typeRemoved value: -"integer" - added
Input schema / properties / rat_hour_ruleAdded value: +{ + "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.", + "enum": [ + "late", + "early" + ], + "type": "string" +} - added
Input schema / properties / sexAdded value: +{ + "description": "Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.", + "enum": [ + "female", + "male" + ], + "type": "string" +} - changed
Input schema / properties / time_unknown / descriptionPrevious value: -"Optional. true if the birth time is unknown — the chart header marks the hour pillar as estimated. Pair with HHMM=1230."New value: +"Birth time unknown; the hour pillar is marked as estimated." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.", + "type": "string" +} - added
Input schema / properties / year_boundaryAdded value: +{ + "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.", + "enum": [ + "lichun", + "winter_solstice" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "birth", - "gender" -]New value: +[ + "birth" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "basis": { + "description": "Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.", + "type": "string" + }, + "contract": { + "type": "string" + }, + "data": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "panel_count": { + "type": "number" + }, + "panels": {} + }, + "required": [ + "panels" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "engine": { + "const": "cafe", + "type": "string" + }, + "input_echo": { + "additionalProperties": false, + "properties": { + "birth": { + "type": "string" + }, + "calendar": { + "type": "string" + }, + "sex": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "birth", + "calendar", + "sex", + "timezone" + ], + "type": "object" + }, + "links": { + "additionalProperties": false, + "properties": { + "web": { + "type": "string" + } + }, + "required": [ + "web" + ], + "type": "object" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "engine", + "contract", + "tool", + "input_echo", + "data", + "links", + "disclaimer" + ], + "type": "object" +}
- Added
manse_calendar - Changed
ohaeng_balance30 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / birth / descriptionPrevious value: -"Birth date & time, 12 digits YYYYMMDDHHMM (e.g. 199001151030). Use 1230 for unknown time."New value: +"Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown." - added
Input schema / properties / calendarAdded value: +{ + "description": "Calendar of the birth date. Default solar.", + "enum": [ + "solar", + "lunar" + ], + "type": "string" +} - added
Input schema / properties / gender / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / gender / descriptionPrevious value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male." - removed
Input schema / properties / gender / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / gender / typeRemoved value: -"integer" - changed
Input schema / properties / is_leap_year / descriptionPrevious value: -"Optional. true if the lunar birth month is a leap month (윤달). Only meaningful with is_lunar=true."New value: +"Legacy form of lunar_leap_month." - changed
Input schema / properties / is_lunar / descriptionPrevious value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar." - changed
Input schema / properties / loc / descriptionPrevious value: -"Optional birthplace region ID for overseas births (24Plus world-city ID). Omit for Korea."New value: +"24Plus world-city ID for births outside Korea." - added
Input schema / properties / loc / maximumAdded value: +9007199254740991 - added
Input schema / properties / loc / minimumAdded value: +-9007199254740991 - added
Input schema / properties / lunar_leap_monthAdded value: +{ + "description": "Lunar leap month (윤달). Only with calendar=lunar.", + "type": "boolean" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name." - added
Input schema / properties / name / maxLengthAdded value: +40 - added
Input schema / properties / option1 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / option1 / descriptionPrevious value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)." - removed
Input schema / properties / option1 / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / option1 / typeRemoved value: -"integer" - added
Input schema / properties / option2 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": -1, + "type": "number" + } +] - changed
Input schema / properties / option2 / descriptionPrevious value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)." - removed
Input schema / properties / option2 / enumRemoved value: -[ - 0, - -1 -] - removed
Input schema / properties / option2 / typeRemoved value: -"integer" - added
Input schema / properties / rat_hour_ruleAdded value: +{ + "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.", + "enum": [ + "late", + "early" + ], + "type": "string" +} - added
Input schema / properties / sexAdded value: +{ + "description": "Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.", + "enum": [ + "female", + "male" + ], + "type": "string" +} - changed
Input schema / properties / time_unknown / descriptionPrevious value: -"Optional. true if the birth time is unknown — the chart header marks the hour pillar as estimated. Pair with HHMM=1230."New value: +"Birth time unknown; the hour pillar is marked as estimated." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.", + "type": "string" +} - added
Input schema / properties / year_boundaryAdded value: +{ + "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.", + "enum": [ + "lichun", + "winter_solstice" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "birth", - "gender" -]New value: +[ + "birth" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "basis": { + "description": "Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.", + "type": "string" + }, + "contract": { + "type": "string" + }, + "data": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "panel_count": { + "type": "number" + }, + "panels": {} + }, + "required": [ + "panels" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "engine": { + "const": "cafe", + "type": "string" + }, + "input_echo": { + "additionalProperties": false, + "properties": { + "birth": { + "type": "string" + }, + "calendar": { + "type": "string" + }, + "sex": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "birth", + "calendar", + "sex", + "timezone" + ], + "type": "object" + }, + "links": { + "additionalProperties": false, + "properties": { + "web": { + "type": "string" + } + }, + "required": [ + "web" + ], + "type": "object" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "engine", + "contract", + "tool", + "input_echo", + "data", + "links", + "disclaimer" + ], + "type": "object" +}
- Changed
saju_chart30 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / birth / descriptionPrevious value: -"Birth date & time, 12 digits YYYYMMDDHHMM (e.g. 199001151030). Use 1230 for unknown time."New value: +"Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown." - added
Input schema / properties / calendarAdded value: +{ + "description": "Calendar of the birth date. Default solar.", + "enum": [ + "solar", + "lunar" + ], + "type": "string" +} - added
Input schema / properties / gender / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / gender / descriptionPrevious value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male." - removed
Input schema / properties / gender / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / gender / typeRemoved value: -"integer" - changed
Input schema / properties / is_leap_year / descriptionPrevious value: -"Optional. true if the lunar birth month is a leap month (윤달). Only meaningful with is_lunar=true."New value: +"Legacy form of lunar_leap_month." - changed
Input schema / properties / is_lunar / descriptionPrevious value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar." - changed
Input schema / properties / loc / descriptionPrevious value: -"Optional birthplace region ID for overseas births (24Plus world-city ID). Omit for Korea."New value: +"24Plus world-city ID for births outside Korea." - added
Input schema / properties / loc / maximumAdded value: +9007199254740991 - added
Input schema / properties / loc / minimumAdded value: +-9007199254740991 - added
Input schema / properties / lunar_leap_monthAdded value: +{ + "description": "Lunar leap month (윤달). Only with calendar=lunar.", + "type": "boolean" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name." - added
Input schema / properties / name / maxLengthAdded value: +40 - added
Input schema / properties / option1 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / option1 / descriptionPrevious value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)." - removed
Input schema / properties / option1 / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / option1 / typeRemoved value: -"integer" - added
Input schema / properties / option2 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": -1, + "type": "number" + } +] - changed
Input schema / properties / option2 / descriptionPrevious value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)." - removed
Input schema / properties / option2 / enumRemoved value: -[ - 0, - -1 -] - removed
Input schema / properties / option2 / typeRemoved value: -"integer" - added
Input schema / properties / rat_hour_ruleAdded value: +{ + "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.", + "enum": [ + "late", + "early" + ], + "type": "string" +} - added
Input schema / properties / sexAdded value: +{ + "description": "Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.", + "enum": [ + "female", + "male" + ], + "type": "string" +} - changed
Input schema / properties / time_unknown / descriptionPrevious value: -"Optional. true if the birth time is unknown — the chart header marks the hour pillar as estimated. Pair with HHMM=1230."New value: +"Birth time unknown; the hour pillar is marked as estimated." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.", + "type": "string" +} - added
Input schema / properties / year_boundaryAdded value: +{ + "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.", + "enum": [ + "lichun", + "winter_solstice" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "birth", - "gender" -]New value: +[ + "birth" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "basis": { + "description": "Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.", + "type": "string" + }, + "contract": { + "type": "string" + }, + "data": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "panel_count": { + "type": "number" + }, + "panels": {} + }, + "required": [ + "panels" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "engine": { + "const": "cafe", + "type": "string" + }, + "input_echo": { + "additionalProperties": false, + "properties": { + "birth": { + "type": "string" + }, + "calendar": { + "type": "string" + }, + "sex": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "birth", + "calendar", + "sex", + "timezone" + ], + "type": "object" + }, + "links": { + "additionalProperties": false, + "properties": { + "web": { + "type": "string" + } + }, + "required": [ + "web" + ], + "type": "object" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "engine", + "contract", + "tool", + "input_echo", + "data", + "links", + "disclaimer" + ], + "type": "object" +}
- Changed
yongshin_candidates30 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / birth / descriptionPrevious value: -"Birth date & time, 12 digits YYYYMMDDHHMM (e.g. 199001151030). Use 1230 for unknown time."New value: +"Local birth date and time. ISO 8601 'YYYY-MM-DDTHH:mm' (e.g. 1990-01-15T10:30) or legacy 12 digits 'YYYYMMDDHHmm'. Use 12:30 when the time is unknown and set time_unknown." - added
Input schema / properties / calendarAdded value: +{ + "description": "Calendar of the birth date. Default solar.", + "enum": [ + "solar", + "lunar" + ], + "type": "string" +} - added
Input schema / properties / gender / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / gender / descriptionPrevious value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male." - removed
Input schema / properties / gender / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / gender / typeRemoved value: -"integer" - changed
Input schema / properties / is_leap_year / descriptionPrevious value: -"Optional. true if the lunar birth month is a leap month (윤달). Only meaningful with is_lunar=true."New value: +"Legacy form of lunar_leap_month." - changed
Input schema / properties / is_lunar / descriptionPrevious value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar." - changed
Input schema / properties / loc / descriptionPrevious value: -"Optional birthplace region ID for overseas births (24Plus world-city ID). Omit for Korea."New value: +"24Plus world-city ID for births outside Korea." - added
Input schema / properties / loc / maximumAdded value: +9007199254740991 - added
Input schema / properties / loc / minimumAdded value: +-9007199254740991 - added
Input schema / properties / lunar_leap_monthAdded value: +{ + "description": "Lunar leap month (윤달). Only with calendar=lunar.", + "type": "boolean" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name." - added
Input schema / properties / name / maxLengthAdded value: +40 - added
Input schema / properties / option1 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + } +] - changed
Input schema / properties / option1 / descriptionPrevious value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)." - removed
Input schema / properties / option1 / enumRemoved value: -[ - 0, - 1 -] - removed
Input schema / properties / option1 / typeRemoved value: -"integer" - added
Input schema / properties / option2 / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": -1, + "type": "number" + } +] - changed
Input schema / properties / option2 / descriptionPrevious value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)." - removed
Input schema / properties / option2 / enumRemoved value: -[ - 0, - -1 -] - removed
Input schema / properties / option2 / typeRemoved value: -"integer" - added
Input schema / properties / rat_hour_ruleAdded value: +{ + "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.", + "enum": [ + "late", + "early" + ], + "type": "string" +} - added
Input schema / properties / sexAdded value: +{ + "description": "Sex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.", + "enum": [ + "female", + "male" + ], + "type": "string" +} - changed
Input schema / properties / time_unknown / descriptionPrevious value: -"Optional. true if the birth time is unknown — the chart header marks the hour pillar as estimated. Pair with HHMM=1230."New value: +"Birth time unknown; the hour pillar is marked as estimated." - added
Input schema / properties / timezoneAdded value: +{ + "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.", + "type": "string" +} - added
Input schema / properties / year_boundaryAdded value: +{ + "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.", + "enum": [ + "lichun", + "winter_solstice" + ], + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "birth", - "gender" -]New value: +[ + "birth" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "basis": { + "description": "Chart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.", + "type": "string" + }, + "contract": { + "type": "string" + }, + "data": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "panel_count": { + "type": "number" + }, + "panels": {} + }, + "required": [ + "panels" + ], + "type": "object" + }, + "disclaimer": { + "type": "string" + }, + "engine": { + "const": "cafe", + "type": "string" + }, + "input_echo": { + "additionalProperties": false, + "properties": { + "birth": { + "type": "string" + }, + "calendar": { + "type": "string" + }, + "sex": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "birth", + "calendar", + "sex", + "timezone" + ], + "type": "object" + }, + "links": { + "additionalProperties": false, + "properties": { + "web": { + "type": "string" + } + }, + "required": [ + "web" + ], + "type": "object" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "engine", + "contract", + "tool", + "input_echo", + "data", + "links", + "disclaimer" + ], + "type": "object" +}
5 tool updates
v0.1.0- First observed
eumyang_johu - First observed
gyeokguk - First observed
ohaeng_balance - First observed
saju_chart - First observed
yongshin_candidates
TDQS
Scored across 6 tools
Each tool targets a distinct aspect of saju analysis: natal chart, five elements, chart pattern, yin-yang/climate, favorable element candidates, and calendar. There is no overlap in purpose, and descriptions clearly differentiate them.
All tool names use snake_case with consistent lowercase styling, and they follow a predictable noun-based pattern (e.g., saju_chart, ohaeng_balance). No mixing of conventions or verb styles.
Six tools is well-scoped for a specialized saju analysis server. Each tool earns its place by covering a distinct analytical layer, with no redundancy or bloat.
Core chart analysis is well-covered, including natal chart, elements, pattern, climate, and favorable elements. However, advanced analyses like dedicated 10-year luck cycle (daeun) interpretation or compatibility (gunghap) are missing, leaving minor gaps.
Maintenance
Related MCP Connectors
Korean Four Pillars (Saju/BaZi) calculator: pillars, elements, ten gods, sinsal, luck cycles.
Korean Saju (Four Pillars) calculator: birth chart, day pillar, luck flow, monthly fortune
Deterministic Korean Saju / BaZi Four Pillars MCP. Day Master, five elements, compatibility.
Free BaZi, I Ching, tarot, Zi Wei and bilingual learning tools with transparent methods. No API key.
Related MCP Servers
- FlicenseCqualityDmaintenanceProvides Korean traditional Saju (Four Pillars of Destiny) fortune-telling analysis including birth chart calculations, compatibility checks, daily/yearly fortunes, calendar conversions, and personalized life advice based on ancient Eastern astrology.742-
- AlicenseAqualityDmaintenanceProvides tools for Bazi (Chinese astrology) chart calculation and analysis, enabling LLMs to generate accurate birth charts, determine patterns, and answer follow-up questions based on actual calculations rather than model knowledge.2MIT
- FlicenseAqualityDmaintenanceEnables MCP clients to compute and interpret Korean Four Pillars of Destiny (Saju) through natural language, including calculation, interpretation, compatibility analysis, and daily fortune.424 npm-
- FlicenseNot gradedqualityDmaintenanceMCP server that calculates saju (four pillars) from birth date/time and provides entertaining interpretations of daily fortune, yearly luck, compatibility, name analysis, and tarot using MIT-licensed manseryeok-js.-