timarai-dashboard-mcp 1.0.3
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 +105 -0
- package/README.md +266 -0
- package/dist/charts/build.js +130 -0
- package/dist/charts/build.js.map +1 -0
- package/dist/charts/format.js +101 -0
- package/dist/charts/format.js.map +1 -0
- package/dist/charts/specs.js +708 -0
- package/dist/charts/specs.js.map +1 -0
- package/dist/charts/svg.js +371 -0
- package/dist/charts/svg.js.map +1 -0
- package/dist/client.js +284 -0
- package/dist/client.js.map +1 -0
- package/dist/config.js +164 -0
- package/dist/config.js.map +1 -0
- package/dist/date-range.js +190 -0
- package/dist/date-range.js.map +1 -0
- package/dist/format.js +369 -0
- package/dist/format.js.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/output.js +46 -0
- package/dist/output.js.map +1 -0
- package/dist/registry.js +231 -0
- package/dist/registry.js.map +1 -0
- package/dist/reports/html.js +84 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/templates.js +113 -0
- package/dist/reports/templates.js.map +1 -0
- package/dist/resources.js +265 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.js +588 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.js +344 -0
- package/dist/setup.js.map +1 -0
- package/dist/signature.js +35 -0
- package/dist/signature.js.map +1 -0
- package/docs/CAPABILITIES.md +275 -0
- package/docs/CONTRACT.md +170 -0
- package/docs/DESIGN.md +367 -0
- package/docs/DISTRIBUTION.md +214 -0
- package/docs/VERIFICATION.md +120 -0
- package/package.json +42 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP 工具面。
|
|
3
|
+
*
|
|
4
|
+
* 设计原则:**不为 23 个路由做 1:1 映射**。
|
|
5
|
+
* 工具按「Agent 会怎么问」聚合,用 subject 枚举收敛到具体路由:
|
|
6
|
+
* - 工具数量少 → 选工具准确率高、上下文占用低
|
|
7
|
+
* - description 直接写清「什么时候用 / 不用」→ 减少误调用
|
|
8
|
+
* - 保留 1 个 call_endpoint 逃生阀 → 接口新增路由而工具面未更新时不至于卡死
|
|
9
|
+
*/
|
|
10
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { createRequire } from "node:module";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { renderError, renderPayload } from "./format.js";
|
|
14
|
+
import { buildChart, cabinHeading } from "./charts/build.js";
|
|
15
|
+
import { CHART_SPECS, getChartSpec } from "./charts/specs.js";
|
|
16
|
+
import { buildReportHtml, reportFooter } from "./reports/html.js";
|
|
17
|
+
import { REPORT_TEMPLATES, getReportTemplate } from "./reports/templates.js";
|
|
18
|
+
import { resolveOutputDir, slug, writeArtifact } from "./output.js";
|
|
19
|
+
import { ENDPOINTS, SUBJECT_MAP, getEndpointById, getEndpointByPath, } from "./registry.js";
|
|
20
|
+
import { DATE_PRESETS, DateRangeError, resolveDateRange } from "./date-range.js";
|
|
21
|
+
import { ENDPOINT_REFERENCE_HEADER, FIELD_GLOSSARY, LIMITS_AND_PRACTICES, chartCatalogMarkdown, endpointTableMarkdown, } from "./resources.js";
|
|
22
|
+
const READ_ONLY = {
|
|
23
|
+
readOnlyHint: true,
|
|
24
|
+
destructiveHint: false,
|
|
25
|
+
idempotentHint: true,
|
|
26
|
+
openWorldHint: true,
|
|
27
|
+
};
|
|
28
|
+
const dateRangeShape = {
|
|
29
|
+
preset: z
|
|
30
|
+
.enum(DATE_PRESETS)
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("相对日期预设;显式给出 startDate/endDate 时忽略本项。默认 last_7d。"),
|
|
33
|
+
startDate: z
|
|
34
|
+
.string()
|
|
35
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, "必须为 YYYY-MM-DD")
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("开始日期,报表时区 Asia/Shanghai。"),
|
|
38
|
+
endDate: z
|
|
39
|
+
.string()
|
|
40
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, "必须为 YYYY-MM-DD")
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("结束日期,报表时区 Asia/Shanghai。跨度不超过 90 天。"),
|
|
43
|
+
};
|
|
44
|
+
const filterShape = {
|
|
45
|
+
businessTypes: z.array(z.string()).optional().describe("业务类型筛选,取值见 dashboard_filters。"),
|
|
46
|
+
merchantId: z.string().uuid().optional().describe("商户 GUID 筛选。"),
|
|
47
|
+
channelCodes: z.array(z.string()).optional().describe("渠道编码筛选。"),
|
|
48
|
+
currencies: z
|
|
49
|
+
.array(z.string())
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("原币种筛选。**未收敛到单一币种时,金额不可跨币种相加**。"),
|
|
52
|
+
accountTypes: z.array(z.string()).optional().describe("账户类型筛选。"),
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* 排行类路由的可选入参。
|
|
56
|
+
*
|
|
57
|
+
* `topN`:榜单条数(1~50,默认 10)。不传即走接口默认,保持向后一致。
|
|
58
|
+
* ⚠️ **在「按币种拆行之后」做全局截断**:多币种下 `topN=1` 只返回 1 行
|
|
59
|
+
* (例如只有 summer7/USD),**不是**「每个币种各取前 1 行」。接口侧已确认此语义,
|
|
60
|
+
* 要「每币种 TopN」需另开参数(如 `perCurrencyTopN`),目前没有。
|
|
61
|
+
* 因此用 `topN` 前先想清楚要不要传 `currencies`。
|
|
62
|
+
* `page` / `pageSize`:翻页,响应带 `total` 便于判断是否还有下一页。
|
|
63
|
+
* 二者语义不同——`topN=20` 是「只要前 20 条」,`page=2&pageSize=20` 是「跳过前 20 条」。
|
|
64
|
+
*
|
|
65
|
+
* `granularity` 只放行 `day`:实测 `hour` 会被接口以 400 明确拒绝(白名单提示 Arg... day)。
|
|
66
|
+
* 这比之前的「静默忽略 / 500」好得多,但仍然不能用,所以枚举不放宽。
|
|
67
|
+
*/
|
|
68
|
+
const topShape = {
|
|
69
|
+
topN: z
|
|
70
|
+
.number()
|
|
71
|
+
.int()
|
|
72
|
+
.min(1)
|
|
73
|
+
.max(50)
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("榜单条数,1~50;不传则由接口决定(默认 10)。与 page/pageSize 二选一。"),
|
|
76
|
+
page: z.number().int().min(1).optional().describe("页码,从 1 开始;配合 pageSize 翻页。"),
|
|
77
|
+
pageSize: z
|
|
78
|
+
.number()
|
|
79
|
+
.int()
|
|
80
|
+
.min(1)
|
|
81
|
+
.max(50)
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("每页条数,1~50;响应里的 total 是满足条件的总条数,用于判断是否还有下一页。"),
|
|
84
|
+
granularity: z
|
|
85
|
+
.enum(["day"])
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("统计粒度,当前仅支持 day(日粒度)。"),
|
|
88
|
+
};
|
|
89
|
+
const outputShape = {
|
|
90
|
+
format: z
|
|
91
|
+
.enum(["markdown", "json"])
|
|
92
|
+
.default("markdown")
|
|
93
|
+
.describe("markdown 更省上下文;需要字段级完整结构时用 json。"),
|
|
94
|
+
maxRows: z
|
|
95
|
+
.number()
|
|
96
|
+
.int()
|
|
97
|
+
.min(1)
|
|
98
|
+
.max(500)
|
|
99
|
+
.default(60)
|
|
100
|
+
.describe("序列类数据的最大行数,超出等距抽样并注明。"),
|
|
101
|
+
};
|
|
102
|
+
function buildRequestBody(args, maxSpanDays) {
|
|
103
|
+
const range = resolveDateRange({
|
|
104
|
+
preset: args.preset,
|
|
105
|
+
startDate: args.startDate,
|
|
106
|
+
endDate: args.endDate,
|
|
107
|
+
maxSpanDays,
|
|
108
|
+
});
|
|
109
|
+
const body = {
|
|
110
|
+
startDate: range.startDate,
|
|
111
|
+
endDate: range.endDate,
|
|
112
|
+
};
|
|
113
|
+
if (args.businessTypes?.length)
|
|
114
|
+
body.businessTypes = args.businessTypes;
|
|
115
|
+
if (args.merchantId)
|
|
116
|
+
body.merchantId = args.merchantId;
|
|
117
|
+
if (args.channelCodes?.length)
|
|
118
|
+
body.channelCodes = args.channelCodes;
|
|
119
|
+
if (args.currencies?.length)
|
|
120
|
+
body.currencies = args.currencies;
|
|
121
|
+
if (args.accountTypes?.length)
|
|
122
|
+
body.accountTypes = args.accountTypes;
|
|
123
|
+
if (args.topN !== undefined)
|
|
124
|
+
body.topN = args.topN;
|
|
125
|
+
if (args.page !== undefined)
|
|
126
|
+
body.page = args.page;
|
|
127
|
+
if (args.pageSize !== undefined)
|
|
128
|
+
body.pageSize = args.pageSize;
|
|
129
|
+
if (args.granularity)
|
|
130
|
+
body.granularity = args.granularity;
|
|
131
|
+
return body;
|
|
132
|
+
}
|
|
133
|
+
function footnote(meta, args) {
|
|
134
|
+
return [
|
|
135
|
+
"",
|
|
136
|
+
"---",
|
|
137
|
+
`来源:\`${meta.path}\` | requestId:\`${meta.requestId}\` | 耗时:${meta.elapsedMs}ms`,
|
|
138
|
+
args.startDate || args.endDate || args.preset
|
|
139
|
+
? `日期:${String(buildRequestBody(args, 90).startDate)} ~ ${String(buildRequestBody(args, 90).endDate)}(${args.preset ?? "explicit"})`
|
|
140
|
+
: null,
|
|
141
|
+
]
|
|
142
|
+
.filter(Boolean)
|
|
143
|
+
.join("\n");
|
|
144
|
+
}
|
|
145
|
+
async function executeQuery(client, cfg, endpointId, args) {
|
|
146
|
+
const spec = getEndpointById(endpointId);
|
|
147
|
+
if (!spec) {
|
|
148
|
+
return { isError: true, content: [{ type: "text", text: `❌ 未登记的路由:${endpointId}` }] };
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const body = buildRequestBody(args, cfg.TIMARAI_MAX_DATE_SPAN_DAYS);
|
|
152
|
+
const result = await client.call(spec, body);
|
|
153
|
+
const rendered = renderPayload(result.data, {
|
|
154
|
+
format: args.format ?? "markdown",
|
|
155
|
+
maxRows: args.maxRows ?? 60,
|
|
156
|
+
// 金额排行类响应不带 currency 字段,只能靠路由名单补这条提示。
|
|
157
|
+
endpointPath: spec.path,
|
|
158
|
+
});
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: "text", text: `${spec.summary}\n\n${rendered.text}${footnote(result.meta, args)}` }],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const extra = error instanceof DateRangeError
|
|
165
|
+
? `日期范围错误:${error.message}`
|
|
166
|
+
: renderError(error);
|
|
167
|
+
return { isError: true, content: [{ type: "text", text: extra }] };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function enumFrom(source, help) {
|
|
171
|
+
const keys = Object.keys(source);
|
|
172
|
+
return z.enum(keys).describe(help);
|
|
173
|
+
}
|
|
174
|
+
/** 版本号跟随 package.json:分发到别的机器后,客户端里显示的就是实际装的版本。 */
|
|
175
|
+
const require_ = createRequire(import.meta.url);
|
|
176
|
+
const PKG_VERSION = require_("../package.json").version;
|
|
177
|
+
export function createServer(cfg, client) {
|
|
178
|
+
const server = new McpServer({ name: "TimarAI-Dashboard-MCP", version: PKG_VERSION }, { instructions: "TimarAI 数据驾驶舱只读数据源。回答经营问题时请先看 meta 判断数据是否封板/过期,并注意跨币种金额不可相加。" });
|
|
179
|
+
// ---------------------------------------------------------------- 工具 1
|
|
180
|
+
server.registerTool("dashboard_filters", {
|
|
181
|
+
title: "驾驶舱筛选项",
|
|
182
|
+
description: "查询某舱可用的筛选维度取值(业务类型/商户/渠道/币种/账户类型)。" +
|
|
183
|
+
"在按 businessTypes / merchantId / channelCodes / currencies / accountTypes 过滤前先调用本工具取合法值," +
|
|
184
|
+
"避免用臆测的枚举值导致空结果。结果含 TTL 缓存,需要强制刷新时传 refresh=true。" +
|
|
185
|
+
"⚠️ 商户列表默认**只返回前 10 条**(接口侧限制),响应里的 totalMerchants 才是总数;" +
|
|
186
|
+
"要找特定商户必须传 keyword 按名称搜索,不能用「返回的前 10 条里没有」断定商户不存在。",
|
|
187
|
+
inputSchema: {
|
|
188
|
+
scope: z
|
|
189
|
+
.enum(["CEO", "OPERATION", "FINANCE"])
|
|
190
|
+
.default("CEO")
|
|
191
|
+
.describe("驾驶舱范围:CEO / OPERATION / FINANCE。"),
|
|
192
|
+
keyword: z
|
|
193
|
+
.string()
|
|
194
|
+
.optional()
|
|
195
|
+
.describe("商户名/邮箱关键词,用于在商户数远大于返回上限时定位商户。不传则只返回前 10 条。"),
|
|
196
|
+
refresh: z.boolean().default(false).describe("是否绕过缓存强制重新拉取。"),
|
|
197
|
+
},
|
|
198
|
+
annotations: READ_ONLY,
|
|
199
|
+
}, async ({ scope, keyword, refresh }) => {
|
|
200
|
+
const spec = getEndpointById("filters");
|
|
201
|
+
if (!spec)
|
|
202
|
+
return { isError: true, content: [{ type: "text", text: "❌ filters 路由缺失" }] };
|
|
203
|
+
try {
|
|
204
|
+
const body = { dashboardScope: scope };
|
|
205
|
+
if (keyword)
|
|
206
|
+
body.keyword = keyword;
|
|
207
|
+
// 带 keyword 的查询本质是搜索,不该被无关键词的缓存命中。
|
|
208
|
+
const cacheKey = `filters:${scope}:${keyword ?? ""}`;
|
|
209
|
+
const result = refresh
|
|
210
|
+
? await client.call(spec, body)
|
|
211
|
+
: await client.callCached(spec, body, cacheKey);
|
|
212
|
+
const total = result.data?.totalMerchants;
|
|
213
|
+
const lack = typeof total === "number" && result.data?.merchants?.length !== total;
|
|
214
|
+
return {
|
|
215
|
+
content: [
|
|
216
|
+
{
|
|
217
|
+
type: "text",
|
|
218
|
+
text: `# ${scope} 舱筛选项${keyword ? `(商户关键词:${keyword})` : ""}\n\n${renderPayload(result.data, {
|
|
219
|
+
format: "markdown",
|
|
220
|
+
maxRows: 100,
|
|
221
|
+
}).text}\n\n---\n${lack
|
|
222
|
+
? `⚠️ 商户共 ${total} 个,本次只返回前 ${result.data?.merchants?.length} 个;` +
|
|
223
|
+
`要找特定商户请传 keyword(如 keyword="商户名片段")。\n`
|
|
224
|
+
: ""}ℹ️ 币种清单已覆盖实际交易币种(字典配置 ∪ 日表去重,含 EUR):` +
|
|
225
|
+
`按本清单逐个币种查询再相加,现已能还原不传 \`currencies\` 的合计。` +
|
|
226
|
+
`若哪天出现清单外的币种,\`npm run e2e\` 的覆盖度探针会把差额打出来。\nrequestId:\`${result.meta.requestId}\``,
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
return { isError: true, content: [{ type: "text", text: renderError(error) }] };
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
// ---------------------------------------------------------------- 工具 2
|
|
236
|
+
server.registerTool("dashboard_overview", {
|
|
237
|
+
title: "三舱总览 KPI",
|
|
238
|
+
description: "取某舱的**总览 KPI**(一段日期的汇总值,不是趋势)。cabin:ceo=经营(GMV/收入/毛利/活跃商户/AUM);" +
|
|
239
|
+
"operation=订单(成功失败异常/成功率/平均处理耗时秒);finance=资金(总资产/流入流出/待结算/待对账/冻结/可用)。" +
|
|
240
|
+
"要看「某段时间的每天变化」请改用 dashboard_trend;要看「按维度的构成」请用 dashboard_breakdown。",
|
|
241
|
+
inputSchema: {
|
|
242
|
+
cabin: enumFrom(SUBJECT_MAP.overview, "ceo=经营总览;operation=订单总览;finance=资金总览。"),
|
|
243
|
+
...dateRangeShape,
|
|
244
|
+
...filterShape,
|
|
245
|
+
...outputShape,
|
|
246
|
+
},
|
|
247
|
+
annotations: READ_ONLY,
|
|
248
|
+
}, async (args) => executeQuery(client, cfg, SUBJECT_MAP.overview[args.cabin], args));
|
|
249
|
+
// ---------------------------------------------------------------- 工具 3
|
|
250
|
+
server.registerTool("dashboard_trend", {
|
|
251
|
+
title: "时间序列趋势",
|
|
252
|
+
description: "取**按天时间序列**。subject:gmv=CEO GMV 趋势;order=订单量趋势;success_rate=成功率趋势;" +
|
|
253
|
+
"exception=异常订单趋势;fund=资金流趋势;balance=账户余额趋势;settlement=结算趋势。" +
|
|
254
|
+
"区间较长时先用较大的 maxRows 看全貌,或分段查询。",
|
|
255
|
+
inputSchema: {
|
|
256
|
+
subject: enumFrom(SUBJECT_MAP.trend, "要查看的趋势指标。"),
|
|
257
|
+
...dateRangeShape,
|
|
258
|
+
...filterShape,
|
|
259
|
+
...outputShape,
|
|
260
|
+
},
|
|
261
|
+
annotations: READ_ONLY,
|
|
262
|
+
}, async (args) => executeQuery(client, cfg, SUBJECT_MAP.trend[args.subject], args));
|
|
263
|
+
// ---------------------------------------------------------------- 工具 4
|
|
264
|
+
server.registerTool("dashboard_breakdown", {
|
|
265
|
+
title: "维度构成分解",
|
|
266
|
+
description: "取**某个维度上的构成/占比**(不是时间序列)。subject:business=CEO 业务维度 GMV 分解;" +
|
|
267
|
+
"business_analysis=运营业务线订单与成功率;channel=渠道订单/成功率/成本;fail_reason=失败原因占比;" +
|
|
268
|
+
"fund_distribution=业务资金分布;balance_distribution=账户资金分布;reconciliation=对账结果分析。",
|
|
269
|
+
inputSchema: {
|
|
270
|
+
subject: enumFrom(SUBJECT_MAP.breakdown, "要分解的维度。"),
|
|
271
|
+
...dateRangeShape,
|
|
272
|
+
...filterShape,
|
|
273
|
+
...outputShape,
|
|
274
|
+
},
|
|
275
|
+
annotations: READ_ONLY,
|
|
276
|
+
}, async (args) => executeQuery(client, cfg, SUBJECT_MAP.breakdown[args.subject], args));
|
|
277
|
+
// ---------------------------------------------------------------- 工具 5
|
|
278
|
+
server.registerTool("dashboard_top_merchants", {
|
|
279
|
+
title: "商户排行榜",
|
|
280
|
+
description: "取**商户排行**。subject:gmv=CEO GMV TOP 商户;exception=运营 TOP 异常商户;" +
|
|
281
|
+
"balance=财务 TOP 商户余额;reconciliation=财务 TOP 对账异常商户。默认 10 条:" +
|
|
282
|
+
"要前 N 名用 topN(1~50);要翻页或想知道总共有多少家,用 page/pageSize(响应含 total)。" +
|
|
283
|
+
"多币种下 topN 是「拆行后的全局截断」——不传 currencies 时 topN=1 只会拿到某个币种的一行," +
|
|
284
|
+
"要各币种分别上榜请改用 currencies 逐个查,或翻页后自行归并。",
|
|
285
|
+
inputSchema: {
|
|
286
|
+
subject: enumFrom(SUBJECT_MAP.top, "排行榜类型。"),
|
|
287
|
+
...dateRangeShape,
|
|
288
|
+
...filterShape,
|
|
289
|
+
...topShape,
|
|
290
|
+
...outputShape,
|
|
291
|
+
},
|
|
292
|
+
annotations: READ_ONLY,
|
|
293
|
+
}, async (args) => executeQuery(client, cfg, SUBJECT_MAP.top[args.subject], args));
|
|
294
|
+
// ---------------------------------------------------------------- 工具 6
|
|
295
|
+
server.registerTool("dashboard_platform_metrics", {
|
|
296
|
+
title: "运营平台指标宽表",
|
|
297
|
+
description: "运营舱的平台指标宽表:商户生命周期(新增/首次成交激活/活跃/沉默/流失/不活跃)、" +
|
|
298
|
+
"VA 主子账户、U 卡、商户账户、卡、结算与渠道等 21 项指标。" +
|
|
299
|
+
"返回 latest(末日快照)与 points(逐日序列)。问「商户增长/流失/渠道健康」时用这个,不要用 dashboard_overview。",
|
|
300
|
+
inputSchema: {
|
|
301
|
+
...dateRangeShape,
|
|
302
|
+
...filterShape,
|
|
303
|
+
...outputShape,
|
|
304
|
+
},
|
|
305
|
+
annotations: READ_ONLY,
|
|
306
|
+
}, async (args) => executeQuery(client, cfg, "operation.platform-metrics", args));
|
|
307
|
+
// ---------------------------------------------------------------- 工具 7-8:呈现层
|
|
308
|
+
// 这两个工具会**落盘文件**,因此不标 readOnlyHint=true(那是对「不改动环境」的承诺)。
|
|
309
|
+
// 数据源仍然只读:全部标注 destructiveHint=false,且不存在任何写库路由。
|
|
310
|
+
const PRESENT = {
|
|
311
|
+
readOnlyHint: false,
|
|
312
|
+
destructiveHint: false,
|
|
313
|
+
idempotentHint: false,
|
|
314
|
+
openWorldHint: true,
|
|
315
|
+
};
|
|
316
|
+
const CHART_IDS = CHART_SPECS.map((c) => c.id);
|
|
317
|
+
server.registerTool("render_chart", {
|
|
318
|
+
title: "生成图表",
|
|
319
|
+
description: "取数并**渲染成一张 SVG 图**落盘,返回文件路径。要画图用这个,不要自己拿数字拼文本图。" +
|
|
320
|
+
"chart 取值为预置图表 id(见 Resource timarai://dashboard/charts),已固化路由与字段口径," +
|
|
321
|
+
"不要自行猜测字段。产物是自包含 SVG,可直接嵌入网页、PPT 或 Word。",
|
|
322
|
+
inputSchema: {
|
|
323
|
+
chart: z.enum(CHART_IDS).describe("预置图表 id,如 ceo.kpi / ops.order_trend / fin.fund_trend。"),
|
|
324
|
+
...dateRangeShape,
|
|
325
|
+
...filterShape,
|
|
326
|
+
compare: z
|
|
327
|
+
.boolean()
|
|
328
|
+
.default(true)
|
|
329
|
+
.describe("KPI 卡是否计算环比(会额外请求上一等长区间)。其他图型忽略本项。"),
|
|
330
|
+
width: z.number().int().min(480).max(1600).default(880).describe("SVG 宽度像素。"),
|
|
331
|
+
title: z.string().optional().describe("覆盖默认图表标题。"),
|
|
332
|
+
},
|
|
333
|
+
annotations: PRESENT,
|
|
334
|
+
}, async (args) => {
|
|
335
|
+
const spec = getChartSpec(args.chart);
|
|
336
|
+
if (!spec)
|
|
337
|
+
return { isError: true, content: [{ type: "text", text: `❌ 未知图表:${args.chart}` }] };
|
|
338
|
+
try {
|
|
339
|
+
const built = await buildChart(client, cfg, args.chart, args);
|
|
340
|
+
const dir = resolveOutputDir(cfg.TIMARAI_OUTPUT_DIR);
|
|
341
|
+
const file = writeArtifact(dir, `${slug(args.chart)}.svg`, built.svg);
|
|
342
|
+
return {
|
|
343
|
+
content: [
|
|
344
|
+
{
|
|
345
|
+
type: "text",
|
|
346
|
+
text: [
|
|
347
|
+
`# ${spec.title}`,
|
|
348
|
+
"",
|
|
349
|
+
`图表文件:**${file.path}**(${file.bytes} 字节)`,
|
|
350
|
+
"",
|
|
351
|
+
"## 数据摘要",
|
|
352
|
+
built.summary,
|
|
353
|
+
"",
|
|
354
|
+
`> ${built.metaLine}`,
|
|
355
|
+
`> 口径:${spec.purpose}`,
|
|
356
|
+
`> requestId:\`${built.meta.requestId}\``,
|
|
357
|
+
].join("\n"),
|
|
358
|
+
},
|
|
359
|
+
],
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
return { isError: true, content: [{ type: "text", text: renderError(error) }] };
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
server.registerTool("build_report", {
|
|
367
|
+
title: "生成报表",
|
|
368
|
+
description: "按模板生成**一页式可打印 HTML 报告**(内联全部图表,Ctrl+P 可直接导出 PDF)。" +
|
|
369
|
+
"narrative 传入你的结论段落——工具负责数据与图形,你负责说人话。" +
|
|
370
|
+
"报告顶部会自动声明数据截止时间与封板状态。",
|
|
371
|
+
inputSchema: {
|
|
372
|
+
template: z
|
|
373
|
+
.enum(REPORT_TEMPLATES.map((t) => t.id))
|
|
374
|
+
.describe("报告模板 id。cockpit-full 为三舱全量快照。"),
|
|
375
|
+
...dateRangeShape,
|
|
376
|
+
...filterShape,
|
|
377
|
+
title: z.string().optional().describe("覆盖默认报告标题。"),
|
|
378
|
+
narrative: z
|
|
379
|
+
.array(z.string())
|
|
380
|
+
.optional()
|
|
381
|
+
.describe("结论段落,每段一个字符串;会渲染在报告开头的「结论」区。"),
|
|
382
|
+
},
|
|
383
|
+
annotations: PRESENT,
|
|
384
|
+
}, async (args) => {
|
|
385
|
+
const tpl = getReportTemplate(args.template);
|
|
386
|
+
if (!tpl)
|
|
387
|
+
return { isError: true, content: [{ type: "text", text: `❌ 未知模板:${args.template}` }] };
|
|
388
|
+
const dir = resolveOutputDir(cfg.TIMARAI_OUTPUT_DIR);
|
|
389
|
+
const blocks = [];
|
|
390
|
+
const failures = [];
|
|
391
|
+
const requestIds = [];
|
|
392
|
+
let chartCount = 0;
|
|
393
|
+
let unfinal = false;
|
|
394
|
+
let metaLine = "";
|
|
395
|
+
let lastCabin = "";
|
|
396
|
+
for (const chartId of tpl.charts) {
|
|
397
|
+
const spec = getChartSpec(chartId);
|
|
398
|
+
if (!spec) {
|
|
399
|
+
failures.push(`${chartId}:图表未登记`);
|
|
400
|
+
continue;
|
|
401
|
+
}
|
|
402
|
+
if (spec.cabin !== lastCabin) {
|
|
403
|
+
lastCabin = spec.cabin;
|
|
404
|
+
blocks.push({ heading: cabinHeading(spec.cabin) });
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const built = await buildChart(client, cfg, chartId, args);
|
|
408
|
+
blocks.push({ svg: built.svg, note: built.spec.purpose });
|
|
409
|
+
requestIds.push(built.meta.requestId);
|
|
410
|
+
chartCount += 1;
|
|
411
|
+
if (!built.isFinal)
|
|
412
|
+
unfinal = true;
|
|
413
|
+
if (!metaLine)
|
|
414
|
+
metaLine = built.metaLine;
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
failures.push(`${chartId}:${renderError(error)}`);
|
|
418
|
+
blocks.push({ note: `${spec.title} —— 取数失败,已跳过` });
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
const html = buildReportHtml({
|
|
422
|
+
title: args.title ?? tpl.title,
|
|
423
|
+
subtitle: `${tpl.description} | 共 ${chartCount} 张图`,
|
|
424
|
+
metaLine,
|
|
425
|
+
warnUnfinal: unfinal,
|
|
426
|
+
narrative: args.narrative,
|
|
427
|
+
blocks,
|
|
428
|
+
footer: reportFooter(chartCount, requestIds),
|
|
429
|
+
});
|
|
430
|
+
const file = writeArtifact(dir, `${slug(args.template)}-report.html`, html);
|
|
431
|
+
return {
|
|
432
|
+
content: [
|
|
433
|
+
{
|
|
434
|
+
type: "text",
|
|
435
|
+
text: [
|
|
436
|
+
`# ${tpl.title}`,
|
|
437
|
+
"",
|
|
438
|
+
`报告文件:**${file.path}**`,
|
|
439
|
+
`图表 ${chartCount} 张${failures.length ? `,失败 ${failures.length} 张` : ""}`,
|
|
440
|
+
`数据状态:${unfinal ? "⚠️ 未封板" : "已封板"}`,
|
|
441
|
+
"",
|
|
442
|
+
metaLine ? `> ${metaLine}` : null,
|
|
443
|
+
...(failures.length ? ["", "## 失败明细", ...failures.map((f) => `- ${f}`)] : []),
|
|
444
|
+
]
|
|
445
|
+
.filter(Boolean)
|
|
446
|
+
.join("\n"),
|
|
447
|
+
},
|
|
448
|
+
],
|
|
449
|
+
};
|
|
450
|
+
});
|
|
451
|
+
// ---------------------------------------------------------------- 工具 9(逃生阀)
|
|
452
|
+
if (cfg.TIMARAI_ALLOW_RAW_ENDPOINT) {
|
|
453
|
+
const paths = ENDPOINTS.map((e) => e.path);
|
|
454
|
+
server.registerTool("call_endpoint", {
|
|
455
|
+
title: "直接调用路由(逃生阀)",
|
|
456
|
+
description: "当上层六个工具覆盖不到时才使用:按路径直接调用一个驾驶舱路由,body 为原始请求对象。" +
|
|
457
|
+
"路径取值见 Resource timarai://dashboard/endpoints。**仍然是只读的**,不存在任何写操作路由。" +
|
|
458
|
+
"优先使用语义化工具,本工具产生的调用更难被审计。",
|
|
459
|
+
inputSchema: {
|
|
460
|
+
path: z.enum(paths).describe("路由子路径,不含 /api/v2/platform/dashboard/ 前缀。"),
|
|
461
|
+
body: z.record(z.unknown()).optional().describe("原始请求体对象。"),
|
|
462
|
+
},
|
|
463
|
+
annotations: READ_ONLY,
|
|
464
|
+
}, async ({ path, body }) => {
|
|
465
|
+
const spec = getEndpointByPath(path);
|
|
466
|
+
if (!spec) {
|
|
467
|
+
return { isError: true, content: [{ type: "text", text: `❌ 未知路由:${path}` }] };
|
|
468
|
+
}
|
|
469
|
+
try {
|
|
470
|
+
const result = await client.call(spec, body ?? {});
|
|
471
|
+
return {
|
|
472
|
+
content: [
|
|
473
|
+
{
|
|
474
|
+
type: "text",
|
|
475
|
+
text: `# ${spec.id}\n\n${JSON.stringify(result.data, null, 2)}\n\n---\nrequestId:\`${result.meta.requestId}\``,
|
|
476
|
+
},
|
|
477
|
+
],
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
return { isError: true, content: [{ type: "text", text: renderError(error) }] };
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
// ---------------------------------------------------------------- Resources
|
|
486
|
+
server.registerResource("timarai-endpoints", "timarai://dashboard/endpoints", {
|
|
487
|
+
title: "驾驶舱路由全表",
|
|
488
|
+
description: "23 个只读路由与工具面的映射关系,call_endpoint 的合法 path 取值来源。",
|
|
489
|
+
mimeType: "text/markdown",
|
|
490
|
+
}, async (uri) => ({
|
|
491
|
+
contents: [{ uri: uri.href, mimeType: "text/markdown", text: ENDPOINT_REFERENCE_HEADER + endpointTableMarkdown() }],
|
|
492
|
+
}));
|
|
493
|
+
server.registerResource("timarai-glossary", "timarai://dashboard/field-glossary", {
|
|
494
|
+
title: "字段口径字典",
|
|
495
|
+
description: "CEO/运营/财务三舱字段的中文含义与统计口径,含常见误用提示。",
|
|
496
|
+
mimeType: "text/markdown",
|
|
497
|
+
}, async (uri) => ({ contents: [{ uri: uri.href, mimeType: "text/markdown", text: FIELD_GLOSSARY }] }));
|
|
498
|
+
server.registerResource("timarai-limits", "timarai://dashboard/limits", {
|
|
499
|
+
title: "使用边界与最佳实践",
|
|
500
|
+
description: "只读边界、90 天跨度、报表时区、跨币种不可相加等纪律。",
|
|
501
|
+
mimeType: "text/markdown",
|
|
502
|
+
}, async (uri) => ({ contents: [{ uri: uri.href, mimeType: "text/markdown", text: LIMITS_AND_PRACTICES }] }));
|
|
503
|
+
server.registerResource("timarai-charts", "timarai://dashboard/charts", {
|
|
504
|
+
title: "可用图表与报表模板",
|
|
505
|
+
description: "render_chart 的 chart 取值清单、build_report 的模板清单,含各图用途与字段口径。",
|
|
506
|
+
mimeType: "text/markdown",
|
|
507
|
+
}, async (uri) => ({ contents: [{ uri: uri.href, mimeType: "text/markdown", text: chartCatalogMarkdown() }] }));
|
|
508
|
+
// ---------------------------------------------------------------- Prompts
|
|
509
|
+
// ⚠️ 这里刻意**不给 Prompt 加 argsSchema**。
|
|
510
|
+
// 原因(SDK 行为,非规范):传了 argsSchema 后,`prompts/get` 若不带 arguments,
|
|
511
|
+
// 会被 z.object(...).parse(undefined) 判为 Required 报错——即便字段写了 .default()。
|
|
512
|
+
// 而 MCP 规范里 arguments 是可选项,宿主(含官方 TS client)经常直接省略该字段。
|
|
513
|
+
// 实测三种绕法都不可行:
|
|
514
|
+
// - 字段 .default() / .optional():对象层的 undefined 仍报 Required;
|
|
515
|
+
// - 整包 z.object(...).optional():SDK 的 normalizeObjectSchema 要求 schema.shape
|
|
516
|
+
// 存在,ZodOptional 没有 shape,会被丢弃后同样走到 Required。
|
|
517
|
+
// 因此改为无参数 Prompt,把日期窗口写进正文,由模型结合用户提问自行选择——
|
|
518
|
+
// 反而比受限于 preset 枚举更灵活(也能用显式日期)。
|
|
519
|
+
server.registerPrompt("daily-briefing", {
|
|
520
|
+
title: "每日经营简报",
|
|
521
|
+
description: "生成 CEO/运营/财务三段式日报,含数据新鲜度与异动提示。默认覆盖「昨天」,可按用户提问改用其他日期窗口。",
|
|
522
|
+
}, () => {
|
|
523
|
+
const window = "昨天(preset=yesterday);若用户明确指定了其他时间范围,按其指定取数";
|
|
524
|
+
return {
|
|
525
|
+
messages: [
|
|
526
|
+
{
|
|
527
|
+
role: "user",
|
|
528
|
+
content: {
|
|
529
|
+
type: "text",
|
|
530
|
+
text: `日期窗口:${window}。请用一次拉数产出经营日报:\n\n` +
|
|
531
|
+
"1. **CEO 舱**:GMV、成功交易笔数、平台收入、活跃/新增商户、成功率、AUM,并给出环比参照(再取一次同长度的前一区间对比)。\n" +
|
|
532
|
+
"2. **运营舱**:订单量、成功率、异常订单,若平均处理耗时显著升高要重点提示;失败原因取 TOP3。\n" +
|
|
533
|
+
"3. **财务舱**:可用余额、待结算、待对账与对账异常金额。\n" +
|
|
534
|
+
"4. 开头必须声明数据截止时间与 meta.isFinal 状态;未封板要明确标注「临时值」。\n" +
|
|
535
|
+
"5. 未收敛到单一币种时,不得给出跨币种合计。"
|
|
536
|
+
},
|
|
537
|
+
},
|
|
538
|
+
],
|
|
539
|
+
};
|
|
540
|
+
});
|
|
541
|
+
server.registerPrompt("ops-anomaly-triage", {
|
|
542
|
+
title: "运营异常归因",
|
|
543
|
+
description: "针对异常订单/成功率下滑做结构化归因排查。默认窗口「近 7 天」,可按用户提问调整。",
|
|
544
|
+
}, () => {
|
|
545
|
+
const window = "近 7 天(preset=last_7d);若用户指定了别的窗口,按其指定取数";
|
|
546
|
+
return {
|
|
547
|
+
messages: [
|
|
548
|
+
{
|
|
549
|
+
role: "user",
|
|
550
|
+
content: {
|
|
551
|
+
type: "text",
|
|
552
|
+
text: `排查窗口:${window}。请按以下顺序归因,每一步都要给出证据:\n\n` +
|
|
553
|
+
"1. 取 operation/overview 与 exception-trend,确认异常量与趋势方向。\n" +
|
|
554
|
+
"2. 取 fail-reason-breakdown,定位 TOP 失败原因(按金额与笔数分别看)。\n" +
|
|
555
|
+
"3. 取 channel-analysis,判断是否为个别渠道拖累(关注成功率与渠道成本)。\n" +
|
|
556
|
+
"4. 取 top-exception-merchants,判断是否为少数商户集中。\n" +
|
|
557
|
+
"5. 若成功率下滑但失败原因分散,再看 operation/business-analysis 判断是否全业务线普降。\n" +
|
|
558
|
+
"6. 结论要明确:是渠道问题、业务线问题还是个别商户问题;数据不足以定性时如实说明。"
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
],
|
|
562
|
+
};
|
|
563
|
+
});
|
|
564
|
+
server.registerPrompt("finance-weekly-review", {
|
|
565
|
+
title: "财务周度复盘",
|
|
566
|
+
description: "资金、结算、对账三条线的周度复盘。默认窗口「近 7 天」,可按用户提问调整。",
|
|
567
|
+
}, () => {
|
|
568
|
+
const window = "近 7 天(preset=last_7d);若用户指定了别的窗口,按其指定取数";
|
|
569
|
+
return {
|
|
570
|
+
messages: [
|
|
571
|
+
{
|
|
572
|
+
role: "user",
|
|
573
|
+
content: {
|
|
574
|
+
type: "text",
|
|
575
|
+
text: `复盘窗口:${window}。请产出财务周报:\n\n` +
|
|
576
|
+
"1. finance/overview:总资产、流入流出、待结算、待对账、异常、冻结、可用余额。\n" +
|
|
577
|
+
"2. finance/fund-trend 与 balance-trend:识别资金流的拐点与余额趋势是否健康。\n" +
|
|
578
|
+
"3. finance/settlement-trend:结算节奏是否有积压。\n" +
|
|
579
|
+
"4. finance/reconciliation-analysis + top-reconciliation-merchants:对账异常的结构与集中度。\n" +
|
|
580
|
+
"5. 必须标注 meta.isFinal;未封板数据不得用于对外披露口径。"
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
],
|
|
584
|
+
};
|
|
585
|
+
});
|
|
586
|
+
return server;
|
|
587
|
+
}
|
|
588
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|