Skip to main content
Glama

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.

MCP Remote License W3C OWL 2 Ontology Version

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/mcp

2. 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

saju_chart

Four Pillars (四柱八字): stems and branches, Day Master (日干), Ten Gods (十神), hidden stems, Spirit Stars (神殺), Twelve Life Stages (十二運星)

ohaeng_balance

Five Elements (五行) distribution, dominant / weakest element

gyeokguk

Chart structure (格局) and Day Master strength (身强 / 身弱)

eumyang_johu

Yin-Yang and climate (陰陽 調候) balance across luck cycles (大運)

yongshin_candidates

Favorable element (用神) candidates from 5 classical methods (격국, 억부, 병약, 조후, 통관)

manse_calendar

Manseryeok (萬歲曆): day / month / year pillars, lunar dates, 24 solar terms (節氣) with exact start time (KST), Korean holidays, 손없는날 / 황도일, for a month (month: "2027-02") or a day (date: "2027-02-04"); no birth input

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

birth

1990-01-15T10:30

local time; legacy 199001151030 also accepted

sex

female / male

legacy gender 0/1 accepted

calendar

solar (default) / lunar

lunar_leap_month for leap months

rat_hour_rule

late (default) / early

야자시 / 조자시 (late vs early Rat hour)

year_boundary

lichun (default) / winter_solstice

입춘 / 동지 (year starts at Lichun or the winter solstice)

time_unknown

true

hour pillar marked as estimated

loc

259

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_recommend tool 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

structuredContent + outputSchema

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


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 tools
eumyang_johuYin-Yang and climate balanceA
Read-onlyIdempotent
Inspect

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', '조후 분석'.

ParametersJSON Schema
NameRequiredDescriptionDefault
locNo24Plus world-city ID for births outside Korea.
sexNoSex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.
nameNoOptional display name.
birthYesLocal 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.
genderNoLegacy form of sex: 0 female, 1 male.
option1NoLegacy form of rat_hour_rule (1 = early).
option2NoLegacy form of year_boundary (-1 = winter_solstice).
calendarNoCalendar of the birth date. Default solar.
is_lunarNoLegacy form of calendar=lunar.
timezoneNoIANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.
is_leap_yearNoLegacy form of lunar_leap_month.
time_unknownNoBirth time unknown; the hour pillar is marked as estimated.
rat_hour_ruleNoRat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.
year_boundaryNoYear pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.
lunar_leap_monthNoLunar leap month (윤달). Only with calendar=lunar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
toolYes
basisNoChart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.
linksYes
engineYes
contractYes
disclaimerYes
input_echoYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 (格局)A
Read-onlyIdempotent
Inspect

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', '내 격국'.

ParametersJSON Schema
NameRequiredDescriptionDefault
locNo24Plus world-city ID for births outside Korea.
sexNoSex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.
nameNoOptional display name.
birthYesLocal 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.
genderNoLegacy form of sex: 0 female, 1 male.
option1NoLegacy form of rat_hour_rule (1 = early).
option2NoLegacy form of year_boundary (-1 = winter_solstice).
calendarNoCalendar of the birth date. Default solar.
is_lunarNoLegacy form of calendar=lunar.
timezoneNoIANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.
is_leap_yearNoLegacy form of lunar_leap_month.
time_unknownNoBirth time unknown; the hour pillar is marked as estimated.
rat_hour_ruleNoRat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.
year_boundaryNoYear pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.
lunar_leap_monthNoLunar leap month (윤달). Only with calendar=lunar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
toolYes
basisNoChart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.
linksYes
engineYes
contractYes
disclaimerYes
input_echoYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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)A
Read-onlyIdempotent
Inspect

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월 일진'.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoA single day 'YYYY-MM-DD'. When given, only that day is returned and 'month' is ignored.
monthNoMonth to list, 'YYYY-MM' (1900-01 to 2100-12). Default: the current month in Korea (Asia/Seoul).

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
toolYes
linksYes
monthYes
engineYes
contractYes
disclaimerYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 balanceA
Read-onlyIdempotent
Inspect

Five Elements (五行: Wood, Fire, Earth, Metal, Water) distribution with hidden-stem weighting; dominant and weakest element. Use for 'which element am I missing', '오행 분석'.

