Skip to main content
Glama
zhaopeng309

AstroStellar MCP Server

by zhaopeng309
README.md
# 🌟 AstroStellar(天星紫府)— 紫微斗数智能 Skill

> 满天星曜,尽布盘中。天星紫府,观心见命。

**AstroStellar** 是一款基于紫微斗数古籍的智能排盘与解盘系统,以 OpenClaw Skill + MCP Server 双重形态提供服务。用户只需像聊天一样逐步提供出生信息,即可自动排出完整命盘,并获得基于古籍知识库的专业解读。

---

## ✨ 它能做什么

| 功能 | 说明 |
|------|------|
| 🧮 **智能排盘** | 输入生辰 → 自动计算完整命盘(十四主星、四化、十二宫、大限、流年) |
| 📚 **古籍查书** | ChromaDB 语义检索,从 18 份古籍 + 213 页《紫微斗数全书》中查找相关解读 |
| 🔮 **整体解盘** | 生成六大板块结构化报告:命盘概览 → 命宫总论 → 十二宫简析 → 四化点睛 → 格局判断 → 流年提点 |
| 💬 **专项问答** | 财运、感情、事业、健康……随你问 |
| 🌸 **善解人意** | 一次只问一个问题,记不清时辰也不怕,像朋友聊天一样自然 |

---

## 🏗️ 原理

### 整体架构

```
┌──────────────────────────────────────────────────┐
│                     👤 用户                       │
│         飞书 / 微信 / Telegram 等渠道              │
└────────────────────┬─────────────────────────────┘
                     │ 自然语言对话
                     ▼
┌──────────────────────────────────────────────────┐
│               🦞 OpenClaw 平台                     │
│                                                    │
│   ┌──────────────────────────────────────┐        │
│   │            SKILL.md                   │        │
│   │  · 10 步定盘对话状态机                │        │
│   │  · 善解人意的人物设定                 │        │
│   │  · MCP 协议工具调度                   │        │
│   └──────────────┬───────────────────────┘        │
│                  │ MCP Protocol                    │
└──────────────────┼────────────────────────────────┘
                   ▼
┌──────────────────────────────────────────────────┐
│              🔧 MCP Server (Python)                │
│                                                    │
│   ┌────────────┐ ┌──────────┐ ┌────────────────┐ │
│   │ 排盘引擎    │ │ 解盘引擎  │ │ 知识库引擎      │ │
│   │ chart.py   │ │interp.py │ │ knowledge.py   │ │
│   │            │ │          │ │                │ │
│   │ 日历转换    │ │ 星曜解读  │ │ ChromaDB       │ │
│   │ 四柱推算    │ │ 宫位解读  │ │ 语义检索       │ │
│   │ 五行局      │ │ 格局检测  │ │ 18 MD + 1 PDF │ │
│   │ 安命宫      │ │ 综合解盘  │ │                │ │
│   │ 安十四主星  │ │ 专项问答  │ │                │ │
│   │ 安四化      │ │          │ │                │ │
│   │ 大限/流年   │ │          │ │                │ │
│   └────────────┘ └──────────┘ └────────────────┘ │
└──────────────────────────────────────────────────┘
```

### 排盘算法

排盘核心基于**太阳黄经天文算法**,独立计算 24 节气交节时刻,不依赖任何查表数据:

1. **日历转换**(`lunar_calendar.py`):`lunardate` 库负责公历⇄农历互转,四柱推算使用干支纪日基点(1900-01-01 = 甲戌日),按距基点天数推导日柱
2. **安命宫/身宫**(`chart.py`):寅起正月,按生月顺逆数,再按生时顺逆数
3. **安十四主星**:根据五行局数和农历日定紫微位置,紫微系六星逆排,天府系八星顺排
4. **安四化**:十干四化表全覆盖
5. **排大限/流年**:阳男阴女顺行,阴男阳女逆行,局数起运

### 知识库

- **数据源**:18 份 Markdown 格式紫微斗数古籍 + 213 页《紫微斗数全书》PDF(南北山人版)
- **检索方式**:ChromaDB 向量数据库 + `sentence-transformers` 多语言嵌入模型
- **持久化**:首次加载后存入 `data/chroma_db/`,后续直接读取,无需重复构建

### 解盘引擎

采用「数据 + 知识库 + 结构化模板」三合一方式:
1. 从 `stars.json` 获取十四主星结构化属性(五行、阴阳、庙旺、落陷、各宫解读)
2. 从 ChromaDB 语义检索相关古籍段落
3. 按六大板块模板组装为完整报告
4. 专项问答通过 30+ 关键词智能路由到相关宫位

---

## 📦 下载位置

