@apocdata-info/mcp-server 0.1.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/CHANGELOG.md +50 -0
- package/LICENSE +191 -0
- package/README.md +230 -0
- package/dist/cache.d.ts +26 -0
- package/dist/cache.js +51 -0
- package/dist/cache.js.map +1 -0
- package/dist/client.js +113 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.js +56 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +259 -0
- package/dist/index.js.map +1 -0
- package/dist/resources.js +229 -0
- package/dist/server.d.ts +20 -0
- package/dist/server.js +69 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/factor-registry.d.ts +17 -0
- package/dist/tools/factor-registry.js +36 -0
- package/dist/tools/factor-registry.js.map +1 -0
- package/dist/tools/index.d.ts +21 -0
- package/dist/tools/index.js +45 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/macro-dashboard.d.ts +17 -0
- package/dist/tools/macro-dashboard.js +30 -0
- package/dist/tools/macro-dashboard.js.map +1 -0
- package/dist/tools/macro-indicator.d.ts +17 -0
- package/dist/tools/macro-indicator.js +45 -0
- package/dist/tools/macro-indicator.js.map +1 -0
- package/dist/tools/quotes-snapshot.d.ts +17 -0
- package/dist/tools/quotes-snapshot.js +39 -0
- package/dist/tools/quotes-snapshot.js.map +1 -0
- package/dist/tools/stock-bars-daily.d.ts +17 -0
- package/dist/tools/stock-bars-daily.js +45 -0
- package/dist/tools/stock-bars-daily.js.map +1 -0
- package/dist/tools/stock-detail.d.ts +17 -0
- package/dist/tools/stock-detail.js +38 -0
- package/dist/tools/stock-detail.js.map +1 -0
- package/dist/tools/stock-financials.d.ts +17 -0
- package/dist/tools/stock-financials.js +36 -0
- package/dist/tools/stock-financials.js.map +1 -0
- package/dist/tools/stock-list.d.ts +17 -0
- package/dist/tools/stock-list.js +39 -0
- package/dist/tools/stock-list.js.map +1 -0
- package/dist/tools/stock-news.d.ts +17 -0
- package/dist/tools/stock-news.js +36 -0
- package/dist/tools/stock-news.js.map +1 -0
- package/dist/tools/stock-quote.d.ts +17 -0
- package/dist/tools/stock-quote.js +32 -0
- package/dist/tools/stock-quote.js.map +1 -0
- package/dist/tools/top10-holders.d.ts +17 -0
- package/dist/tools/top10-holders.js +35 -0
- package/dist/tools/top10-holders.js.map +1 -0
- package/dist/tools/trade-days.d.ts +17 -0
- package/dist/tools/trade-days.js +36 -0
- package/dist/tools/trade-days.js.map +1 -0
- package/dist/tools/types.d.ts +29 -0
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools.js +540 -0
- package/dist/transport.d.ts +44 -0
- package/dist/transport.js +87 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
- package/scripts/client-unit-test.mjs +147 -0
- package/scripts/contract-test.mjs +167 -0
- package/scripts/coverage-test.mjs +126 -0
- package/scripts/error-path-test.mjs +110 -0
- package/scripts/freshness-probe.mjs +144 -0
- package/scripts/integration-test.mjs +284 -0
- package/scripts/mcp-e2e-test.mjs +196 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 天启至数 ApocData - MCP 工具配置表
|
|
3
|
+
*
|
|
4
|
+
* 46 个 /open/data/* 端点的元数据声明。
|
|
5
|
+
* 严格对齐后端 controller @RequestParam 签名(参数名、必填、默认值、上限)。
|
|
6
|
+
*
|
|
7
|
+
* - format=compact 全局 advice 处理,仅对返回 List<Map> 的接口生效,因此只有这类工具暴露 format 参数
|
|
8
|
+
* - fields 字段裁剪仅 financial / announcements 显式支持
|
|
9
|
+
*/
|
|
10
|
+
const SYMBOL_6 = {
|
|
11
|
+
type: 'string',
|
|
12
|
+
description: 'A 股 6 位代码,如 000001(平安银行)、600519(贵州茅台),后端自动补全交易所后缀',
|
|
13
|
+
};
|
|
14
|
+
const FORMAT_COMPACT = {
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: '响应格式:默认 row(行式 JSON),compact 改为列式(columns/rows,节省 60-70% token),仅对返回数组的接口生效',
|
|
17
|
+
enum: ['row', 'compact'],
|
|
18
|
+
};
|
|
19
|
+
const limitParam = (defaultVal, max) => ({
|
|
20
|
+
type: 'integer',
|
|
21
|
+
description: `返回条数,默认 ${defaultVal},最大 ${max}(超出会静默截断,响应头 X-Tdc-Truncated=true)`,
|
|
22
|
+
default: defaultVal,
|
|
23
|
+
});
|
|
24
|
+
/* ===== A. 行情与估值(10 个) ===== */
|
|
25
|
+
const TOOLS_A = [
|
|
26
|
+
{
|
|
27
|
+
name: 'quote',
|
|
28
|
+
path: 'quote',
|
|
29
|
+
description: 'A1 实时行情快照(FREE 套餐延迟 15min)。单只股票最新 OHLC + 量价 + 涨跌幅。用于"现在多少钱"类问题;查多只用 quotes;要财务/股东/公告等多维数据请直接用 profile-full',
|
|
30
|
+
params: { symbol: SYMBOL_6 },
|
|
31
|
+
required: ['symbol'],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'quotes',
|
|
35
|
+
path: 'quotes',
|
|
36
|
+
description: 'A2 批量行情快照。symbols 逗号分隔,最多 10 只(超出截断)',
|
|
37
|
+
params: {
|
|
38
|
+
symbols: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: '股票代码列表,逗号分隔,最多 10 只,如 "000001,600519,688981"',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: ['symbols'],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'daily',
|
|
47
|
+
path: 'daily',
|
|
48
|
+
description: 'A3 日 K 历史(一只股票的多天)。按 limit 取最近 N 条(最多 30),或 start+end(YYYYMMDD)按区间查。要"多只股票一天"的横向排行用 ranking;要"今天涨多少"用 quote',
|
|
49
|
+
params: {
|
|
50
|
+
symbol: SYMBOL_6,
|
|
51
|
+
limit: limitParam(30, 30),
|
|
52
|
+
start: { type: 'string', description: '起始日期 YYYYMMDD,必须与 end 同时给' },
|
|
53
|
+
end: { type: 'string', description: '结束日期 YYYYMMDD' },
|
|
54
|
+
format: FORMAT_COMPACT,
|
|
55
|
+
},
|
|
56
|
+
required: ['symbol'],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'stocks',
|
|
60
|
+
path: 'stocks',
|
|
61
|
+
description: 'A4 股票列表搜索。按名称/代码关键词 q 模糊匹配,可过滤行业/市场,支持游标翻页',
|
|
62
|
+
params: {
|
|
63
|
+
q: { type: 'string', description: '名称或代码关键词,模糊匹配。含中文/特殊字符时必须 URL-encode(本 MCP server 已自动编码;直连 REST API 需用 curl -G --data-url-encode "q=...")' },
|
|
64
|
+
industry: { type: 'string', description: '行业过滤,如 "银行" "白酒"' },
|
|
65
|
+
market: { type: 'string', description: '市场过滤,如 "主板" "科创板" "创业板" "北交所"' },
|
|
66
|
+
limit: limitParam(20, 50),
|
|
67
|
+
cursor: { type: 'string', description: '游标翻页 token,从上次响应取' },
|
|
68
|
+
format: FORMAT_COMPACT,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'stock',
|
|
73
|
+
path: 'stock',
|
|
74
|
+
description: 'A5 股票静态基本信息:name/market/industry/area/list_date/pe/pb/total_mv/circ_mv。**不含**当日行情(用 quote)和 ST 状态(用 st)',
|
|
75
|
+
params: { symbol: SYMBOL_6 },
|
|
76
|
+
required: ['symbol'],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'st',
|
|
80
|
+
path: 'st',
|
|
81
|
+
description: 'A6 ST 状态查询。返回最新 ST/*ST/退市风险状态,正常股 data=null',
|
|
82
|
+
params: { symbol: SYMBOL_6 },
|
|
83
|
+
required: ['symbol'],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'ranking',
|
|
87
|
+
path: 'ranking',
|
|
88
|
+
description: 'A7 涨跌幅排行榜。全市场当日涨跌幅排序',
|
|
89
|
+
params: {
|
|
90
|
+
direction: {
|
|
91
|
+
type: 'string',
|
|
92
|
+
description: 'gain 涨幅榜 / loss 跌幅榜',
|
|
93
|
+
enum: ['gain', 'loss'],
|
|
94
|
+
default: 'gain',
|
|
95
|
+
},
|
|
96
|
+
limit: limitParam(20, 50),
|
|
97
|
+
format: FORMAT_COMPACT,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'indexes',
|
|
102
|
+
path: 'indexes',
|
|
103
|
+
description: 'A8 指数列表搜索。按名称/代码 q 关键词搜索',
|
|
104
|
+
params: {
|
|
105
|
+
q: { type: 'string', description: '指数名/代码关键词,如 "上证" "沪深300"' },
|
|
106
|
+
market: { type: 'string', description: '市场过滤,可选' },
|
|
107
|
+
limit: limitParam(20, 50),
|
|
108
|
+
format: FORMAT_COMPACT,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'index-daily',
|
|
113
|
+
path: 'index-daily',
|
|
114
|
+
description: 'A9 指数日 K。tsCode 是指数代码带后缀,如 000300.SH(沪深300)、000001.SH(上证综指)、399001.SZ(深证成指)',
|
|
115
|
+
params: {
|
|
116
|
+
tsCode: { type: 'string', description: '指数代码,带交易所后缀,如 000300.SH / 399001.SZ' },
|
|
117
|
+
limit: limitParam(30, 30),
|
|
118
|
+
format: FORMAT_COMPACT,
|
|
119
|
+
},
|
|
120
|
+
required: ['tsCode'],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: 'hot-rank',
|
|
124
|
+
path: 'hot-rank',
|
|
125
|
+
description: 'A10 东方财富人气榜(按市场分类)',
|
|
126
|
+
params: {
|
|
127
|
+
type: {
|
|
128
|
+
type: 'string',
|
|
129
|
+
description: '市场类型',
|
|
130
|
+
enum: ['A股市场', 'ETF基金', '港股市场', '美股市场'],
|
|
131
|
+
default: 'A股市场',
|
|
132
|
+
},
|
|
133
|
+
limit: limitParam(30, 50),
|
|
134
|
+
format: FORMAT_COMPACT,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
/* ===== B. 财务与股东(8 个) ===== */
|
|
139
|
+
const TOOLS_B = [
|
|
140
|
+
{
|
|
141
|
+
name: 'financial',
|
|
142
|
+
path: 'financial',
|
|
143
|
+
description: 'B1 财务摘要。最近 limit 期(最多 4 期)。fields 可选字段白名单节省 token,如 fields=roe,revenue,net_profit',
|
|
144
|
+
params: {
|
|
145
|
+
symbol: SYMBOL_6,
|
|
146
|
+
reportType: { type: 'string', description: '报告期类型,如 "annual" 年报、"q1" 一季报;不传返回最近期次' },
|
|
147
|
+
limit: limitParam(4, 4),
|
|
148
|
+
fields: { type: 'string', description: '字段白名单,逗号分隔,仅返回这些字段' },
|
|
149
|
+
format: FORMAT_COMPACT,
|
|
150
|
+
},
|
|
151
|
+
required: ['symbol'],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'express',
|
|
155
|
+
path: 'express',
|
|
156
|
+
description: 'B2 业绩快报(仅季报披露窗口期约 1 个月有数据)',
|
|
157
|
+
params: { symbol: SYMBOL_6, limit: limitParam(4, 8), format: FORMAT_COMPACT },
|
|
158
|
+
required: ['symbol'],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: 'dividend',
|
|
162
|
+
path: 'dividend',
|
|
163
|
+
description: 'B3 分红送配。最近 limit 条记录(最多 20)',
|
|
164
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 20), format: FORMAT_COMPACT },
|
|
165
|
+
required: ['symbol'],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'holders',
|
|
169
|
+
path: 'holders',
|
|
170
|
+
description: 'B4 十大股东(最新一期)。holderCategory 可选过滤股东类型',
|
|
171
|
+
params: {
|
|
172
|
+
symbol: SYMBOL_6,
|
|
173
|
+
holderCategory: { type: 'string', description: '股东类型过滤,可选' },
|
|
174
|
+
format: FORMAT_COMPACT,
|
|
175
|
+
},
|
|
176
|
+
required: ['symbol'],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'holder-number',
|
|
180
|
+
path: 'holder-number',
|
|
181
|
+
description: 'B5 股东户数变化。最近 limit 期(最多 20)',
|
|
182
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 20), format: FORMAT_COMPACT },
|
|
183
|
+
required: ['symbol'],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
name: 'share-float',
|
|
187
|
+
path: 'share-float',
|
|
188
|
+
description: 'B6 限售解禁。最近 limit 条(最多 20)',
|
|
189
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 20), format: FORMAT_COMPACT },
|
|
190
|
+
required: ['symbol'],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
name: 'repurchase',
|
|
194
|
+
path: 'repurchase',
|
|
195
|
+
description: 'B7 股票回购。最近 limit 条(最多 20)',
|
|
196
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 20), format: FORMAT_COMPACT },
|
|
197
|
+
required: ['symbol'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: 'block-trade',
|
|
201
|
+
path: 'block-trade',
|
|
202
|
+
description: 'B8 大宗交易。按 symbol 查最近 limit 条(最多 30)。部分小盘股空返回属正常',
|
|
203
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 30), format: FORMAT_COMPACT },
|
|
204
|
+
required: ['symbol'],
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
/* ===== C. 资金流向(8 个,含港股日K) ===== */
|
|
208
|
+
const TOOLS_C = [
|
|
209
|
+
{
|
|
210
|
+
name: 'moneyflow',
|
|
211
|
+
path: 'moneyflow',
|
|
212
|
+
description: 'C1 个股资金流。超大/大/中/小单买卖额、净流入。最近 limit 条(最多 30)',
|
|
213
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 30), format: FORMAT_COMPACT },
|
|
214
|
+
required: ['symbol'],
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: 'hsgt',
|
|
218
|
+
path: 'hsgt',
|
|
219
|
+
description: 'C2 沪深港通资金流(北向/南向汇总)。最近 limit 个交易日(最多 30)',
|
|
220
|
+
params: { limit: limitParam(10, 30), format: FORMAT_COMPACT },
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'hk-hold',
|
|
224
|
+
path: 'hk-hold',
|
|
225
|
+
description: 'C3 沪深港通持股(按 A 股 symbol 查北向持仓变化)。最近 limit 条(最多 30)',
|
|
226
|
+
params: { symbol: SYMBOL_6, limit: limitParam(10, 30), format: FORMAT_COMPACT },
|
|
227
|
+
required: ['symbol'],
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: 'hk-daily',
|
|
231
|
+
path: 'hk-daily',
|
|
232
|
+
description: 'C3b 港股日 K。tsCode 格式如 00700.HK(腾讯)。数据稀疏,热门股也可能空返回',
|
|
233
|
+
params: {
|
|
234
|
+
tsCode: { type: 'string', description: '港股代码带后缀,如 00700.HK / 09988.HK' },
|
|
235
|
+
limit: limitParam(30, 30),
|
|
236
|
+
format: FORMAT_COMPACT,
|
|
237
|
+
},
|
|
238
|
+
required: ['tsCode'],
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
name: 'margin',
|
|
242
|
+
path: 'margin',
|
|
243
|
+
description: 'C4 融资融券汇总。可按交易所过滤',
|
|
244
|
+
params: {
|
|
245
|
+
exchange: {
|
|
246
|
+
type: 'string',
|
|
247
|
+
description: '交易所过滤',
|
|
248
|
+
enum: ['SSE', 'SZSE', 'BSE'],
|
|
249
|
+
},
|
|
250
|
+
limit: limitParam(10, 30),
|
|
251
|
+
format: FORMAT_COMPACT,
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
name: 'dragon-tiger',
|
|
256
|
+
path: 'dragon-tiger',
|
|
257
|
+
description: 'C5 龙虎榜。传 symbol 查个股上榜历史;否则查 date(YYYYMMDD,缺省最新交易日)当日榜单',
|
|
258
|
+
params: {
|
|
259
|
+
symbol: { type: 'string', description: 'A 股 6 位代码,可选' },
|
|
260
|
+
date: { type: 'string', description: '交易日 YYYYMMDD,缺省最新交易日' },
|
|
261
|
+
limit: limitParam(30, 50),
|
|
262
|
+
format: FORMAT_COMPACT,
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'hot-money',
|
|
267
|
+
path: 'hot-money',
|
|
268
|
+
description: 'C6 游资名录(**席位列表本身**,知名游资营业部清单)。要某游资的具体买卖记录用 hot-money-detail',
|
|
269
|
+
params: { limit: limitParam(50, 50), format: FORMAT_COMPACT },
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
name: 'hot-money-detail',
|
|
273
|
+
path: 'hot-money-detail',
|
|
274
|
+
description: 'C7 游资交易明细。**按股票或日期查**:传 symbol 查个股被游资买卖记录;否则查 date 当日全市场明细。注意参数是 symbol/date,不是游资名',
|
|
275
|
+
params: {
|
|
276
|
+
symbol: { type: 'string', description: 'A 股 6 位代码,可选' },
|
|
277
|
+
date: { type: 'string', description: '交易日 YYYYMMDD,缺省最新交易日' },
|
|
278
|
+
limit: limitParam(30, 50),
|
|
279
|
+
format: FORMAT_COMPACT,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
];
|
|
283
|
+
/* ===== D. 涨跌停与板块(4 个) ===== */
|
|
284
|
+
const TOOLS_D = [
|
|
285
|
+
{
|
|
286
|
+
name: 'limit-list',
|
|
287
|
+
path: 'limit-list',
|
|
288
|
+
description: 'D1 涨跌停池。某交易日涨停/跌停/炸板个股',
|
|
289
|
+
params: {
|
|
290
|
+
kind: {
|
|
291
|
+
type: 'string',
|
|
292
|
+
description: 'U 涨停 / D 跌停 / Z 炸板',
|
|
293
|
+
enum: ['U', 'D', 'Z'],
|
|
294
|
+
default: 'U',
|
|
295
|
+
},
|
|
296
|
+
date: { type: 'string', description: '交易日 YYYYMMDD,缺省最新交易日' },
|
|
297
|
+
limit: limitParam(30, 50),
|
|
298
|
+
format: FORMAT_COMPACT,
|
|
299
|
+
},
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
name: 'limit-step',
|
|
303
|
+
path: 'limit-step',
|
|
304
|
+
description: 'D2 连板天梯。某交易日连板个股按连板数降序',
|
|
305
|
+
params: {
|
|
306
|
+
date: { type: 'string', description: '交易日 YYYYMMDD,缺省最新交易日' },
|
|
307
|
+
limit: limitParam(30, 50),
|
|
308
|
+
format: FORMAT_COMPACT,
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
name: 'sector-flow',
|
|
313
|
+
path: 'sector-flow',
|
|
314
|
+
description: 'D3 板块资金流榜。最新交易日板块资金流排行',
|
|
315
|
+
params: {
|
|
316
|
+
type: {
|
|
317
|
+
type: 'string',
|
|
318
|
+
description: 'industry 行业 / concept 概念 / region 地域(兼容中文别名)',
|
|
319
|
+
enum: ['industry', 'concept', 'region'],
|
|
320
|
+
default: 'industry',
|
|
321
|
+
},
|
|
322
|
+
limit: limitParam(20, 50),
|
|
323
|
+
format: FORMAT_COMPACT,
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'cyq-perf',
|
|
328
|
+
path: 'cyq-perf',
|
|
329
|
+
description: 'D4 筹码分布及胜率。最近 limit 条(最多 20)',
|
|
330
|
+
params: { symbol: SYMBOL_6, limit: limitParam(5, 20), format: FORMAT_COMPACT },
|
|
331
|
+
required: ['symbol'],
|
|
332
|
+
},
|
|
333
|
+
];
|
|
334
|
+
/* ===== E. 公告/新闻/调研(3 个) ===== */
|
|
335
|
+
const TOOLS_E = [
|
|
336
|
+
{
|
|
337
|
+
name: 'announcements',
|
|
338
|
+
path: 'announcements',
|
|
339
|
+
description: 'E1 公司**正式公告**(交易所披露)。支持区间/类型/关键字过滤:startDate+endDate(YYYYMMDD 区间)、category(精确类型)、q(标题模糊)。**列表浏览**用 includeContent=false 跳过正文省 80% token;**全文阅读**用默认 includeContent=true + fields 精挑。最权威但更新慢。',
|
|
340
|
+
params: {
|
|
341
|
+
symbol: SYMBOL_6,
|
|
342
|
+
startDate: { type: 'string', description: '起始日 YYYYMMDD(按 ann_date 过滤),可选' },
|
|
343
|
+
endDate: { type: 'string', description: '结束日 YYYYMMDD(按 ann_date 过滤),可选' },
|
|
344
|
+
category: { type: 'string', description: '公告类型精确匹配,如 annual_report / quarterly / dividend / governance(取决于数据源 category 字段)' },
|
|
345
|
+
q: { type: 'string', description: '标题关键字模糊搜索(不走 content 全文,避免性能问题)' },
|
|
346
|
+
limit: limitParam(5, 30),
|
|
347
|
+
includeContent: {
|
|
348
|
+
type: 'boolean',
|
|
349
|
+
description: '默认 true 返回 content Markdown 全文(可能 5-10KB/条);false 仅返元数据 + summary(列表场景用)',
|
|
350
|
+
default: true,
|
|
351
|
+
},
|
|
352
|
+
fields: { type: 'string', description: '字段白名单,逗号分隔,如 title,summary,ann_date' },
|
|
353
|
+
format: FORMAT_COMPACT,
|
|
354
|
+
},
|
|
355
|
+
required: ['symbol'],
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'survey',
|
|
359
|
+
path: 'survey',
|
|
360
|
+
description: 'E3 机构调研。最近 limit 条(最多 10)。小盘股或冷门股可能长期无机构调研',
|
|
361
|
+
params: { symbol: SYMBOL_6, limit: limitParam(5, 10), format: FORMAT_COMPACT },
|
|
362
|
+
required: ['symbol'],
|
|
363
|
+
},
|
|
364
|
+
];
|
|
365
|
+
/* ===== F. 板块成分(4 个) ===== */
|
|
366
|
+
const TOOLS_F = [
|
|
367
|
+
{
|
|
368
|
+
name: 'concepts',
|
|
369
|
+
path: 'concepts',
|
|
370
|
+
description: 'F1 东方财富**概念板块**目录(如"人工智能""半导体")。要行业 + 概念混合的同花顺版本用 ths-boards',
|
|
371
|
+
params: {
|
|
372
|
+
q: { type: 'string', description: '名称关键词,可选' },
|
|
373
|
+
limit: limitParam(30, 50),
|
|
374
|
+
format: FORMAT_COMPACT,
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: 'concept-stocks',
|
|
379
|
+
path: 'concept-stocks',
|
|
380
|
+
description: 'F2 东财概念成分股。themeCode 形如 000894.DC(从 concepts 接口获取)',
|
|
381
|
+
params: {
|
|
382
|
+
themeCode: { type: 'string', description: '概念代码,如 000894.DC,从 concepts 接口取' },
|
|
383
|
+
limit: limitParam(50, 50),
|
|
384
|
+
format: FORMAT_COMPACT,
|
|
385
|
+
},
|
|
386
|
+
required: ['themeCode'],
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
name: 'ths-boards',
|
|
390
|
+
path: 'ths-boards',
|
|
391
|
+
description: 'F3 同花顺板块(**行业指数 + 概念指数**两种都有)。只要东财概念用 concepts',
|
|
392
|
+
params: {
|
|
393
|
+
q: { type: 'string', description: '名称或代码关键词,可选' },
|
|
394
|
+
limit: limitParam(30, 50),
|
|
395
|
+
format: FORMAT_COMPACT,
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
name: 'ths-board-stocks',
|
|
400
|
+
path: 'ths-board-stocks',
|
|
401
|
+
description: 'F4 同花顺板块成分股。tsCode 形如 886108.TI(从 ths-boards 接口获取)',
|
|
402
|
+
params: {
|
|
403
|
+
tsCode: { type: 'string', description: '板块代码,如 886108.TI,从 ths-boards 接口取' },
|
|
404
|
+
limit: limitParam(50, 50),
|
|
405
|
+
format: FORMAT_COMPACT,
|
|
406
|
+
},
|
|
407
|
+
required: ['tsCode'],
|
|
408
|
+
},
|
|
409
|
+
];
|
|
410
|
+
/* ===== G. 可转债(2 个) ===== */
|
|
411
|
+
const TOOLS_G = [
|
|
412
|
+
{
|
|
413
|
+
name: 'convertible-bonds',
|
|
414
|
+
path: 'convertible-bonds',
|
|
415
|
+
description: 'G1 可转债列表。可按债券简称/代码 q 搜索,或按正股 stkCode 反查',
|
|
416
|
+
params: {
|
|
417
|
+
q: { type: 'string', description: '债券简称或代码关键词,可选' },
|
|
418
|
+
stkCode: { type: 'string', description: '正股代码,可选(反查正股发行的可转债)' },
|
|
419
|
+
limit: limitParam(20, 50),
|
|
420
|
+
format: FORMAT_COMPACT,
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
name: 'cb-price-chg',
|
|
425
|
+
path: 'cb-price-chg',
|
|
426
|
+
description: 'G2 可转债转股价变动。tsCode 形如 127026.SZ',
|
|
427
|
+
params: {
|
|
428
|
+
tsCode: { type: 'string', description: '可转债代码带后缀,如 127026.SZ' },
|
|
429
|
+
limit: limitParam(10, 20),
|
|
430
|
+
format: FORMAT_COMPACT,
|
|
431
|
+
},
|
|
432
|
+
required: ['tsCode'],
|
|
433
|
+
},
|
|
434
|
+
];
|
|
435
|
+
/* ===== H. 因子(2 个) ===== */
|
|
436
|
+
const TOOLS_H = [
|
|
437
|
+
{
|
|
438
|
+
name: 'factors',
|
|
439
|
+
path: 'factors',
|
|
440
|
+
description: 'H1 量化因子**全量注册表**(154 个因子的脱敏元数据)。要按 11 个 event_type 业务分类查看用 factor-categories;要某股票的技术指标值用 tech-factor',
|
|
441
|
+
params: { format: FORMAT_COMPACT },
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
name: 'tech-factor',
|
|
445
|
+
path: 'tech-factor',
|
|
446
|
+
description: 'H2 技术面因子。MACD/KDJ/RSI/BOLL/MA 等,前复权。最近 limit 条(最多 10)',
|
|
447
|
+
params: { symbol: SYMBOL_6, limit: limitParam(1, 10), format: FORMAT_COMPACT },
|
|
448
|
+
required: ['symbol'],
|
|
449
|
+
},
|
|
450
|
+
];
|
|
451
|
+
/* ===== I. 宏观(3 个) ===== */
|
|
452
|
+
const TOOLS_I = [
|
|
453
|
+
{
|
|
454
|
+
name: 'macro',
|
|
455
|
+
path: 'macro',
|
|
456
|
+
description: 'I1 宏观指标**历史多期**(默认 12 期,最多 12)。type 仅支持 GDP/CPI/PPI/PMI。只要最新值用 macro-latest;要指标定义用 macro-definition',
|
|
457
|
+
params: {
|
|
458
|
+
type: {
|
|
459
|
+
type: 'string',
|
|
460
|
+
description: '指标 type',
|
|
461
|
+
enum: ['GDP', 'CPI', 'PPI', 'PMI'],
|
|
462
|
+
},
|
|
463
|
+
limit: limitParam(12, 12),
|
|
464
|
+
format: FORMAT_COMPACT,
|
|
465
|
+
},
|
|
466
|
+
required: ['type'],
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
name: 'macro-latest',
|
|
470
|
+
path: 'macro/latest',
|
|
471
|
+
description: 'I2 宏观指标最新值(盘中实时缓存 5s)',
|
|
472
|
+
params: {
|
|
473
|
+
type: {
|
|
474
|
+
type: 'string',
|
|
475
|
+
description: '指标 type',
|
|
476
|
+
enum: ['GDP', 'CPI', 'PPI', 'PMI'],
|
|
477
|
+
},
|
|
478
|
+
},
|
|
479
|
+
required: ['type'],
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
name: 'macro-definition',
|
|
483
|
+
path: 'macro/definition',
|
|
484
|
+
description: 'I3 宏观指标定义(名称/单位/频率/说明)',
|
|
485
|
+
params: {
|
|
486
|
+
type: {
|
|
487
|
+
type: 'string',
|
|
488
|
+
description: '指标 type',
|
|
489
|
+
enum: ['GDP', 'CPI', 'PPI', 'PMI'],
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
required: ['type'],
|
|
493
|
+
},
|
|
494
|
+
];
|
|
495
|
+
/* ===== J. 日历(1 个) ===== */
|
|
496
|
+
const TOOLS_J = [
|
|
497
|
+
{
|
|
498
|
+
name: 'calendar',
|
|
499
|
+
path: 'calendar',
|
|
500
|
+
description: 'J1 交易日历。区间内 A 股交易日列表,跨度最多 366 天,start/end 缺省查当年至今。默认返回 List<string>(向后兼容);传 detail=true 返回 List<{trade_date, pretrade_date}>,方便算"上一交易日"',
|
|
501
|
+
params: {
|
|
502
|
+
start: { type: 'string', description: '起始日 YYYYMMDD,可选' },
|
|
503
|
+
end: { type: 'string', description: '结束日 YYYYMMDD,可选' },
|
|
504
|
+
detail: {
|
|
505
|
+
type: 'boolean',
|
|
506
|
+
description: '默认 false 返回简单日期数组;true 返回带 pretrade_date 的 Map 列表(区间内首日 pretrade_date 为 null)',
|
|
507
|
+
default: false,
|
|
508
|
+
},
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
];
|
|
512
|
+
/* ===== K. 综合(2 个) ===== */
|
|
513
|
+
const TOOLS_K = [
|
|
514
|
+
{
|
|
515
|
+
name: 'profile-full',
|
|
516
|
+
path: 'profile/full',
|
|
517
|
+
description: 'K1 **个股综合画像(推荐用于多维分析)**。一次并发返回 8 维:basic/quote/financial(4期)/tech-factor/cyq-perf/moneyflow(5日)/hk-hold(5日)/announcements(3条)。等价于 8 接口串行调用但延时减 60%+,token 利用率最大化。**只要单个维度数据时不要用这个**(用对应单接口节省 token)',
|
|
518
|
+
params: { symbol: SYMBOL_6 },
|
|
519
|
+
required: ['symbol'],
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
name: 'factor-categories',
|
|
523
|
+
path: 'factor-categories',
|
|
524
|
+
description: 'K2 量化因子分类目录。11 个 event_type 业务分类的说明 + 因子数量统计。配合 factors 使用',
|
|
525
|
+
params: { format: FORMAT_COMPACT },
|
|
526
|
+
},
|
|
527
|
+
];
|
|
528
|
+
export const ALL_TOOLS = [
|
|
529
|
+
...TOOLS_A,
|
|
530
|
+
...TOOLS_B,
|
|
531
|
+
...TOOLS_C,
|
|
532
|
+
...TOOLS_D,
|
|
533
|
+
...TOOLS_E,
|
|
534
|
+
...TOOLS_F,
|
|
535
|
+
...TOOLS_G,
|
|
536
|
+
...TOOLS_H,
|
|
537
|
+
...TOOLS_I,
|
|
538
|
+
...TOOLS_J,
|
|
539
|
+
...TOOLS_K,
|
|
540
|
+
];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
*
|
|
14
|
+
* @author Chill
|
|
15
|
+
*/
|
|
16
|
+
import { AxiosInstance } from "axios";
|
|
17
|
+
import type { TdcResponse } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* 创建带嵌入式 API Key 的 axios 实例。
|
|
20
|
+
* 从 process.env.TQ_API_KEY 读 Key;无 Key 直接 throw(MCP 启动失败,Agent 用户能看到)。
|
|
21
|
+
* 从 process.env.TQ_API_BASE 读 gateway 地址(默认 http://localhost:9001)。
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTransport(): AxiosInstance;
|
|
24
|
+
/**
|
|
25
|
+
* 调用 /v1/** 数据面端点,自动解 TdcResponse 信封 + 错误翻译。
|
|
26
|
+
*/
|
|
27
|
+
export declare function callDataPlane<T>(client: AxiosInstance, path: string, params?: Record<string, unknown>): Promise<{
|
|
28
|
+
data?: T;
|
|
29
|
+
meta?: TdcResponse<T>["meta"];
|
|
30
|
+
error?: {
|
|
31
|
+
code: string;
|
|
32
|
+
message: string;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* 调用 /portal/**, /admin/** 等走 R<T> 信封的端点(本期不用,留接口给 P5-Agent-4)。
|
|
37
|
+
*/
|
|
38
|
+
export declare function callBladeR<T>(client: AxiosInstance, path: string, params?: Record<string, unknown>): Promise<{
|
|
39
|
+
data?: T;
|
|
40
|
+
error?: {
|
|
41
|
+
code: string;
|
|
42
|
+
message: string;
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
*
|
|
14
|
+
* @author Chill
|
|
15
|
+
*/
|
|
16
|
+
import axios from "axios";
|
|
17
|
+
import { translateError } from "./errors.js";
|
|
18
|
+
const VERSION = "0.1.0";
|
|
19
|
+
/**
|
|
20
|
+
* 创建带嵌入式 API Key 的 axios 实例。
|
|
21
|
+
* 从 process.env.TQ_API_KEY 读 Key;无 Key 直接 throw(MCP 启动失败,Agent 用户能看到)。
|
|
22
|
+
* 从 process.env.TQ_API_BASE 读 gateway 地址(默认 http://localhost:9001)。
|
|
23
|
+
*/
|
|
24
|
+
export function createTransport() {
|
|
25
|
+
const apiKey = process.env.TQ_API_KEY;
|
|
26
|
+
if (!apiKey) {
|
|
27
|
+
throw new Error("缺少 TQ_API_KEY 环境变量,请在 Claude Desktop 的 mcpServers 配置中设置");
|
|
28
|
+
}
|
|
29
|
+
const baseURL = process.env.TQ_API_BASE ?? "http://localhost:9001";
|
|
30
|
+
return axios.create({
|
|
31
|
+
baseURL,
|
|
32
|
+
headers: {
|
|
33
|
+
"X-API-Key": apiKey,
|
|
34
|
+
"User-Agent": `tianqi-mcp/${VERSION}`,
|
|
35
|
+
},
|
|
36
|
+
timeout: 30_000,
|
|
37
|
+
validateStatus: () => true,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 调用 /v1/** 数据面端点,自动解 TdcResponse 信封 + 错误翻译。
|
|
42
|
+
*/
|
|
43
|
+
export async function callDataPlane(client, path, params) {
|
|
44
|
+
try {
|
|
45
|
+
const res = await client.get(path, { params });
|
|
46
|
+
if (res.status >= 200 && res.status < 300) {
|
|
47
|
+
const body = res.data;
|
|
48
|
+
if (body.error) {
|
|
49
|
+
return { error: translateError({ backendCode: body.error.code, backendMessage: body.error.message }) };
|
|
50
|
+
}
|
|
51
|
+
return { data: body.data, meta: body.meta };
|
|
52
|
+
}
|
|
53
|
+
const body = res.data;
|
|
54
|
+
return {
|
|
55
|
+
error: translateError({
|
|
56
|
+
httpStatus: res.status,
|
|
57
|
+
backendCode: body?.error?.code,
|
|
58
|
+
backendMessage: body?.error?.message,
|
|
59
|
+
}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
const ae = e;
|
|
64
|
+
return {
|
|
65
|
+
error: translateError({
|
|
66
|
+
httpStatus: ae.response?.status,
|
|
67
|
+
cause: e,
|
|
68
|
+
backendMessage: ae.message,
|
|
69
|
+
}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 调用 /portal/**, /admin/** 等走 R<T> 信封的端点(本期不用,留接口给 P5-Agent-4)。
|
|
75
|
+
*/
|
|
76
|
+
export async function callBladeR(client, path, params) {
|
|
77
|
+
const res = await client.get(path, { params });
|
|
78
|
+
if (res.status >= 200 && res.status < 300 && res.data.success) {
|
|
79
|
+
return { data: res.data.data };
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
error: translateError({
|
|
83
|
+
httpStatus: res.status,
|
|
84
|
+
backendMessage: res.data?.msg,
|
|
85
|
+
}),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|