ParametersJSON Schema
NameRequiredDescriptionDefault
locNo24Plus world-city ID for births outside Korea.
sexNoSex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.
nameNoOptional display name.
birthYesLocal 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.
genderNoLegacy form of sex: 0 female, 1 male.
option1NoLegacy form of rat_hour_rule (1 = early).
option2NoLegacy form of year_boundary (-1 = winter_solstice).
calendarNoCalendar of the birth date. Default solar.
is_lunarNoLegacy form of calendar=lunar.
timezoneNoIANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.
is_leap_yearNoLegacy form of lunar_leap_month.
time_unknownNoBirth time unknown; the hour pillar is marked as estimated.
rat_hour_ruleNoRat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.
year_boundaryNoYear pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.
lunar_leap_monthNoLunar leap month (윤달). Only with calendar=lunar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
toolYes
basisNoChart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.
linksYes
engineYes
contractYes
disclaimerYes
input_echoYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 chartA
Read-onlyIdempotent
Inspect

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', '내 사주 봐줘'.

ParametersJSON Schema
NameRequiredDescriptionDefault
locNo24Plus world-city ID for births outside Korea.
sexNoSex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.
nameNoOptional display name.
birthYesLocal 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.
genderNoLegacy form of sex: 0 female, 1 male.
option1NoLegacy form of rat_hour_rule (1 = early).
option2NoLegacy form of year_boundary (-1 = winter_solstice).
calendarNoCalendar of the birth date. Default solar.
is_lunarNoLegacy form of calendar=lunar.
timezoneNoIANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.
is_leap_yearNoLegacy form of lunar_leap_month.
time_unknownNoBirth time unknown; the hour pillar is marked as estimated.
rat_hour_ruleNoRat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.
year_boundaryNoYear pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.
lunar_leap_monthNoLunar leap month (윤달). Only with calendar=lunar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
toolYes
basisNoChart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.
linksYes
engineYes
contractYes
disclaimerYes
input_echoYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 candidatesA
Read-onlyIdempotent
Inspect

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', '용신 후보'.

