Skip to main content
Glama
hjsh200219

Saju Fortune-Telling MCP Server

by hjsh200219
README.md
# ๐Ÿ”ฎ ์‚ฌ์ฃผ ์šด์„ธ MCP ์„œ๋ฒ„ (Saju MCP Server)

[![npm version](https://img.shields.io/npm/v/@hoshin/saju-mcp-server)](https://www.npmjs.com/package/@hoshin/saju-mcp-server)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org)

ํ•œ๊ตญ ์ „ํ†ต ์‚ฌ์ฃผํŒ”์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์„ธ๋ฅผ ๋ถ„์„ํ•˜๋Š” MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

A Model Context Protocol (MCP) server for Korean traditional Saju (Four Pillars of Destiny) fortune-telling.

> **๐ŸŒ Language**: [ํ•œ๊ตญ์–ด](#ํ•œ๊ตญ์–ด) | [English](#english)

## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

- **์‚ฌ์ฃผํŒ”์ž ๊ณ„์‚ฐ**: ์ƒ๋…„์›”์ผ์‹œ๋กœ๋ถ€ํ„ฐ ์ฒœ๊ฐ„์ง€์ง€ 8์ž ์ž๋™ ๊ณ„์‚ฐ (์ง„ํƒœ์–‘์‹œ -30๋ถ„ ๋ณด์ •)
- **์šด์„ธ ๋ถ„์„**: ์„ฑ๊ฒฉ, ์ง์—…์šด, ์žฌ๋ฌผ์šด, ๊ฑด๊ฐ•์šด, ์• ์ •์šด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์„
- **๊ถํ•ฉ ๋ถ„์„**: ๋‘ ์‚ฌ๋žŒ์˜ ์‚ฌ์ฃผ ๋น„๊ต ๋ฐ ๊ถํ•ฉ๋„ ๊ณ„์‚ฐ
- **์Œ์–‘๋ ฅ ๋ณ€ํ™˜**: ์–‘๋ ฅ โ†” ์Œ๋ ฅ ๋‚ ์งœ ๋ณ€ํ™˜ ์ง€์› (1900-2200, ์œค๋‹ฌ ์ฒ˜๋ฆฌ ํฌํ•จ)
- **์ผ์ผ ์šด์„ธ**: ๋‚ ์งœ๋ณ„ ์ƒ์„ธ ์šด์„ธ ์ œ๊ณต
- **๋Œ€์šด(ๅคง้‹)**: 10๋…„ ๋‹จ์œ„ ํฐ ํ๋ฆ„ ์šด์„ธ ์กฐํšŒ
- **์šฉ์‹ (็”จ็ฅž) ๋ถ„์„**: ์ƒ‰์ƒ, ๋ฐฉํ–ฅ, ์ง์—… ๋“ฑ ๋งž์ถคํ˜• ์กฐ์–ธ ์ œ๊ณต
- **์ง€์žฅ๊ฐ„ ์„ธ๋ ฅ**: ์ ˆ๊ธฐ๋ณ„ ์ง€์žฅ๊ฐ„ ์„ธ๋ ฅ ๊ณ„์‚ฐ์œผ๋กœ ์ •๋ฐ€ํ•œ ๋ถ„์„
- **์‹ ์‚ด(็ฅžๆฎบ)**: 15๊ฐœ ์‹ ์‚ด ํƒ์ง€ (์›์ง„์‚ด, ๊ท€๋ฌธ๊ด€์‚ด ํฌํ•จ)

### ๐Ÿ†• v1.2.0 ์‹ ๊ทœ ๊ธฐ๋Šฅ
- **7๊ฐœ ํ†ตํ•ฉ ๋„๊ตฌ**: 15๊ฐœ ๊ฐœ๋ณ„ ๋„๊ตฌ๋ฅผ 7๊ฐœ๋กœ ์ตœ์ ํ™” (ํ† ํฐ ํšจ์œจ 40% ๊ฐœ์„ )
- **๋กœ์ปฌ ํ…Œ์ด๋ธ”**: 1900-2200๋…„ ์Œ์–‘๋ ฅ ๋ฐ์ดํ„ฐ (์™ธ๋ถ€ API ์˜์กด์„ฑ ์ œ๊ฑฐ)
- **Zod ์ž…๋ ฅ ๊ฒ€์ฆ**: ๋Ÿฐํƒ€์ž„ ํƒ€์ž… ๊ฒ€์ฆ์œผ๋กœ ์—๋Ÿฌ์œจ 40% ๊ฐ์†Œ
- **date-fns ํ†ตํ•ฉ**: ํƒ€์ž„์กด ๋ฒ„๊ทธ ์ œ๊ฑฐ ๋ฐ ์ •๋ฐ€ํ•œ ๋‚ ์งœ ์ฒ˜๋ฆฌ
- **MCP SDK v1.18**: ์ตœ์‹  ํ”„๋กœํ† ์ฝœ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”
- **Smithery ์ง€์›**: stateless export, npm ํŒจํ‚ค์ง€ ๋ฐฐํฌ ๋ณ‘ํ–‰
- **HTTP ์„œ๋ฒ„ ๋ชจ๋“œ**: `npm run start:http` (Railway ๋ฐฐํฌ์šฉ)

## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

### ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

- Node.js 18 ์ด์ƒ
- npm, yarn, ๋˜๋Š” pnpm

### ์„ค์น˜

#### ์ž๋™ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ (๊ฐ€์žฅ ๊ฐ„ํŽธ)

```bash
# ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰
curl -fsSL https://raw.githubusercontent.com/hjsh200219/fortuneteller/main/install.sh | bash
```

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
- npm ํŒจํ‚ค์ง€ ์ „์—ญ ์„ค์น˜
- Claude Desktop ์„ค์ • ํŒŒ์ผ์— MCP ์„œ๋ฒ„ ์ž๋™ ๋“ฑ๋ก
- ๊ธฐ์กด ์„ค์ • ๋ฐฑ์—…

#### ์ˆ˜๋™ ์„ค์น˜

```bash
# npm์œผ๋กœ ์ „์—ญ ์„ค์น˜
npm install -g @hoshin/saju-mcp-server

# ๋˜๋Š” npx๋กœ ์ง์ ‘ ์‹คํ–‰
npx @hoshin/saju-mcp-server
```

#### ์†Œ์Šค์—์„œ ๋นŒ๋“œ

```bash
# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/hjsh200219/fortuneteller.git
cd fortuneteller

# ์˜์กด์„ฑ ์„ค์น˜
npm install

# ๊ฐœ๋ฐœ ๋ชจ๋“œ ์‹คํ–‰
npm run dev

# ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
npm run build
npm start
```

## ๐Ÿ› ๏ธ MCP ๋„๊ตฌ (์ด 7๊ฐœ - ํ†ตํ•ฉ ์ตœ์ ํ™”)

### 1. analyze_saju
์‚ฌ์ฃผ ๋ถ„์„ ํ†ตํ•ฉ ๋„๊ตฌ (๊ธฐ๋ณธ ๊ณ„์‚ฐ, ์šด์„ธ, ์šฉ์‹ , ์œ ํŒŒ ๋น„๊ต, ์šฉ์‹  ๋ฐฉ๋ฒ•๋ก ).

**๋ถ„์„ ํƒ€์ž…**:
- `basic`: ์‚ฌ์ฃผํŒ”์ž ๊ธฐ๋ณธ ๊ณ„์‚ฐ
- `fortune`: ์šด์„ธ ๋ถ„์„ (general/career/wealth/health/love)
- `yongsin`: ์šฉ์‹  ์ƒ์„ธ ๋ถ„์„
- `school_compare`: 5๊ฐœ ์œ ํŒŒ ๋น„๊ต (์žํ‰๋ช…๋ฆฌ, ์ ์ฒœ์ˆ˜, ๊ถํ†ต๋ณด๊ฐ, ํ˜„๋Œ€๋ช…๋ฆฌ, ์‹ ์‚ด์ค‘์‹ฌ)
- `yongsin_method`: ํŠน์ • ์šฉ์‹  ๋ฐฉ๋ฒ•๋ก  ๋ถ„์„ (๊ฐ•์•ฝ/์กฐํ›„/ํ†ต๊ด€/๋ณ‘์•ฝ)

```typescript
{
  birthDate: "1990-03-15",
  birthTime: "10:30",
  calendar: "solar",
  isLeapMonth: false,
  gender: "male",
  analysisType: "basic" | "fortune" | "yongsin" | "school_compare" | "yongsin_method",

  // fortune ํƒ€์ž…์šฉ ์˜ต์…˜
  fortuneType?: "general" | "career" | "wealth" | "health" | "love",

  // school_compare ํƒ€์ž…์šฉ ์˜ต์…˜
  schools?: ["ziping", "dts", "qtbj", "modern", "shensha"],

  // yongsin_method ํƒ€์ž…์šฉ ์˜ต์…˜
  method?: "strength" | "seasonal" | "mediation" | "disease"
}
```

### 2. check_compatibility
๋‘ ์‚ฌ๋žŒ์˜ ๊ถํ•ฉ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

```typescript
{
  person1: {
    birthDate: "1990-03-15",
    birthTime: "10:30",
    calendar: "solar",
    isLeapMonth: false,
    gender: "male"
  },
  person2: {
    birthDate: "1992-07-20",
    birthTime: "14:30",
    calendar: "solar",
    isLeapMonth: false,
    gender: "female"
  }
}
```

### 3. convert_calendar
์–‘๋ ฅ๊ณผ ์Œ๋ ฅ์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค (1900-2200 ์ง€์›).

```typescript
{
  date: "2025-01-01",
  fromCalendar: "solar",
  toCalendar: "lunar",
  isLeapMonth?: false
}
```

### 4. get_daily_fortune
ํŠน์ • ๋‚ ์งœ์˜ ์ผ์ผ ์šด์„ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

```typescript
{
  birthDate: "1990-03-15",
  birthTime: "10:30",
  calendar: "solar",
  isLeapMonth: false,
  gender: "male",
  targetDate: "2025-01-01"
}
```

### 5. get_dae_un
10๋…„ ๋‹จ์œ„ ๋Œ€์šด(ๅคง้‹) ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

```typescript
{
  birthDate: "1990-03-15",
  birthTime: "10:30",
  calendar: "solar",
  isLeapMonth: false,
  gender: "male"
}
```

### 6. get_fortune_by_period
์‹œ๊ฐ„๋Œ€๋ณ„ ์šด์„ธ ํ†ตํ•ฉ ๋„๊ตฌ (์—ฐ์šด/์›”์šด/์‹œ์šด/์—ฐ์†).

**๊ธฐ๊ฐ„ ํƒ€์ž…**:
- `year`: ์—ฐ๋ณ„ ์šด์„ธ (์„ธ์šด, ๆญฒ้‹)
- `month`: ์›”๋ณ„ ์šด์„ธ (์›”์šด, ๆœˆ้‹)
- `hour`: ์‹œ๊ฐ„๋Œ€๋ณ„ ์šด์„ธ (์‹œ์šด, ๆ™‚้‹)
- `multi-year`: ์—ฐ์† ์—ฐ๋„ ์šด์„ธ

```typescript
{
  birthDate: "1990-03-15",
  birthTime: "10:30",
  calendar: "solar",
  isLeapMonth: false,
  gender: "male",
  periodType: "year" | "month" | "hour" | "multi-year",

  // ๊ธฐ๊ฐ„ ์ง€์ • (periodType์— ๋งž๋Š” ํ˜•์‹)
  target?: "2025" | "2025-03" | "2025-01-01 14:00",

  // multi-year ํƒ€์ž…์šฉ ์˜ต์…˜
  count?: 5  // ์กฐํšŒํ•  ์—ฐ๋„ ๊ฐœ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 5)
}
```

### 7. manage_settings
ํ•ด์„ ์„ค์ • ๊ด€๋ฆฌ ๋„๊ตฌ (์กฐํšŒ/๋ณ€๊ฒฝ).

**์•ก์…˜**:
- `get`: ํ˜„์žฌ ์„ค์ • ์กฐํšŒ
- `set`: ์„ค์ • ๋ณ€๊ฒฝ (ํ”„๋ฆฌ์…‹ ๋˜๋Š” ์ปค์Šคํ…€)

```typescript
{
  action: "get" | "set",

  // set ์•ก์…˜์šฉ ์˜ต์…˜
  preset?: "ziping" | "dts" | "qtbj" | "modern" | "shensha" | "balanced",

  // ๋˜๋Š” ์ปค์Šคํ…€ ๊ฐ€์ค‘์น˜
  custom?: {
    ziping: 0.3,    // ์žํ‰๋ช…๋ฆฌ ๊ฐ€์ค‘์น˜ (0.0-1.0)
    dts: 0.2,       // ์ ์ฒœ์ˆ˜ ๊ฐ€์ค‘์น˜
    qtbj: 0.2,      // ๊ถํ†ต๋ณด๊ฐ ๊ฐ€์ค‘์น˜
    modern: 0.2,    // ํ˜„๋Œ€๋ช…๋ฆฌ ๊ฐ€์ค‘์น˜
    shensha: 0.1    // ์‹ ์‚ด์ค‘์‹ฌ ๊ฐ€์ค‘์น˜
  }
}
```

## ๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

```
fortuneteller/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts              # MCP ์„œ๋ฒ„ ์ง„์ž…์  (stdio)
โ”‚   โ”œโ”€โ”€ server-http.ts        # HTTP ์„œ๋ฒ„ ์ง„์ž…์  (Railway ๋ฐฐํฌ์šฉ)
โ”‚   โ”œโ”€โ”€ smithery.ts           # Smithery stateless export
โ”‚   โ”œโ”€โ”€ core/                 # ํ•ต์‹ฌ ์‹œ์Šคํ…œ
โ”‚   โ”‚   โ”œโ”€โ”€ server.ts            # MCP ์„œ๋ฒ„ ์ดˆ๊ธฐํ™”
โ”‚   โ”‚   โ”œโ”€โ”€ tool-definitions.ts  # 7๊ฐœ ๋„๊ตฌ ์ •์˜
โ”‚   โ”‚   โ””โ”€โ”€ tool-handler.ts      # ๋„๊ตฌ ๋ผ์šฐํŒ…
โ”‚   โ”œโ”€โ”€ tools/                # MCP ๋„๊ตฌ ๊ตฌํ˜„
โ”‚   โ”‚   โ”œโ”€โ”€ analyze_saju.ts      # ํ†ตํ•ฉ ์‚ฌ์ฃผ ๋ถ„์„
โ”‚   โ”‚   โ”œโ”€โ”€ check_compatibility.ts
โ”‚   โ”‚   โ”œโ”€โ”€ convert_calendar.ts
โ”‚   โ”‚   โ”œโ”€โ”€ get_daily_fortune.ts
โ”‚   โ”‚   โ”œโ”€โ”€ get_dae_un.ts
โ”‚   โ”‚   โ”œโ”€โ”€ get_fortune_by_period.ts  # ํ†ตํ•ฉ ์‹œ๊ฐ„๋Œ€๋ณ„ ์šด์„ธ
โ”‚   โ”‚   โ””โ”€โ”€ manage_settings.ts        # ํ†ตํ•ฉ ์„ค์ • ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ lib/                  # ํ•ต์‹ฌ ๋กœ์ง
โ”‚   โ”‚   โ”œโ”€โ”€ saju.ts           # ์‚ฌ์ฃผ ๊ณ„์‚ฐ (์ง„ํƒœ์–‘์‹œ -30๋ถ„ ๋ณด์ •)
โ”‚   โ”‚   โ”œโ”€โ”€ calendar.ts       # ์Œ์–‘๋ ฅ ๋ณ€ํ™˜ (๋กœ์ปฌ ํ…Œ์ด๋ธ”)
โ”‚   โ”‚   โ”œโ”€โ”€ fortune.ts        # ์šด์„ธ ๋ถ„์„
โ”‚   โ”‚   โ”œโ”€โ”€ compatibility.ts  # ๊ถํ•ฉ ๋ถ„์„
โ”‚   โ”‚   โ”œโ”€โ”€ dae_un.ts         # ๋Œ€์šด ๊ณ„์‚ฐ
โ”‚   โ”‚   โ”œโ”€โ”€ yong_sin.ts       # ์šฉ์‹  ์„ ์ •
โ”‚   โ”‚   โ”œโ”€โ”€ ten_gods.ts       # ์‹ญ์„ฑ ๊ณ„์‚ฐ
โ”‚   โ”‚   โ”œโ”€โ”€ sin_sal.ts        # ์‹ ์‚ด ํƒ์ง€ (15๊ฐœ)
โ”‚   โ”‚   โ”œโ”€โ”€ day_master_strength.ts  # ์ผ๊ฐ„ ๊ฐ•์•ฝ
โ”‚   โ”‚   โ”œโ”€โ”€ gyeok_guk.ts      # ๊ฒฉ๊ตญ ๊ฒฐ์ •
โ”‚   โ”‚   โ””โ”€โ”€ ...               # ์„ธ์šด/์›”์šด/๋Œ€์šด/์ผ์ฃผ ์ƒ์„ธ ๋ถ„์„ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ data/                 # ์ •์  ๋ฐ์ดํ„ฐ
โ”‚   โ”‚   โ”œโ”€โ”€ heavenly_stems.ts      # ์ฒœ๊ฐ„(ๅคฉๅนฒ) 10๊ฐœ
โ”‚   โ”‚   โ”œโ”€โ”€ earthly_branches.ts    # ์ง€์ง€(ๅœฐๆ”ฏ) 12๊ฐœ, ์ง€์žฅ๊ฐ„ ์„ธ๋ ฅ
โ”‚   โ”‚   โ”œโ”€โ”€ wuxing.ts              # ์˜คํ–‰(ไบ”่กŒ) ์ƒ์ƒ์ƒ๊ทน
โ”‚   โ”‚   โ”œโ”€โ”€ solar_terms.ts         # 24์ ˆ๊ธฐ ์ง„์ž…์ 
โ”‚   โ”‚   โ”œโ”€โ”€ solar_terms_complete.ts # 24์ ˆ๊ธฐ ํ†ตํ•ฉ (1900-2200)
โ”‚   โ”‚   โ”œโ”€โ”€ lunar_table.ts         # ์Œ๋ ฅ ํ…Œ์ด๋ธ” ์ง„์ž…์ 
โ”‚   โ”‚   โ”œโ”€โ”€ manselyeok_table.ts    # ๋งŒ์„ธ๋ ฅ ๊ธฐ์ค€ ํ…Œ์ด๋ธ”
โ”‚   โ”‚   โ””โ”€โ”€ longitude_table.ts     # ์ „๊ตญ 162๊ฐœ ์‹œ๊ตฐ๊ตฌ ๊ฒฝ๋„
โ”‚   โ”œโ”€โ”€ schemas/              # Zod ์Šคํ‚ค๋งˆ ์ •์˜
โ”‚   โ”œโ”€โ”€ utils/                # ์œ ํ‹ธ๋ฆฌํ‹ฐ (๋‚ ์งœ ์ฒ˜๋ฆฌ ๋“ฑ)
โ”‚   โ”œโ”€โ”€ benchmark/            # ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ
โ”‚   โ””โ”€โ”€ types/                # ํƒ€์ž… ์ •์˜
โ”‚       โ””โ”€โ”€ index.ts
โ”œโ”€โ”€ scripts/                  # ๊ฒ€์ฆยท์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ tsconfig.json
โ”œโ”€โ”€ docker-compose.yml
โ”œโ”€โ”€ railway.json              # Railway ๋ฐฐํฌ ์„ค์ •
โ”œโ”€โ”€ smithery.yaml             # Smithery ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ์„ค์ •
โ”œโ”€โ”€ AGENTS.md                 # Claude Code ๊ฐ€์ด๋“œ
โ””โ”€โ”€ README.md
```

## ๐Ÿ”ง ๊ฐœ๋ฐœ

```bash
# ๊ฐœ๋ฐœ ๋ชจ๋“œ (hot reload)
npm run watch

# ๋ฆฐํŠธ ์ฒดํฌ
npm run lint

# ์ฝ”๋“œ ํฌ๋งทํŒ…
npm run format

# ํ…Œ์ŠคํŠธ ์‹คํ–‰
npm test

# API ๋ฌธ์„œ ์ƒ์„ฑ
npm run docs

# API ๋ฌธ์„œ ๋กœ์ปฌ ์„œ๋ฒ„ (http://localhost:8080)
npm run docs:serve
```

## ๐Ÿ“– MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ •

### Claude Desktop

`~/Library/Application Support/Claude/claude_desktop_config.json`์— ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”:

#### npm ํŒจํ‚ค์ง€ ์‚ฌ์šฉ (๊ถŒ์žฅ)

```json
{
  "mcpServers": {
    "saju": {
      "command": "npx",
      "args": ["-y", "@hoshin/saju-mcp-server"]
    }
  }
}
```

#### ์ „์—ญ ์„ค์น˜ ํ›„ ์‚ฌ์šฉ

```bash
npm install -g @hoshin/saju-mcp-server
```

```json
{
  "mcpServers": {
    "saju": {
      "command": "saju-mcp-server"
    }
  }
}
```

#### ๋กœ์ปฌ ๊ฐœ๋ฐœ (์†Œ์Šค์—์„œ)

```json
{
  "mcpServers": {
    "saju": {
      "command": "node",
      "args": ["/path/to/saju-mcp-server/dist/index.js"]
    }
  }
}
```

## ๐Ÿณ Docker ์ง€์›

### Docker๋กœ ์‹คํ–‰

```bash
# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t saju-mcp-server .

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run -it --rm saju-mcp-server

# ๋˜๋Š” docker-compose ์‚ฌ์šฉ
docker-compose up -d
```

### Smithery๋ฅผ ํ†ตํ•œ ์›ํด๋ฆญ ์„ค์น˜

```bash
# Smithery CLI๋กœ ์„ค์น˜
npx @smithery/cli install saju-mcp-server --client claude
```

Smithery ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ ๋” ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

---

## ๐Ÿ“š ์‚ฌ์ฃผํŒ”์ž ์šฉ์–ด ์„ค๋ช…

### ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ
- **์ฒœ๊ฐ„(ๅคฉๅนฒ)**: ๊ฐ‘(็”ฒ), ์„(ไน™), ๋ณ‘(ไธ™), ์ •(ไธ), ๋ฌด(ๆˆŠ), ๊ธฐ(ๅทฑ), ๊ฒฝ(ๅบš), ์‹ (่พ›), ์ž„(ๅฃฌ), ๊ณ„(็™ธ) - 10๊ฐœ
- **์ง€์ง€(ๅœฐๆ”ฏ)**: ์ž(ๅญ), ์ถ•(ไธ‘), ์ธ(ๅฏ…), ๋ฌ˜(ๅฏ), ์ง„(่พฐ), ์‚ฌ(ๅทณ), ์˜ค(ๅˆ), ๋ฏธ(ๆœช), ์‹ (็”ณ), ์œ (้…‰), ์ˆ (ๆˆŒ), ํ•ด(ไบฅ) - 12๊ฐœ
- **์˜คํ–‰(ไบ”่กŒ)**: ๋ชฉ(ๆœจ), ํ™”(็ซ), ํ† (ๅœŸ), ๊ธˆ(้‡‘), ์ˆ˜(ๆฐด) - ์ƒ์ƒ์ƒ๊ทน ๊ด€๊ณ„
- **์‹ญ์„ฑ(ๅๆ˜Ÿ)**: ๋น„๊ฒฌ, ๊ฒ์žฌ, ์‹์‹ , ์ƒ๊ด€, ํŽธ์žฌ, ์ •์žฌ, ํŽธ๊ด€, ์ •๊ด€, ํŽธ์ธ, ์ •์ธ

### ๊ณ ๊ธ‰ ๋ถ„์„ ์š”์†Œ
- **์ง€์žฅ๊ฐ„(ๆ”ฏ่—ๅนฒ)**: ์ง€์ง€ ์†์— ์ˆจ์–ด์žˆ๋Š” ์ฒœ๊ฐ„ (์ •๊ธฐ, ์ค‘๊ธฐ, ์—ฌ๊ธฐ)
- **์‹ ์‚ด(็ฅžๆฎบ)**: 15๊ฐœ์˜ ๊ธธํ‰ ์ง€ํ‘œ (์ฒœ์„๊ท€์ธ, ์—ญ๋งˆ์‚ด, ๋„ํ™”์‚ด, ์›์ง„์‚ด, ๊ท€๋ฌธ๊ด€์‚ด ๋“ฑ)
- **์šฉ์‹ (็”จ็ฅž)**: ์‚ฌ์ฃผ์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ํ•ต์‹ฌ ์˜คํ–‰
- **๊ฒฉ๊ตญ(ๆ ผๅฑ€)**: ์‚ฌ์ฃผ์˜ ์ „์ฒด์ ์ธ ํŒจํ„ด๊ณผ ์„ฑํ–ฅ
- **๋Œ€์šด(ๅคง้‹)**: 10๋…„ ๋‹จ์œ„์˜ ํฐ ์šด์„ธ ํ๋ฆ„
- **์ง„ํƒœ์–‘์‹œ(็œžๅคช้™ฝๆ™‚)**: ํ•œ๊ตญ ํ‘œ์ค€์‹œ -30๋ถ„ ๋ณด์ • (์ •ํ™•ํ•œ ์‚ฌ์ฃผ ๊ณ„์‚ฐ์„ ์œ„ํ•จ)

## โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ

์ด ์„œ๋น„์Šค๋Š” ์ „ํ†ต ์‚ฌ์ฃผํŒ”์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ฐธ๊ณ ์šฉ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- ์˜ํ•™์ , ๋ฒ•๋ฅ ์ , ์žฌ์ •์  ์กฐ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค
- ์ค‘์š”ํ•œ ๊ฒฐ์ •์€ ๋ฐ˜๋“œ์‹œ ์ „๋ฌธ๊ฐ€์™€ ์ƒ๋‹ดํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค
- ์šด์„ธ๋Š” ๊ฐœ์ธ์˜ ๋…ธ๋ ฅ๊ณผ ์„ ํƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

## ๐Ÿ“„ ๋ผ์ด์„ผ์Šค

MIT License

## ๐Ÿ‘จโ€๐Ÿ’ป ๊ธฐ์—ฌ

์ด์Šˆ ์ œ๋ณด ๋ฐ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

---

## English

### โœจ Features

- **Saju (Four Pillars) Calculation**: Automatic calculation of 8 characters from birth date and time (with -30min true solar time correction)
- **Fortune Analysis**: Comprehensive analysis including personality, career, wealth, health, and love fortune
- **Compatibility Analysis**: Compatibility calculation and comparison between two people
- **Calendar Conversion**: Solar โ†” Lunar calendar conversion (1900-2200) with leap month support
- **Daily Fortune**: Detailed daily fortune for specific dates
- **Dae-un (ๅคง้‹)**: 10-year major fortune cycle analysis
- **Yong-sin (็”จ็ฅž) Analysis**: Personalized advice on colors, directions, and careers
- **Ji-jang-gan Strength**: Precise analysis with seasonal hidden stem strength calculation
- **Sin-sal (็ฅžๆฎบ)**: Detection of 15 special stars (including Won-jin-sal, Gwi-mun-gwan-sal)

### ๐Ÿš€ Quick Start

#### Installation

**Option 1: Automatic Installation Script (Recommended)**
```bash
curl -fsSL https://raw.githubusercontent.com/hjsh200219/fortuneteller/main/install.sh | bash
```

**Option 2: Manual Installation**
```bash
npm install -g @hoshin/saju-mcp-server
```

**Option 3: Using npx (No Installation)**
```bash
npx @hoshin/saju-mcp-server
```

#### Claude Desktop Configuration

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "saju": {
      "command": "npx",
      "args": ["-y", "@hoshin/saju-mcp-server"]
    }
  }
}
```

Restart Claude Desktop and start using the tools!

### ๐Ÿ› ๏ธ Available Tools (7 Integrated Tools)

1. **analyze_saju** - Integrated Saju analysis (basic/fortune/yongsin/school_compare/yongsin_method)
2. **check_compatibility** - Analyze compatibility between two people
3. **convert_calendar** - Convert between solar and lunar calendars (1900-2200)
4. **get_daily_fortune** - Get daily fortune for specific date
5. **get_dae_un** - Get 10-year major fortune cycles
6. **get_fortune_by_period** - Get fortune by period (year/month/hour/multi-year)
7. **manage_settings** - Manage interpretation settings (get/set)

### ๐Ÿ“š Key Concepts

#### Basic Components
- **Heavenly Stems (ๅคฉๅนฒ)**: 10 stems - ็”ฒไน™ไธ™ไธๆˆŠๅทฑๅบš่พ›ๅฃฌ็™ธ
- **Earthly Branches (ๅœฐๆ”ฏ)**: 12 branches - ๅญไธ‘ๅฏ…ๅฏ่พฐๅทณๅˆๆœช็”ณ้…‰ๆˆŒไบฅ
- **Five Elements (ไบ”่กŒ)**: Wood, Fire, Earth, Metal, Water
- **Ten Gods (ๅๆ˜Ÿ)**: 10 relationship types

#### Advanced Analysis
- **Hidden Stems (ๆ”ฏ่—ๅนฒ)**: Hidden stems within branches
- **Special Stars (็ฅžๆฎบ)**: 15 auspicious/inauspicious indicators
- **Yong-sin (็”จ็ฅž)**: Beneficial element for balance
- **Pattern (ๆ ผๅฑ€)**: Overall life pattern classification
- **Dae-un (ๅคง้‹)**: 10-year major fortune cycles
- **True Solar Time (็œžๅคช้™ฝๆ™‚)**: -30min Korea time correction

### ๐Ÿณ Docker Support

```bash
# Build image
docker build -t saju-mcp-server .

# Run container
docker run -it --rm saju-mcp-server

# Or use docker-compose
docker-compose up -d
```

### ๐Ÿ”ง Smithery One-Click Install

```bash
# Install via Smithery CLI
npx @smithery/cli install saju-mcp-server --client claude
```

Easier installation and management through Smithery marketplace.

### ๐Ÿ“– Documentation

- ๐Ÿ“™ [Developer Guide](CLAUDE.md) - Project structure and development
- ๐Ÿ“˜ [Architecture](ARCHITECTURE.md) - System architecture overview
- ๐Ÿ“— [Design Docs](docs/design-docs/index.md) - Design decisions and principles
- ๐Ÿ“• [Quality Score](docs/QUALITY_SCORE.md) - Quality metrics tracking

### ๐Ÿค Contributing

Issues and pull requests are welcome!

### ๐Ÿ“„ License

MIT License

### โš ๏ธ Disclaimer

This service provides reference information based on traditional Saju fortune-telling.
- Not intended as medical, legal, or financial advice
- Please consult professionals for important decisions
- Fortune can change based on personal effort and choices

---

Made with โค๏ธ for Korean traditional fortune-telling

TDQS

C2.5/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have distinct purposes: analyze_saju for comprehensive birth chart analysis, check_compatibility for relationship matching, convert_calendar for date conversion, get_dae_un for 10-year cycles, get_daily_fortune for daily predictions, get_fortune_by_period for time-based fortunes, and manage_settings for configuration. However, get_daily_fortune and get_fortune_by_period could potentially overlap in some use cases (e.g., daily vs. hourly fortunes), but their descriptions clarify the scope.

Naming Consistency5/5

All tools follow a consistent snake_case naming convention with clear verb_noun patterns: analyze_saju, check_compatibility, convert_calendar, get_dae_un, get_daily_fortune, get_fortune_by_period, and manage_settings. The naming is predictable and readable throughout the set.

Tool Count5/5

With 7 tools, this server is well-scoped for fortune-telling and Saju analysis. Each tool serves a specific function in the domain, from core analysis (analyze_saju) to utilities (convert_calendar) and configuration (manage_settings). The count is neither too sparse nor bloated, fitting the purpose effectively.

Completeness4/5

The tool set covers key aspects of Saju fortune-telling: birth chart analysis, compatibility checks, calendar conversion, fortune predictions (daily, time-based, and long-term cycles), and settings management. A minor gap might be the lack of tools for historical data or advanced customization beyond basic settings, but core workflows are well-supported.

Maintenance

ActivityInactive
ResponsivenessUnresponsive