@dhcckb/mcp-server-dila-time 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -0
- package/dist/dila-client.d.ts +37 -0
- package/dist/dila-client.d.ts.map +1 -0
- package/dist/dila-client.js +257 -0
- package/dist/dila-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +368 -0
- package/dist/index.js.map +1 -0
- package/package.json +87 -0
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# @dhp/mcp-server-dila-time
|
|
2
|
+
|
|
3
|
+
MCP Server for Chinese-Western calendar conversion using the [DILA Buddhist Studies Time Authority Database](https://authority.dila.edu.tw/time/index.php).
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Chinese → Western Calendar Conversion**: Convert dynasty + era name + year to Western (Gregorian/Julian) dates
|
|
8
|
+
- **Era Name Search**: Fuzzy search for dynasty and era names by keyword
|
|
9
|
+
- **Ganzhi (Sexagenary Cycle) Lookup**: Find Western years corresponding to a Chinese sexagenary cycle combination
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @dhp/mcp-server-dila-time
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Or install globally:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @dhp/mcp-server-dila-time
|
|
21
|
+
mcp-server-dila-time
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## MCP Client Configuration
|
|
25
|
+
|
|
26
|
+
Add to your MCP client configuration (e.g., Claude Desktop `claude_desktop_config.json`):
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"dila-time": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["-y", "@dhp/mcp-server-dila-time"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Tools
|
|
40
|
+
|
|
41
|
+
### `dila_convert_chinese_to_western`
|
|
42
|
+
|
|
43
|
+
Convert a Chinese calendar date to Western calendar date.
|
|
44
|
+
|
|
45
|
+
**Parameters:**
|
|
46
|
+
- `dynasty` (required): Dynasty name, e.g., 唐, 宋, 明, 清
|
|
47
|
+
- `era_name` (required): Era/reign name, e.g., 贞观, 康熙, 乾隆
|
|
48
|
+
- `year` (required): Year number within the era, e.g., 3 for 贞观三年
|
|
49
|
+
- `month` (optional): Lunar month (1-12)
|
|
50
|
+
- `day` (optional): Lunar day (1-30)
|
|
51
|
+
- `month_is_leap` (optional): Whether it's a leap month, default false
|
|
52
|
+
|
|
53
|
+
### `dila_search_era_names`
|
|
54
|
+
|
|
55
|
+
Search for dynasty or era names by keyword.
|
|
56
|
+
|
|
57
|
+
**Parameters:**
|
|
58
|
+
- `keyword` (required): Search keyword (partial dynasty or era name)
|
|
59
|
+
- `dynasty` (optional): Limit results to a specific dynasty
|
|
60
|
+
- `limit` (optional): Maximum number of results, default 10
|
|
61
|
+
|
|
62
|
+
### `dila_lookup_ganzhi_year`
|
|
63
|
+
|
|
64
|
+
Look up Western years for a given sexagenary cycle combination.
|
|
65
|
+
|
|
66
|
+
**Parameters:**
|
|
67
|
+
- `ganzhi` (required): Sexagenary cycle combination, e.g., 甲子, 乙丑, 戊戌
|
|
68
|
+
- `dynasty` (optional): Limit results to a specific dynasty
|
|
69
|
+
|
|
70
|
+
## Data Source
|
|
71
|
+
|
|
72
|
+
All data is sourced from the [DILA Buddhist Studies Time Authority Database](https://authority.dila.edu.tw/time/index.php), maintained by the Dharma Drum Institute of Liberal Arts.
|
|
73
|
+
|
|
74
|
+
## Fallback
|
|
75
|
+
|
|
76
|
+
If the DILA website is unavailable or its HTML structure changes, the tools will return an error with a suggestion to visit https://authority.dila.edu.tw/time/index.php directly.
|
|
77
|
+
|
|
78
|
+
## License
|
|
79
|
+
|
|
80
|
+
MIT
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
declare const FALLBACK_URL = "https://authority.dila.edu.tw/time/index.php";
|
|
2
|
+
/** Fallback message when parsing fails */
|
|
3
|
+
declare const FALLBACK_MESSAGE = "\u6570\u636E\u89E3\u6790\u5931\u8D25\uFF0C\u53EF\u80FD\u662F DILA \u7F51\u7AD9 HTML \u7ED3\u6784\u53D1\u751F\u4E86\u53D8\u5316\u3002\u8BF7\u624B\u52A8\u8BBF\u95EE https://authority.dila.edu.tw/time/index.php \u8FDB\u884C\u67E5\u8BE2\u3002";
|
|
4
|
+
export interface EraResult {
|
|
5
|
+
dynasty: string;
|
|
6
|
+
emperor: string;
|
|
7
|
+
eraName: string;
|
|
8
|
+
duration: string;
|
|
9
|
+
westernStart: string;
|
|
10
|
+
westernEnd: string;
|
|
11
|
+
}
|
|
12
|
+
export interface GanzhiResult {
|
|
13
|
+
westernStart: string;
|
|
14
|
+
westernEnd: string;
|
|
15
|
+
dynasty: string;
|
|
16
|
+
emperor: string;
|
|
17
|
+
eraName: string;
|
|
18
|
+
year: string;
|
|
19
|
+
description: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Query DILA for era/reign name information.
|
|
23
|
+
*/
|
|
24
|
+
export declare function queryEraInfo(params: {
|
|
25
|
+
dynasty?: string;
|
|
26
|
+
eraName?: string;
|
|
27
|
+
keyword?: string;
|
|
28
|
+
}): Promise<EraResult[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Query DILA for ganzhi (sexagenary cycle) year lookup.
|
|
31
|
+
*/
|
|
32
|
+
export declare function queryGanzhi(params: {
|
|
33
|
+
ganzhi: string;
|
|
34
|
+
dynasty?: string;
|
|
35
|
+
}): Promise<GanzhiResult[]>;
|
|
36
|
+
export { FALLBACK_URL, FALLBACK_MESSAGE };
|
|
37
|
+
//# sourceMappingURL=dila-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dila-client.d.ts","sourceRoot":"","sources":["../src/dila-client.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,YAAY,iDAAiD,CAAC;AAEpE,0CAA0C;AAC1C,QAAA,MAAM,gBAAgB,mPACyC,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAwLD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgCvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAoB1B;AAED,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.FALLBACK_MESSAGE = exports.FALLBACK_URL = void 0;
|
|
40
|
+
exports.queryEraInfo = queryEraInfo;
|
|
41
|
+
exports.queryGanzhi = queryGanzhi;
|
|
42
|
+
const axios_1 = __importDefault(require("axios"));
|
|
43
|
+
const cheerio = __importStar(require("cheerio"));
|
|
44
|
+
const DILA_BASE_URL = "https://authority.dila.edu.tw/time/";
|
|
45
|
+
const DILA_SEARCH_URL = `${DILA_BASE_URL}search.php`;
|
|
46
|
+
const USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
47
|
+
const FALLBACK_URL = "https://authority.dila.edu.tw/time/index.php";
|
|
48
|
+
exports.FALLBACK_URL = FALLBACK_URL;
|
|
49
|
+
/** Fallback message when parsing fails */
|
|
50
|
+
const FALLBACK_MESSAGE = `数据解析失败,可能是 DILA 网站 HTML 结构发生了变化。请手动访问 ${FALLBACK_URL} 进行查询。`;
|
|
51
|
+
exports.FALLBACK_MESSAGE = FALLBACK_MESSAGE;
|
|
52
|
+
/**
|
|
53
|
+
* Search DILA for era/time information.
|
|
54
|
+
*/
|
|
55
|
+
async function searchDILA(params) {
|
|
56
|
+
try {
|
|
57
|
+
const response = await axios_1.default.get(DILA_SEARCH_URL, {
|
|
58
|
+
params: {
|
|
59
|
+
julianSwitch: "on",
|
|
60
|
+
...params,
|
|
61
|
+
},
|
|
62
|
+
headers: {
|
|
63
|
+
Referer: `${DILA_BASE_URL}form.php`,
|
|
64
|
+
"User-Agent": USER_AGENT,
|
|
65
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
66
|
+
},
|
|
67
|
+
timeout: 15000,
|
|
68
|
+
});
|
|
69
|
+
return response.data;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (axios_1.default.isAxiosError(error)) {
|
|
73
|
+
if (error.code === "ECONNREFUSED" || error.code === "ENOTFOUND") {
|
|
74
|
+
throw new Error(`无法连接到 DILA 服务器 (${DILA_BASE_URL}),请检查网络连接。\n备选方案:手动访问 ${FALLBACK_URL}`);
|
|
75
|
+
}
|
|
76
|
+
if (error.response?.status === 404) {
|
|
77
|
+
throw new Error(`DILA 查询接口返回 404,可能网站已更新。\n备选方案:手动访问 ${FALLBACK_URL}`);
|
|
78
|
+
}
|
|
79
|
+
if (error.code === "ETIMEDOUT" || error.code === "ECONNABORTED") {
|
|
80
|
+
throw new Error(`DILA 服务器响应超时,请稍后重试。\n备选方案:手动访问 ${FALLBACK_URL}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw new Error(`查询 DILA 时发生未知错误:${error instanceof Error ? error.message : String(error)}\n备选方案:手动访问 ${FALLBACK_URL}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse era/dynasty search results from HTML.
|
|
88
|
+
* Results use <tr class="rowClass"> with 6 <td> elements:
|
|
89
|
+
* [0] link+arrow, [1] dynasty, [2] emperor, [3] era name, [4] duration, [5] date range
|
|
90
|
+
*/
|
|
91
|
+
function parseEraResults(html) {
|
|
92
|
+
const $ = cheerio.load(html);
|
|
93
|
+
const results = [];
|
|
94
|
+
$("tr.rowClass").each((_, row) => {
|
|
95
|
+
const tds = $(row).find("td");
|
|
96
|
+
if (tds.length < 6)
|
|
97
|
+
return;
|
|
98
|
+
const dynasty = $(tds[1]).text().trim();
|
|
99
|
+
const emperor = $(tds[2]).text().trim();
|
|
100
|
+
const eraRaw = $(tds[3]).text().trim();
|
|
101
|
+
// Remove alternative names in brackets like 貞觀[正觀]
|
|
102
|
+
const eraName = eraRaw.replace(/\[.*\]$/, "").trim();
|
|
103
|
+
const duration = $(tds[4]).text().trim();
|
|
104
|
+
const dateRangeText = $(tds[5]).text().trim();
|
|
105
|
+
const { westernStart, westernEnd } = parseDateRange(dateRangeText);
|
|
106
|
+
results.push({
|
|
107
|
+
dynasty,
|
|
108
|
+
emperor,
|
|
109
|
+
eraName,
|
|
110
|
+
duration,
|
|
111
|
+
westernStart,
|
|
112
|
+
westernEnd,
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
return results;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse ganzhi search results from HTML.
|
|
119
|
+
* Results use <tr valign=top> with 3 <td> elements:
|
|
120
|
+
* [0] link+arrow, [1] date range + ID, [2] dynasty/emperor/era/year info
|
|
121
|
+
*/
|
|
122
|
+
function parseGanzhiResults(html) {
|
|
123
|
+
const $ = cheerio.load(html);
|
|
124
|
+
const results = [];
|
|
125
|
+
$('tr[valign="top"]').each((_, row) => {
|
|
126
|
+
const tds = $(row).find("td");
|
|
127
|
+
if (tds.length < 3)
|
|
128
|
+
return;
|
|
129
|
+
const dateRangeText = $(tds[1])
|
|
130
|
+
.text()
|
|
131
|
+
.replace(/\s*\(\d+\)\s*/g, "")
|
|
132
|
+
.trim();
|
|
133
|
+
const infoText = $(tds[2]).text().trim();
|
|
134
|
+
const { westernStart, westernEnd } = parseDateRange(dateRangeText);
|
|
135
|
+
// Parse info text: "西漢 高祖 \n(無年號) 六年 (庚子) \n 戊午 朔"
|
|
136
|
+
const lines = infoText.split("\n").map((l) => l.trim()).filter(Boolean);
|
|
137
|
+
const mainLine = lines[0] || "";
|
|
138
|
+
// Pattern: "朝代 帝号 年号 年份 (干支)"
|
|
139
|
+
const parts = mainLine.split(/\s+/).filter(Boolean);
|
|
140
|
+
let dynasty = "";
|
|
141
|
+
let emperor = "";
|
|
142
|
+
let eraName = "";
|
|
143
|
+
let year = "";
|
|
144
|
+
let description = infoText;
|
|
145
|
+
if (parts.length >= 1)
|
|
146
|
+
dynasty = parts[0];
|
|
147
|
+
if (parts.length >= 2)
|
|
148
|
+
emperor = parts[1];
|
|
149
|
+
// Era name may contain parentheses and Chinese chars
|
|
150
|
+
if (parts.length >= 3) {
|
|
151
|
+
// The era name might span multiple parts
|
|
152
|
+
const eraParts = [];
|
|
153
|
+
let i = 2;
|
|
154
|
+
while (i < parts.length && !/^\d/.test(parts[i]) && !parts[i].startsWith("(")) {
|
|
155
|
+
eraParts.push(parts[i]);
|
|
156
|
+
i++;
|
|
157
|
+
}
|
|
158
|
+
eraName = eraParts.join("");
|
|
159
|
+
if (i < parts.length) {
|
|
160
|
+
year = parts[i];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
results.push({
|
|
164
|
+
westernStart,
|
|
165
|
+
westernEnd,
|
|
166
|
+
dynasty,
|
|
167
|
+
emperor,
|
|
168
|
+
eraName,
|
|
169
|
+
year,
|
|
170
|
+
description,
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
return results;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Parse date range text like:
|
|
177
|
+
* "[ C.E. +0618-06-21 ~ C.E. +0626-09-05 ]"
|
|
178
|
+
* "-0201-11-15 ~ -0200-11-03"
|
|
179
|
+
* "+0040-01-31 ~ +0041-02-17"
|
|
180
|
+
*/
|
|
181
|
+
function parseDateRange(text) {
|
|
182
|
+
// Pattern 1: "[ C.E. +YYYY-MM-DD ~ C.E. +YYYY-MM-DD ]"
|
|
183
|
+
let match = text.match(/C\.E\.\s*([+-]?\d{4}-\d{2}-\d{2})\s*~\s*C\.E\.\s*([+-]?\d{4}-\d{2}-\d{2})/);
|
|
184
|
+
if (match) {
|
|
185
|
+
return {
|
|
186
|
+
westernStart: normalizeYear(match[1]),
|
|
187
|
+
westernEnd: normalizeYear(match[2]),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Pattern 2: "+YYYY-MM-DD ~ +YYYY-MM-DD" or "-YYYY-MM-DD ~ -YYYY-MM-DD"
|
|
191
|
+
match = text.match(/([+-]?\d{4}-\d{2}-\d{2})\s*~\s*([+-]?\d{4}-\d{2}-\d{2})/);
|
|
192
|
+
if (match) {
|
|
193
|
+
return {
|
|
194
|
+
westernStart: normalizeYear(match[1]),
|
|
195
|
+
westernEnd: normalizeYear(match[2]),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return { westernStart: "", westernEnd: "" };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Normalize year format: convert "+0618" to "618", keep "-0201" as "-201"
|
|
202
|
+
*/
|
|
203
|
+
function normalizeYear(dateStr) {
|
|
204
|
+
return dateStr.replace(/^\+0*/, "").replace(/^-0*/, "-");
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Query DILA for era/reign name information.
|
|
208
|
+
*/
|
|
209
|
+
async function queryEraInfo(params) {
|
|
210
|
+
const queryParams = {
|
|
211
|
+
chk: "on",
|
|
212
|
+
"filterType[]": "chinese",
|
|
213
|
+
julianSwitch: "on",
|
|
214
|
+
};
|
|
215
|
+
if (params.dynasty)
|
|
216
|
+
queryParams.dpk = params.dynasty;
|
|
217
|
+
// If we have an eraName, use it; otherwise if we have a keyword,
|
|
218
|
+
// use the keyword as the era search parameter (ypk)
|
|
219
|
+
if (params.eraName) {
|
|
220
|
+
queryParams.ypk = params.eraName;
|
|
221
|
+
}
|
|
222
|
+
else if (params.keyword) {
|
|
223
|
+
queryParams.ypk = params.keyword;
|
|
224
|
+
}
|
|
225
|
+
const html = await searchDILA(queryParams);
|
|
226
|
+
let results = parseEraResults(html);
|
|
227
|
+
// Further filter by keyword if provided (fuzzy match on dynasty, era name, or emperor)
|
|
228
|
+
if (params.keyword) {
|
|
229
|
+
const kw = params.keyword.toLowerCase();
|
|
230
|
+
results = results.filter((r) => r.dynasty.toLowerCase().includes(kw) ||
|
|
231
|
+
r.eraName.toLowerCase().includes(kw) ||
|
|
232
|
+
r.emperor.toLowerCase().includes(kw));
|
|
233
|
+
}
|
|
234
|
+
return results;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Query DILA for ganzhi (sexagenary cycle) year lookup.
|
|
238
|
+
*/
|
|
239
|
+
async function queryGanzhi(params) {
|
|
240
|
+
const queryParams = {
|
|
241
|
+
chk: "on",
|
|
242
|
+
gz: params.ganzhi,
|
|
243
|
+
"filterType[]": "chinese",
|
|
244
|
+
julianSwitch: "on",
|
|
245
|
+
};
|
|
246
|
+
if (params.dynasty)
|
|
247
|
+
queryParams.dpk = params.dynasty;
|
|
248
|
+
const html = await searchDILA(queryParams);
|
|
249
|
+
let results = parseGanzhiResults(html);
|
|
250
|
+
// Filter by dynasty if provided
|
|
251
|
+
if (params.dynasty) {
|
|
252
|
+
const dyn = params.dynasty;
|
|
253
|
+
results = results.filter((r) => r.dynasty.includes(dyn));
|
|
254
|
+
}
|
|
255
|
+
return results;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=dila-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dila-client.js","sourceRoot":"","sources":["../src/dila-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
5
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
6
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
7
|
+
const dila_client_js_1 = require("./dila-client.js");
|
|
8
|
+
const DILA_SITE_URL = "https://authority.dila.edu.tw/time/index.php";
|
|
9
|
+
// ─── Tool Definitions ───────────────────────────────────────────────
|
|
10
|
+
const tools = [
|
|
11
|
+
{
|
|
12
|
+
name: "dila_convert_chinese_to_western",
|
|
13
|
+
description: "将中历日期转换为西历日期。输入朝代、年号、年份、月份(可选)、日期(可选),返回对应的西历年月日或年份范围。基于 DILA 佛学规范资料库权威数据。",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: "object",
|
|
16
|
+
properties: {
|
|
17
|
+
dynasty: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "朝代名称,如:唐、宋、明、清等",
|
|
20
|
+
},
|
|
21
|
+
era_name: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "年号名称,如:贞观、康熙、乾隆等",
|
|
24
|
+
},
|
|
25
|
+
year: {
|
|
26
|
+
type: "integer",
|
|
27
|
+
description: "年号纪年(数字),如 3 代表贞观三年",
|
|
28
|
+
},
|
|
29
|
+
month: {
|
|
30
|
+
type: "integer",
|
|
31
|
+
description: "农历月份(1-12),可选",
|
|
32
|
+
},
|
|
33
|
+
day: {
|
|
34
|
+
type: "integer",
|
|
35
|
+
description: "农历日期(1-30),可选",
|
|
36
|
+
},
|
|
37
|
+
month_is_leap: {
|
|
38
|
+
type: "boolean",
|
|
39
|
+
description: "是否为闰月,可选,默认 false",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ["dynasty", "era_name", "year"],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "dila_search_era_names",
|
|
47
|
+
description: "根据关键词搜索朝代或年号信息。用于用户在不确定完整年号名称时进行模糊匹配。返回匹配的年号列表及其所属朝代和起止西历年份。",
|
|
48
|
+
inputSchema: {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
keyword: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "搜索关键词,可以是朝代名或年号名的部分文字",
|
|
54
|
+
},
|
|
55
|
+
dynasty: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: "限定朝代范围,可选",
|
|
58
|
+
},
|
|
59
|
+
limit: {
|
|
60
|
+
type: "integer",
|
|
61
|
+
description: "返回结果数量上限,默认 10",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
required: ["keyword"],
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "dila_lookup_ganzhi_year",
|
|
69
|
+
description: "通过干支纪年查找对应的西历年份。输入干支组合(如:甲子、乙丑)和可选的朝代限定,返回对应的西历年份列表。",
|
|
70
|
+
inputSchema: {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: {
|
|
73
|
+
ganzhi: {
|
|
74
|
+
type: "string",
|
|
75
|
+
description: "干支纪年,如:甲子、乙丑、戊戌等",
|
|
76
|
+
},
|
|
77
|
+
dynasty: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: "限定朝代范围,可选",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
required: ["ganzhi"],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
// ─── Helper Functions ───────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Compute the western year for a specific year within an era.
|
|
89
|
+
* The era record gives the date range for the entire era (era years 1..N).
|
|
90
|
+
* For year N in the era, the western year = era_start_year + (N-1).
|
|
91
|
+
* If month/day are provided, we return the era range as a reference
|
|
92
|
+
* (since precise month/day conversion requires more complex ephemeris).
|
|
93
|
+
*/
|
|
94
|
+
function computeYearFromEra(era, targetYear, month, day, monthIsLeap) {
|
|
95
|
+
// Extract year numbers from the era date range
|
|
96
|
+
// westernStart format: "627-01-26" or "-201-11-15"
|
|
97
|
+
const startParts = era.westernStart.split("-");
|
|
98
|
+
const startYear = parseInt(startParts[0], 10);
|
|
99
|
+
const startSign = era.westernStart.startsWith("-") ? -1 : 1;
|
|
100
|
+
const endParts = era.westernEnd.split("-");
|
|
101
|
+
const endYear = parseInt(endParts[0], 10);
|
|
102
|
+
const endSign = era.westernEnd.startsWith("-") ? -1 : 1;
|
|
103
|
+
// Calculate the target year's estimated range
|
|
104
|
+
const eraLength = parseInt(era.duration.replace(/[^0-9]/g, ""), 10) || 1;
|
|
105
|
+
if (targetYear < 1 || targetYear > eraLength) {
|
|
106
|
+
return {
|
|
107
|
+
westernYearStart: "",
|
|
108
|
+
westernYearEnd: "",
|
|
109
|
+
estimatedWesternStart: "",
|
|
110
|
+
estimatedWesternEnd: "",
|
|
111
|
+
note: `年号 "${era.eraName}" 只有 ${eraLength} 年,您查询的第 ${targetYear} 年超出范围。该年号的有效范围为第 1 年至第 ${eraLength} 年。`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// Estimate: the western start for year N in the era
|
|
115
|
+
// We use the era start year + (N-1) as a rough estimate
|
|
116
|
+
const estStartYear = startSign * startYear + (targetYear - 1);
|
|
117
|
+
const estEndYear = startSign * startYear + targetYear;
|
|
118
|
+
const signStr = (n) => (n < 0 ? `公元前 ${Math.abs(n)}` : `公元 ${n}`);
|
|
119
|
+
let note = `注意:DILA 资料库返回的是年号 "${era.eraName}" 的完整时间范围(${era.westernStart} ~ ${era.westernEnd},${era.duration}),而非单个年份的精确起止。`;
|
|
120
|
+
if (month) {
|
|
121
|
+
note += " 由于输入了月份,精度需匹配到月,但目前 DILA 仅返回年号级别的日期范围。";
|
|
122
|
+
note += ` 第 ${targetYear} 年大约对应 ${signStr(estStartYear)} 至 ${signStr(estEndYear)} 年。`;
|
|
123
|
+
}
|
|
124
|
+
if (day) {
|
|
125
|
+
note += " 输入了日期,但精确到日的换算是近似值。";
|
|
126
|
+
}
|
|
127
|
+
note += ` 如需精确到日,请手动访问 ${DILA_SITE_URL} 进行详细查询。`;
|
|
128
|
+
return {
|
|
129
|
+
westernYearStart: era.westernStart,
|
|
130
|
+
westernYearEnd: era.westernEnd,
|
|
131
|
+
estimatedWesternStart: `${estStartYear >= 0 ? "+" : "-"}${String(Math.abs(estStartYear)).padStart(4, "0")}-01-01`,
|
|
132
|
+
estimatedWesternEnd: `${estEndYear >= 0 ? "+" : "-"}${String(Math.abs(estEndYear)).padStart(4, "0")}-01-01`,
|
|
133
|
+
note,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Format era results for MCP tool output.
|
|
138
|
+
*/
|
|
139
|
+
function formatEraResults(results) {
|
|
140
|
+
if (results.length === 0) {
|
|
141
|
+
return "未找到匹配的年号信息。\n\n备选方案:请手动访问 " + DILA_SITE_URL + " 进行查询。";
|
|
142
|
+
}
|
|
143
|
+
return results
|
|
144
|
+
.map((r, i) => `${i + 1}. 【${r.dynasty}】${r.emperor} · ${r.eraName}\n` +
|
|
145
|
+
` 西历范围:${r.westernStart} ~ ${r.westernEnd}\n` +
|
|
146
|
+
` 时长:${r.duration}`)
|
|
147
|
+
.join("\n\n");
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Format ganzhi results for MCP tool output.
|
|
151
|
+
*/
|
|
152
|
+
function formatGanzhiResults(results) {
|
|
153
|
+
if (results.length === 0) {
|
|
154
|
+
return "未找到匹配的干支纪年信息。\n\n备选方案:请手动访问 " + DILA_SITE_URL + " 进行查询。";
|
|
155
|
+
}
|
|
156
|
+
return results
|
|
157
|
+
.map((r, i) => `${i + 1}. 【${r.dynasty}】${r.emperor} · ${r.eraName}${r.year ? " " + r.year + "年" : ""}\n` +
|
|
158
|
+
` 西历范围:${r.westernStart} ~ ${r.westernEnd}`)
|
|
159
|
+
.join("\n\n");
|
|
160
|
+
}
|
|
161
|
+
// ─── Server Setup ───────────────────────────────────────────────────
|
|
162
|
+
const server = new index_js_1.Server({
|
|
163
|
+
name: "@dhp/mcp-server-dila-time",
|
|
164
|
+
version: "1.0.0",
|
|
165
|
+
}, {
|
|
166
|
+
capabilities: {
|
|
167
|
+
tools: {},
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
// List tools
|
|
171
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
172
|
+
return { tools };
|
|
173
|
+
});
|
|
174
|
+
// Handle tool calls
|
|
175
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
176
|
+
const { name, arguments: args } = request.params;
|
|
177
|
+
try {
|
|
178
|
+
switch (name) {
|
|
179
|
+
case "dila_convert_chinese_to_western": {
|
|
180
|
+
const dynasty = args?.dynasty;
|
|
181
|
+
const eraName = args?.era_name;
|
|
182
|
+
const year = args?.year;
|
|
183
|
+
const month = args?.month;
|
|
184
|
+
const day = args?.day;
|
|
185
|
+
const monthIsLeap = args?.month_is_leap;
|
|
186
|
+
if (!dynasty || !eraName || !year) {
|
|
187
|
+
return {
|
|
188
|
+
content: [
|
|
189
|
+
{
|
|
190
|
+
type: "text",
|
|
191
|
+
text: "错误:缺少必需参数。请提供 dynasty(朝代)、era_name(年号)和 year(年份)。",
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
isError: true,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Query DILA for the era information
|
|
198
|
+
const results = await (0, dila_client_js_1.queryEraInfo)({
|
|
199
|
+
dynasty,
|
|
200
|
+
eraName,
|
|
201
|
+
});
|
|
202
|
+
if (results.length === 0) {
|
|
203
|
+
return {
|
|
204
|
+
content: [
|
|
205
|
+
{
|
|
206
|
+
type: "text",
|
|
207
|
+
text: `未找到匹配的结果:朝代="${dynasty}",年号="${eraName}"。\n\n` +
|
|
208
|
+
`建议:\n` +
|
|
209
|
+
`1. 检查朝代和年号名称是否正确\n` +
|
|
210
|
+
`2. 使用 dila_search_era_names 工具搜索年号\n` +
|
|
211
|
+
`3. 手动访问 ${DILA_SITE_URL} 查询`,
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// Filter to the specific era that matches (same dynasty and era name)
|
|
217
|
+
const exactMatch = results.find((r) => r.dynasty === dynasty &&
|
|
218
|
+
(r.eraName === eraName ||
|
|
219
|
+
r.eraName.includes(eraName) ||
|
|
220
|
+
eraName.includes(r.eraName))) || results[0];
|
|
221
|
+
const computed = computeYearFromEra(exactMatch, year, month, day, monthIsLeap);
|
|
222
|
+
let output = `# 中历 → 西历 转换结果\n\n`;
|
|
223
|
+
output += `**朝代**:${exactMatch.dynasty}\n`;
|
|
224
|
+
output += `**帝号**:${exactMatch.emperor}\n`;
|
|
225
|
+
output += `**年号**:${exactMatch.eraName}\n`;
|
|
226
|
+
output += `**第 ${year} 年**`;
|
|
227
|
+
if (month)
|
|
228
|
+
output += ` ${month} 月`;
|
|
229
|
+
if (day)
|
|
230
|
+
output += ` ${day} 日`;
|
|
231
|
+
if (monthIsLeap)
|
|
232
|
+
output += `(闰月)`;
|
|
233
|
+
output += `\n\n`;
|
|
234
|
+
output += `**年号西历范围**:${exactMatch.westernStart} ~ ${exactMatch.westernEnd}\n`;
|
|
235
|
+
output += `**年号总时长**:${exactMatch.duration}\n\n`;
|
|
236
|
+
output += `**估计第 ${year} 年对应的西历**:${computed.estimatedWesternStart} ~ ${computed.estimatedWesternEnd}\n\n`;
|
|
237
|
+
output += `> ${computed.note}\n\n`;
|
|
238
|
+
output += `---\n`;
|
|
239
|
+
output += `*数据来源:DILA 佛学规范资料库时间规范检索 (${DILA_SITE_URL})*`;
|
|
240
|
+
return {
|
|
241
|
+
content: [{ type: "text", text: output }],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
case "dila_search_era_names": {
|
|
245
|
+
const keyword = args?.keyword;
|
|
246
|
+
const dynasty = args?.dynasty;
|
|
247
|
+
const limit = args?.limit || 10;
|
|
248
|
+
if (!keyword) {
|
|
249
|
+
return {
|
|
250
|
+
content: [
|
|
251
|
+
{
|
|
252
|
+
type: "text",
|
|
253
|
+
text: "错误:缺少必需参数 keyword(搜索关键词)。",
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
isError: true,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// Search by keyword using the era search endpoint
|
|
260
|
+
const results = await (0, dila_client_js_1.queryEraInfo)({
|
|
261
|
+
keyword,
|
|
262
|
+
dynasty,
|
|
263
|
+
});
|
|
264
|
+
const limited = results.slice(0, limit);
|
|
265
|
+
if (limited.length === 0) {
|
|
266
|
+
return {
|
|
267
|
+
content: [
|
|
268
|
+
{
|
|
269
|
+
type: "text",
|
|
270
|
+
text: `未找到匹配 "${keyword}" 的年号或朝代信息。\n\n` +
|
|
271
|
+
(dynasty ? `限定朝代:${dynasty}\n` : "") +
|
|
272
|
+
`备选方案:手动访问 ${DILA_SITE_URL} 进行查询。`,
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
let output = `# 年号搜索结果:${keyword}\n\n`;
|
|
278
|
+
output += `共找到 ${results.length} 条结果`;
|
|
279
|
+
if (results.length > limit)
|
|
280
|
+
output += `,以下显示前 ${limit} 条`;
|
|
281
|
+
output += `:\n\n`;
|
|
282
|
+
if (dynasty)
|
|
283
|
+
output += `限定朝代:${dynasty}\n\n`;
|
|
284
|
+
output += formatEraResults(limited);
|
|
285
|
+
output += `\n\n---\n`;
|
|
286
|
+
output += `*数据来源:DILA 佛学规范资料库时间规范检索 (${DILA_SITE_URL})*`;
|
|
287
|
+
return {
|
|
288
|
+
content: [{ type: "text", text: output }],
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
case "dila_lookup_ganzhi_year": {
|
|
292
|
+
const ganzhi = args?.ganzhi;
|
|
293
|
+
const dynasty = args?.dynasty;
|
|
294
|
+
if (!ganzhi) {
|
|
295
|
+
return {
|
|
296
|
+
content: [
|
|
297
|
+
{
|
|
298
|
+
type: "text",
|
|
299
|
+
text: "错误:缺少必需参数 ganzhi(干支纪年,如:甲子、乙丑)。",
|
|
300
|
+
},
|
|
301
|
+
],
|
|
302
|
+
isError: true,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
const results = await (0, dila_client_js_1.queryGanzhi)({
|
|
306
|
+
ganzhi,
|
|
307
|
+
dynasty,
|
|
308
|
+
});
|
|
309
|
+
if (results.length === 0) {
|
|
310
|
+
return {
|
|
311
|
+
content: [
|
|
312
|
+
{
|
|
313
|
+
type: "text",
|
|
314
|
+
text: `未找到干支 "${ganzhi}" 对应的西历年份。\n\n` +
|
|
315
|
+
(dynasty ? `限定朝代:${dynasty}\n` : "") +
|
|
316
|
+
`备选方案:手动访问 ${DILA_SITE_URL} 进行查询。`,
|
|
317
|
+
},
|
|
318
|
+
],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
let output = `# 干支 "${ganzhi}" 对应的西历年份\n\n`;
|
|
322
|
+
output += `共找到 ${results.length} 条记录:\n\n`;
|
|
323
|
+
if (dynasty)
|
|
324
|
+
output += `限定朝代:${dynasty}\n\n`;
|
|
325
|
+
output += formatGanzhiResults(results);
|
|
326
|
+
output += `\n\n---\n`;
|
|
327
|
+
output += `*数据来源:DILA 佛学规范资料库时间规范检索 (${DILA_SITE_URL})*`;
|
|
328
|
+
return {
|
|
329
|
+
content: [{ type: "text", text: output }],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
default:
|
|
333
|
+
return {
|
|
334
|
+
content: [
|
|
335
|
+
{
|
|
336
|
+
type: "text",
|
|
337
|
+
text: `未知工具:${name}`,
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
isError: true,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
346
|
+
return {
|
|
347
|
+
content: [
|
|
348
|
+
{
|
|
349
|
+
type: "text",
|
|
350
|
+
text: `查询出错:${errorMessage}\n\n备选方案:请手动访问 ${DILA_SITE_URL} 进行查询。`,
|
|
351
|
+
},
|
|
352
|
+
],
|
|
353
|
+
isError: true,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
// ─── Main ───────────────────────────────────────────────────────────
|
|
358
|
+
async function main() {
|
|
359
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
360
|
+
await server.connect(transport);
|
|
361
|
+
console.error("DILA Time MCP Server started (stdio transport)");
|
|
362
|
+
console.error(`Data source: ${DILA_SITE_URL}`);
|
|
363
|
+
}
|
|
364
|
+
main().catch((error) => {
|
|
365
|
+
console.error("Fatal error:", error);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
});
|
|
368
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dhcckb/mcp-server-dila-time",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP Server for Chinese-Western calendar conversion using DILA Buddhist Studies Time Authority Database",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mcp-server-dila-time": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"mcp",
|
|
15
|
+
"chinese-calendar",
|
|
16
|
+
"western-calendar",
|
|
17
|
+
"dila",
|
|
18
|
+
"buddhist-studies",
|
|
19
|
+
"time-authority",
|
|
20
|
+
"era-conversion",
|
|
21
|
+
"ganzhi",
|
|
22
|
+
"sexagenary-cycle"
|
|
23
|
+
],
|
|
24
|
+
"author": "DHCCKB",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist/",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.17.0",
|
|
35
|
+
"axios": "^1.7.0",
|
|
36
|
+
"cheerio": "^1.0.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^20.0.0",
|
|
40
|
+
"typescript": "^5.4.0"
|
|
41
|
+
},
|
|
42
|
+
"mcp": {
|
|
43
|
+
"tools": [
|
|
44
|
+
{
|
|
45
|
+
"name": "dila_convert_chinese_to_western",
|
|
46
|
+
"description": "将中历日期转换为西历日期。输入朝代、年号、年份、月份(可选)、日期(可选),返回对应的西历年月日或年份范围。基于 DILA 佛学规范资料库权威数据。",
|
|
47
|
+
"inputSchema": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"properties": {
|
|
50
|
+
"dynasty": { "type": "string", "description": "朝代名称,如:唐、宋、明、清等" },
|
|
51
|
+
"era_name": { "type": "string", "description": "年号名称,如:贞观、康熙、乾隆等" },
|
|
52
|
+
"year": { "type": "integer", "description": "年号纪年(数字),如 3 代表贞观三年" },
|
|
53
|
+
"month": { "type": "integer", "description": "农历月份(1-12),可选" },
|
|
54
|
+
"day": { "type": "integer", "description": "农历日期(1-30),可选" },
|
|
55
|
+
"month_is_leap": { "type": "boolean", "description": "是否为闰月,可选,默认 false" }
|
|
56
|
+
},
|
|
57
|
+
"required": ["dynasty", "era_name", "year"]
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "dila_search_era_names",
|
|
62
|
+
"description": "根据关键词搜索朝代或年号信息。用于用户在不确定完整年号名称时进行模糊匹配。返回匹配的年号列表及其所属朝代和起止西历年份。",
|
|
63
|
+
"inputSchema": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"properties": {
|
|
66
|
+
"keyword": { "type": "string", "description": "搜索关键词,可以是朝代名或年号名的部分文字" },
|
|
67
|
+
"dynasty": { "type": "string", "description": "限定朝代范围,可选" },
|
|
68
|
+
"limit": { "type": "integer", "description": "返回结果数量上限,默认 10" }
|
|
69
|
+
},
|
|
70
|
+
"required": ["keyword"]
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "dila_lookup_ganzhi_year",
|
|
75
|
+
"description": "通过干支纪年查找对应的西历年份。输入干支组合(如:甲子、乙丑)和可选的朝代限定,返回对应的西历年份列表。",
|
|
76
|
+
"inputSchema": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"properties": {
|
|
79
|
+
"ganzhi": { "type": "string", "description": "干支纪年,如:甲子、乙丑、戊戌等" },
|
|
80
|
+
"dynasty": { "type": "string", "description": "限定朝代范围,可选" }
|
|
81
|
+
},
|
|
82
|
+
"required": ["ganzhi"]
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
}
|