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, luck cycles, a manseryeok (만세력) calendar and the classical texts as structured, reproducible data from the CAFE engine. Your AI writes the reading in the user's language.

Remote Auth Version License

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: solar terms to the second, birthplace longitude, historical time zones and daylight saving. Same input, same chart, every time.


Quick start

Server URL:

https://mcp.24plus.ai.kr/mcp

claude.ai, Claude apps, ChatGPT: add a custom connector with the URL above, sign in to 24PLUS, then allow. No key needed.

Claude Code, Cursor and other clients: either add the URL and sign in (OAuth), or create a key at https://24plus.ai.kr/my and send it as a bearer token:

claude mcp add --transport http cafe-mcp https://mcp.24plus.ai.kr/mcp --header "Authorization: Bearer mcp_live_..."
{ "mcpServers": { "cafe-mcp": { "url": "https://mcp.24plus.ai.kr/mcp", "headers": { "Authorization": "Bearer mcp_live_..." } } } }

Disconnect any time from My account > Connected AI.

Related MCP server: mcp-luopan

Plans

Free

Plus (launching soon)

Different charts per month

10

100

Tool calls per month

300

3,000

Calls per minute

20

60

Engine judgments (structure, useful element, luck index)

–

✓

Classics

3 results, translation excerpt, table of contents

10 results, full translation, full chapters

A chart you have already looked up does not count again. Details: https://24plus.ai.kr/pricing

Tools

Tool

Plan

What it does

saju_chart

Free

Four pillars with Hanja, Five Elements, Ten Gods, hidden stems, twelve life stages, stars, combinations, clashes and void

luck_cycles

Free

Ten-year cycles with start ages, yearly and monthly pillars

saju_reading_context

Free

Chart facts, current luck, term meanings and reading principles in one prompt-ready bundle. The best first call for a reading

manse_calendar

Free

A month of solar and lunar dates, day pillars, exact solar-term times, auspicious days

find_dates_by_pillars

Free

Reverse lookup: the dates and times that produce given pillars

find_birthplace

Free

City search for longitude correction (births outside Korea)

lookup_term

Free

980 Saju terms in Korean, Hanja and English

search_classics

Free

Ziping Zhenquan, Ditian Sui, Qiongtong Baojian and more, original with Korean translation

read_classic

Free

The library and each book's table of contents (full chapters on Plus)

chart_structure

Plus

Day Master strength (1 to 5) with its basis, element ratios, structure pattern, climate

useful_element

Plus

Useful element candidates by five classical methods and the engine's pick

luck_index

Plus

A 1 to 5 level for each cycle, year or month, with the reasons

Full reference with inputs and example prompts: https://24plus.ai.kr/docs/tools

Values come back in Korean with Hanja; pass lang="en" for English term names.

Principles

  • Calculation is deterministic; interpretation is left to your AI, grounded in the returned data.

  • No scores or fixed predictions in the free tools. Levels describe the strength of a tendency.

  • Birth data is used only for the calculation. The server keeps a one-way fingerprint for the monthly chart count, never the birth date itself. See PRIVACY.md.

Before v1.1.0

Until 2026-10-18 this URL served an open server with six tools and no sign-in, and the npm package @dangamsoft/cafe-mcp ran it locally over stdio. Both are retired; the npm package is deprecated. See CHANGELOG.md.

About

cafe-mcp is run by 24PLUS (Dangamsoft, Korea), built on the CAFE engine. Website: https://24plus.ai.kr · Business API (Core API): https://24plus.ai.kr/mcp#business

License: Apache-2.0 for the code in this repository.

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

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

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

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

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

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

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', '오행 분석'.

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

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

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

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

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

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

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    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
    43
    MIT
  • 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
    41 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.
    -