ParametersJSON Schema
NameRequiredDescriptionDefault
locNo24Plus world-city ID for births outside Korea.
sexNoSex at birth; sets the direction of the 10-year luck cycles. Required unless legacy 'gender' is given.
nameNoOptional display name.
birthYesLocal 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.
genderNoLegacy form of sex: 0 female, 1 male.
option1NoLegacy form of rat_hour_rule (1 = early).
option2NoLegacy form of year_boundary (-1 = winter_solstice).
calendarNoCalendar of the birth date. Default solar.
is_lunarNoLegacy form of calendar=lunar.
timezoneNoIANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.
is_leap_yearNoLegacy form of lunar_leap_month.
time_unknownNoBirth time unknown; the hour pillar is marked as estimated.
rat_hour_ruleNoRat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.
year_boundaryNoYear pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.
lunar_leap_monthNoLunar leap month (윤달). Only with calendar=lunar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes
toolYes
basisNoChart basis text ([기본정보]): pillars, calendar/season basis, luck-cycle start.
linksYes
engineYes
contractYes
disclaimerYes
input_echoYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv1.0.1
    • Changedeumyang_johu30 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / birth / description
        Previous 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."
      • addedInput schema / properties / calendar
        Added value: +{
        +  "description": "Calendar of the birth date. Default solar.",
        +  "enum": [
        +    "solar",
        +    "lunar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / gender / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / gender / description
        Previous value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male."
      • removedInput schema / properties / gender / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / gender / type
        Removed value: -"integer"
      • changedInput schema / properties / is_leap_year / description
        Previous 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."
      • changedInput schema / properties / is_lunar / description
        Previous value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar."
      • changedInput schema / properties / loc / description
        Previous 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."
      • addedInput schema / properties / loc / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / loc / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / lunar_leap_month
        Added value: +{
        +  "description": "Lunar leap month (윤달). Only with calendar=lunar.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name."
      • addedInput schema / properties / name / maxLength
        Added value: +40
      • addedInput schema / properties / option1 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option1 / description
        Previous value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)."
      • removedInput schema / properties / option1 / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / option1 / type
        Removed value: -"integer"
      • addedInput schema / properties / option2 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": -1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option2 / description
        Previous value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)."
      • removedInput schema / properties / option2 / enum
        Removed value: -[
        -  0,
        -  -1
        -]
      • removedInput schema / properties / option2 / type
        Removed value: -"integer"
      • addedInput schema / properties / rat_hour_rule
        Added value: +{
        +  "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.",
        +  "enum": [
        +    "late",
        +    "early"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sex
        Added 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"
        +}
      • changedInput schema / properties / time_unknown / description
        Previous 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."
      • addedInput schema / properties / timezone
        Added value: +{
        +  "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_boundary
        Added value: +{
        +  "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.",
        +  "enum": [
        +    "lichun",
        +    "winter_solstice"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "birth",
        -  "gender"
        -]New value: +[
        +  "birth"
        +]
      • changedOutput 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"
        +}
    • Changedgyeokguk30 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / birth / description
        Previous 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."
      • addedInput schema / properties / calendar
        Added value: +{
        +  "description": "Calendar of the birth date. Default solar.",
        +  "enum": [
        +    "solar",
        +    "lunar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / gender / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / gender / description
        Previous value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male."
      • removedInput schema / properties / gender / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / gender / type
        Removed value: -"integer"
      • changedInput schema / properties / is_leap_year / description
        Previous 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."
      • changedInput schema / properties / is_lunar / description
        Previous value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar."
      • changedInput schema / properties / loc / description
        Previous 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."
      • addedInput schema / properties / loc / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / loc / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / lunar_leap_month
        Added value: +{
        +  "description": "Lunar leap month (윤달). Only with calendar=lunar.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name."
      • addedInput schema / properties / name / maxLength
        Added value: +40
      • addedInput schema / properties / option1 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option1 / description
        Previous value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)."
      • removedInput schema / properties / option1 / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / option1 / type
        Removed value: -"integer"
      • addedInput schema / properties / option2 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": -1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option2 / description
        Previous value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)."
      • removedInput schema / properties / option2 / enum
        Removed value: -[
        -  0,
        -  -1
        -]
      • removedInput schema / properties / option2 / type
        Removed value: -"integer"
      • addedInput schema / properties / rat_hour_rule
        Added value: +{
        +  "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.",
        +  "enum": [
        +    "late",
        +    "early"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sex
        Added 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"
        +}
      • changedInput schema / properties / time_unknown / description
        Previous 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."
      • addedInput schema / properties / timezone
        Added value: +{
        +  "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_boundary
        Added value: +{
        +  "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.",
        +  "enum": [
        +    "lichun",
        +    "winter_solstice"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "birth",
        -  "gender"
        -]New value: +[
        +  "birth"
        +]
      • changedOutput 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"
        +}
    • Addedmanse_calendar
    • Changedohaeng_balance30 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / birth / description
        Previous 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."
      • addedInput schema / properties / calendar
        Added value: +{
        +  "description": "Calendar of the birth date. Default solar.",
        +  "enum": [
        +    "solar",
        +    "lunar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / gender / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / gender / description
        Previous value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male."
      • removedInput schema / properties / gender / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / gender / type
        Removed value: -"integer"
      • changedInput schema / properties / is_leap_year / description
        Previous 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."
      • changedInput schema / properties / is_lunar / description
        Previous value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar."
      • changedInput schema / properties / loc / description
        Previous 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."
      • addedInput schema / properties / loc / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / loc / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / lunar_leap_month
        Added value: +{
        +  "description": "Lunar leap month (윤달). Only with calendar=lunar.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name."
      • addedInput schema / properties / name / maxLength
        Added value: +40
      • addedInput schema / properties / option1 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option1 / description
        Previous value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)."
      • removedInput schema / properties / option1 / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / option1 / type
        Removed value: -"integer"
      • addedInput schema / properties / option2 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": -1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option2 / description
        Previous value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)."
      • removedInput schema / properties / option2 / enum
        Removed value: -[
        -  0,
        -  -1
        -]
      • removedInput schema / properties / option2 / type
        Removed value: -"integer"
      • addedInput schema / properties / rat_hour_rule
        Added value: +{
        +  "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.",
        +  "enum": [
        +    "late",
        +    "early"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sex
        Added 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"
        +}
      • changedInput schema / properties / time_unknown / description
        Previous 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."
      • addedInput schema / properties / timezone
        Added value: +{
        +  "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_boundary
        Added value: +{
        +  "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.",
        +  "enum": [
        +    "lichun",
        +    "winter_solstice"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "birth",
        -  "gender"
        -]New value: +[
        +  "birth"
        +]
      • changedOutput 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"
        +}
    • Changedsaju_chart30 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / birth / description
        Previous 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."
      • addedInput schema / properties / calendar
        Added value: +{
        +  "description": "Calendar of the birth date. Default solar.",
        +  "enum": [
        +    "solar",
        +    "lunar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / gender / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / gender / description
        Previous value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male."
      • removedInput schema / properties / gender / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / gender / type
        Removed value: -"integer"
      • changedInput schema / properties / is_leap_year / description
        Previous 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."
      • changedInput schema / properties / is_lunar / description
        Previous value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar."
      • changedInput schema / properties / loc / description
        Previous 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."
      • addedInput schema / properties / loc / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / loc / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / lunar_leap_month
        Added value: +{
        +  "description": "Lunar leap month (윤달). Only with calendar=lunar.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name."
      • addedInput schema / properties / name / maxLength
        Added value: +40
      • addedInput schema / properties / option1 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option1 / description
        Previous value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)."
      • removedInput schema / properties / option1 / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / option1 / type
        Removed value: -"integer"
      • addedInput schema / properties / option2 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": -1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option2 / description
        Previous value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)."
      • removedInput schema / properties / option2 / enum
        Removed value: -[
        -  0,
        -  -1
        -]
      • removedInput schema / properties / option2 / type
        Removed value: -"integer"
      • addedInput schema / properties / rat_hour_rule
        Added value: +{
        +  "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.",
        +  "enum": [
        +    "late",
        +    "early"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sex
        Added 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"
        +}
      • changedInput schema / properties / time_unknown / description
        Previous 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."
      • addedInput schema / properties / timezone
        Added value: +{
        +  "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_boundary
        Added value: +{
        +  "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.",
        +  "enum": [
        +    "lichun",
        +    "winter_solstice"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "birth",
        -  "gender"
        -]New value: +[
        +  "birth"
        +]
      • changedOutput 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"
        +}
    • Changedyongshin_candidates30 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / birth / description
        Previous 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."
      • addedInput schema / properties / calendar
        Added value: +{
        +  "description": "Calendar of the birth date. Default solar.",
        +  "enum": [
        +    "solar",
        +    "lunar"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / gender / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / gender / description
        Previous value: -"Gender — 0: female, 1: male (CAFE convention)."New value: +"Legacy form of sex: 0 female, 1 male."
      • removedInput schema / properties / gender / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / gender / type
        Removed value: -"integer"
      • changedInput schema / properties / is_leap_year / description
        Previous 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."
      • changedInput schema / properties / is_lunar / description
        Previous value: -"Optional. true if the birth date is a lunar-calendar date (default false = solar)."New value: +"Legacy form of calendar=lunar."
      • changedInput schema / properties / loc / description
        Previous 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."
      • addedInput schema / properties / loc / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / loc / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / lunar_leap_month
        Added value: +{
        +  "description": "Lunar leap month (윤달). Only with calendar=lunar.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"Optional name. Affects some engine outputs; omit to use the default."New value: +"Optional display name."
      • addedInput schema / properties / name / maxLength
        Added value: +40
      • addedInput schema / properties / option1 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": 1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option1 / description
        Previous value: -"Optional Rat-hour (자시) rule — 0: Ya-jasi/야자시 (default), 1: Jo-jasi/조자시."New value: +"Legacy form of rat_hour_rule (1 = early)."
      • removedInput schema / properties / option1 / enum
        Removed value: -[
        -  0,
        -  1
        -]
      • removedInput schema / properties / option1 / type
        Removed value: -"integer"
      • addedInput schema / properties / option2 / anyOf
        Added value: +[
        +  {
        +    "const": 0,
        +    "type": "number"
        +  },
        +  {
        +    "const": -1,
        +    "type": "number"
        +  }
        +]
      • changedInput schema / properties / option2 / description
        Previous value: -"Optional year-pillar season basis — 0: Ipchun/입춘 (default, standard practice), -1: Dongji/동지."New value: +"Legacy form of year_boundary (-1 = winter_solstice)."
      • removedInput schema / properties / option2 / enum
        Removed value: -[
        -  0,
        -  -1
        -]
      • removedInput schema / properties / option2 / type
        Removed value: -"integer"
      • addedInput schema / properties / rat_hour_rule
        Added value: +{
        +  "description": "Rat-hour (子時) rule: 'late' 야자시 (default) or 'early' 조자시.",
        +  "enum": [
        +    "late",
        +    "early"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sex
        Added 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"
        +}
      • changedInput schema / properties / time_unknown / description
        Previous 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."
      • addedInput schema / properties / timezone
        Added value: +{
        +  "description": "IANA time zone of the birthplace. Asia/Seoul is supported directly; for births elsewhere pass 'loc'.",
        +  "type": "string"
        +}
      • addedInput schema / properties / year_boundary
        Added value: +{
        +  "description": "Year pillar boundary: 'lichun' 입춘 (default) or 'winter_solstice' 동지.",
        +  "enum": [
        +    "lichun",
        +    "winter_solstice"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "birth",
        -  "gender"
        -]New value: +[
        +  "birth"
        +]
      • changedOutput 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"
        +}
  2. 5 tool updatesv0.1.0
    • First observedeumyang_johu
    • First observedgyeokguk
    • First observedohaeng_balance
    • First observedsaju_chart
    • First observedyongshin_candidates

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    Provides 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.
    7
    42
    -
  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    2
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables MCP clients to compute and interpret Korean Four Pillars of Destiny (Saju) through natural language, including calculation, interpretation, compatibility analysis, and daily fortune.
    4
    24 npm
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    MCP 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.
    -