**GitHub 仓库:** [`https://github.com/zhaopeng309/AstroStellar`](https://github.com/zhaopeng309/AstroStellar)

```bash
git clone https://github.com/zhaopeng309/AstroStellar.git
cd AstroStellar
```

---

## 🚀 使用方法

### 第一步:克隆项目

```bash
git clone https://github.com/zhaopeng309/AstroStellar.git
cd AstroStellar
```

### 第二步:创建虚拟环境

```bash
python3 -m venv venv
source venv/bin/activate
```

### 第三步:安装依赖

```bash
pip install -r requirements.txt
```

> ⚠️ 首次安装会下载 `sentence-transformers` 嵌入模型(约 500MB),请确保网络畅通且磁盘空间充足。

### 第四步:(可选)初始化知识库

知识库会在首次调用 `astrostellar_search_knowledge` 时自动构建。也可以手动初始化:

```bash
source venv/bin/activate
python -c "from src.knowledge import init_knowledge_base; init_knowledge_base('references', 'data/chroma_db')"
```

> 初始化完成后,ChromaDB 数据会持久化到 `data/chroma_db/`,后续启动无需重复构建。

### 第五步:启动 MCP Server

```bash
source venv/bin/activate
python src/server.py
```

MCP Server 使用 stdio 传输协议,由 OpenClaw 平台自动调用,无需手动暴露端口。

### 第六步:在 OpenClaw 中使用

将 `SKILL.md` 软连接到 OpenClaw 的 skills 目录,或直接通过 OpenClaw 的 Skill 管理加载。

### 对话示例

```
用户:帮我排盘
天星:🌸 你好呀~我是天星,可以帮你排紫微斗数命盘……
      先从最简单的问题开始:你是哪一年出生的?(比如 1990)

用户:1990
天星:好的,1990 年,记下了 ✍️
      接下来:你的生日是几月几号?
      📝 已收集:1990 年

用户:6月15日
天星:知道了,6 月 15 日 ✍️
      这个日期是公历还是农历?
      📝 已收集:1990 年 6 月 15 日

……(继续 10 步定盘)……

天星:🌸 你的紫微斗数命盘
      ━━━━━━ 四柱 ━━━━━━
      年柱庚午 月柱壬午 日柱辛亥

用户:我的财运怎么样?
天星:关于财运——
      财帛宫坐申,宫内武曲天府,逢化禄则财运亨通……
```

---

## 📂 项目结构

```
AstroStellar/
├── SKILL.md                  # OpenClaw 技能定义(对话流 + 人物设定)
├── skill-card.md             # 技能元数据
├── README.md                 # 本文件
├── requirements.txt          # Python 依赖
│
├── src/                      # 核心引擎
│   ├── lunar_calendar.py      # Block 1: 日历 + 四柱 + 五行局 + 节气计算
│   ├── chart.py               # Block 2: 排盘核心(命宫→主星→四化→大限→流年)
│   ├── knowledge.py           # Block 3a: 知识库(ChromaDB 语义检索)
│   ├── interpreter.py         # Block 3b: 解盘引擎
│   └── server.py              # Block 4: MCP Server(3 个 tool)
│
├── data/                     # 数据
│   ├── stars.json            # 十四主星结构化属性
│   └── chroma_db/            # ChromaDB 持久化知识库
│
├── references/               # 紫微斗数参考书籍
│   └── 紫微斗数全书.pdf       #古籍全书
│
└── tests/                    # 自动化测试
```

---

## 🧪 测试

```bash
cd AstroStellar
source venv/bin/activate
python -m pytest tests/ -v
```

当前测试覆盖:**225+ 用例,全部通过**。

> 💡 知识库测试(`test_knowledge.py`)涉及 embedding 模型,若内存不足可跳过:`python -m pytest tests/ -v --ignore=tests/test_knowledge.py`

---

## 📚 技术栈

| 组件 | 技术 | 用途 |
|------|------|------|
| 历法 | `lunardate` | 公历⇄农历互转(1900-2100) |
| 节气 | 纯 Python 太阳黄经算法 | 立春/惊蛰等 12 节交节时间 |
| 排盘 | 纯 Python 实现 | 命宫、主星、四化、大限、流年 |
| 知识库 | ChromaDB + `sentence-transformers` | 古籍语义检索 |
| MCP | `mcp` (FastMCP) | 标准 Tool 接口 |
| 测试 | `pytest` | 单元 + 集成 |

---

## ⚠️ 注意事项

- **年份范围**:支持 1900-2100 年(lunardate 库限制)
- **ChromaDB 初始化**:首次构建知识库需下载 embedding 模型(~500MB),完成后持久化无需重复
- **MCP 协议**:Server 使用 stdio 传输,由 OpenClaw 自动管理生命周期
- **虚拟环境**:始终在项目 venv 中运行,不要使用系统 Python

---

> 🌟 天星紫府 — 满天星曜,尽布盘中