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/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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"}