antitone 1.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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/SKILL.md +114 -0
  4. package/dist/cli.d.ts +4 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +371 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/client.d.ts +108 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +412 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/config.d.ts +42 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +117 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/errors.d.ts +53 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +224 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/index.d.ts +17 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +36 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/output.d.ts +74 -0
  25. package/dist/output.d.ts.map +1 -0
  26. package/dist/output.js +283 -0
  27. package/dist/output.js.map +1 -0
  28. package/dist/tools/astock.d.ts +5 -0
  29. package/dist/tools/astock.d.ts.map +1 -0
  30. package/dist/tools/astock.js +30 -0
  31. package/dist/tools/astock.js.map +1 -0
  32. package/dist/tools/backtest.d.ts +5 -0
  33. package/dist/tools/backtest.d.ts.map +1 -0
  34. package/dist/tools/backtest.js +36 -0
  35. package/dist/tools/backtest.js.map +1 -0
  36. package/dist/tools/briefing.d.ts +5 -0
  37. package/dist/tools/briefing.d.ts.map +1 -0
  38. package/dist/tools/briefing.js +28 -0
  39. package/dist/tools/briefing.js.map +1 -0
  40. package/dist/tools/calendar.d.ts +5 -0
  41. package/dist/tools/calendar.d.ts.map +1 -0
  42. package/dist/tools/calendar.js +35 -0
  43. package/dist/tools/calendar.js.map +1 -0
  44. package/dist/tools/entity.d.ts +5 -0
  45. package/dist/tools/entity.d.ts.map +1 -0
  46. package/dist/tools/entity.js +41 -0
  47. package/dist/tools/entity.js.map +1 -0
  48. package/dist/tools/index.d.ts +28 -0
  49. package/dist/tools/index.d.ts.map +1 -0
  50. package/dist/tools/index.js +58 -0
  51. package/dist/tools/index.js.map +1 -0
  52. package/dist/tools/kit.d.ts +82 -0
  53. package/dist/tools/kit.d.ts.map +1 -0
  54. package/dist/tools/kit.js +146 -0
  55. package/dist/tools/kit.js.map +1 -0
  56. package/dist/tools/market.d.ts +5 -0
  57. package/dist/tools/market.d.ts.map +1 -0
  58. package/dist/tools/market.js +194 -0
  59. package/dist/tools/market.js.map +1 -0
  60. package/dist/tools/news.d.ts +5 -0
  61. package/dist/tools/news.d.ts.map +1 -0
  62. package/dist/tools/news.js +101 -0
  63. package/dist/tools/news.js.map +1 -0
  64. package/dist/tools/usage.d.ts +13 -0
  65. package/dist/tools/usage.d.ts.map +1 -0
  66. package/dist/tools/usage.js +50 -0
  67. package/dist/tools/usage.js.map +1 -0
  68. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../../src/tools/kit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** 市场类工具:market_overview / list_sectors / get_sector / list_themes / get_theme_news / get_quotes / get_kline(scope: market:read)。 */
2
+ import type { AntitoneClient } from "../client.js";
3
+ import { type ToolSink } from "./kit.js";
4
+ export declare function registerMarketTools(server: ToolSink, client: AntitoneClient): void;
5
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/tools/market.ts"],"names":[],"mappings":"AAAA,qIAAqI;AAGrI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAkF,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAQzH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA4LlF"}
@@ -0,0 +1,194 @@
1
+ /** 市场类工具:market_overview / list_sectors / get_sector / list_themes / get_theme_news / get_quotes / get_kline(scope: market:read)。 */
2
+ import { z } from "zod";
3
+ import { DEFAULT_LIMIT } from "../config.js";
4
+ import { badInput, countItems, fromEnvelope, fromEnvelopes, registerReadTool, STALE_MS } from "./kit.js";
5
+ const NEWS_HINTS = [
6
+ "把 limit 降到 20 以内",
7
+ "换一个更窄的题材编码(先用 list_themes 看编码)",
8
+ "用 from_at 缩小时间窗(≤7 天不加价)",
9
+ ];
10
+ export function registerMarketTools(server, client) {
11
+ registerReadTool(server, client, {
12
+ name: "market_overview",
13
+ title: "市场总览",
14
+ description: [
15
+ "一次性取当前市场状态:交易阶段(盘前/盘中/午休/收盘)与市场宽度(涨跌家数、涨停跌停、赚钱效应)。",
16
+ "什么时候用:会话开场需要判断「现在是不是交易时段」「今天大盘强弱」;回答「今天市场怎么样」这类宏观问题。",
17
+ "返回 data.phase 与 data.breadth 两部分;组合调用比分别取更省一次往返。",
18
+ "费用:4 积分(phase 1 分 + breadth 3 分)。",
19
+ ].join("\n"),
20
+ inputSchema: {},
21
+ hints: ["如需个股/指数点位,请改用 get_quotes", "如需板块强弱,请改用 list_sectors"],
22
+ run: async (_args, ctx) => {
23
+ const [phase, breadth] = await Promise.all([
24
+ ctx.client.get("/v1/market/phase", { staleAfterMs: STALE_MS.quote, signal: ctx.signal }),
25
+ ctx.client.get("/v1/market/breadth", { staleAfterMs: STALE_MS.quote, signal: ctx.signal }),
26
+ ]);
27
+ return fromEnvelopes([
28
+ ["phase", phase],
29
+ ["breadth", breadth],
30
+ ]);
31
+ },
32
+ });
33
+ registerReadTool(server, client, {
34
+ name: "list_sectors",
35
+ title: "板块总览",
36
+ description: [
37
+ "列出全部行业/板块的涨跌幅、成交额、领涨股等总览数据,用于横向比较板块强弱。",
38
+ "什么时候用:用户问「今天哪些板块强/弱」「资金流去哪了」;需要先拿到 sector_code 再调 get_sector 看细节。",
39
+ "返回条数多,若只想看头部板块可在本地按涨跌幅排序取前几条。",
40
+ "费用:固定 3 积分。",
41
+ ].join("\n"),
42
+ inputSchema: {},
43
+ hints: ["只想看某一个板块时,直接用 get_sector(sector_code) 更便宜(1 积分)"],
44
+ run: async (_args, ctx) => {
45
+ const envelope = await ctx.client.get("/v1/sectors/overview", {
46
+ query: { window: "2h" },
47
+ staleAfterMs: STALE_MS.quote,
48
+ signal: ctx.signal,
49
+ });
50
+ return fromEnvelope(envelope, {
51
+ ...(countItems(envelope.data) !== undefined ? { count: countItems(envelope.data) } : {}),
52
+ });
53
+ },
54
+ });
55
+ registerReadTool(server, client, {
56
+ name: "get_sector",
57
+ title: "单个板块行情",
58
+ description: [
59
+ "读取单个板块(行业)的实时行情:涨跌幅、成交额、领涨/领跌股。",
60
+ "什么时候用:已经知道板块代码(来自 list_sectors),要追问「这个板块具体怎样」时。",
61
+ "费用:固定 1 积分,是最便宜的板块查询方式。",
62
+ ].join("\n"),
63
+ inputSchema: {
64
+ sector_code: z.string().min(1).max(64).describe("板块代码,来自 list_sectors 返回的 sector_code(如 BK0475 之类的服务端编码)"),
65
+ },
66
+ hints: ["板块代码不确定时先调 list_sectors 取编码"],
67
+ run: async (args, ctx) => {
68
+ const code = args.sector_code.trim();
69
+ if (!code)
70
+ throw badInput("sector_code 不能为空。", "先调用 list_sectors 获取板块代码。");
71
+ const envelope = await ctx.client.get(`/v1/sectors/${encodeURIComponent(code)}/quote`, {
72
+ staleAfterMs: STALE_MS.quote,
73
+ signal: ctx.signal,
74
+ });
75
+ return fromEnvelope(envelope, { meta: { sector_code: code } });
76
+ },
77
+ });
78
+ registerReadTool(server, client, {
79
+ name: "list_themes",
80
+ title: "题材总览",
81
+ description: [
82
+ "列出当前活跃题材(概念)及其热度、涨跌幅、代表个股,返回题材编码 theme_code。",
83
+ "什么时候用:用户问「最近炒什么题材」「XX 概念哪些票」,或需要 theme_code 再调 get_theme_news 看题材新闻。",
84
+ "费用:固定 3 积分。",
85
+ ].join("\n"),
86
+ inputSchema: {},
87
+ hints: ["拿到 theme_code 后用 get_theme_news 看该题材的新闻(按新闻条数计价)"],
88
+ run: async (_args, ctx) => {
89
+ const envelope = await ctx.client.get("/v1/themes/overview", {
90
+ query: { window: "2h" },
91
+ staleAfterMs: STALE_MS.quote,
92
+ signal: ctx.signal,
93
+ });
94
+ return fromEnvelope(envelope, {
95
+ ...(countItems(envelope.data) !== undefined ? { count: countItems(envelope.data) } : {}),
96
+ });
97
+ },
98
+ });
99
+ registerReadTool(server, client, {
100
+ name: "get_theme_news",
101
+ title: "题材新闻",
102
+ description: [
103
+ "按题材编码拉取该题材最新新闻列表(底层是 /v1/news?theme=...)。",
104
+ "什么时候用:用户问「半导体题材最近有什么消息」「XX 概念的消息面」,且你已经从 list_themes 拿到 theme_code。",
105
+ "费用:与 search_news 同口径 —— 1 + ⌈limit/20⌉ 积分(limit=20 → 2 分)。",
106
+ ].join("\n"),
107
+ inputSchema: {
108
+ theme_code: z.string().min(1).max(64).describe("题材编码,来自 list_themes 的返回结果"),
109
+ limit: z.number().int().min(1).max(200).optional().describe("返回条数,默认 20,最大 200"),
110
+ },
111
+ hints: NEWS_HINTS,
112
+ run: async (args, ctx) => {
113
+ const code = args.theme_code.trim();
114
+ if (!code)
115
+ throw badInput("theme_code 不能为空。", "先调用 list_themes 获取题材编码。");
116
+ const limit = args.limit ?? DEFAULT_LIMIT;
117
+ const envelope = await ctx.client.get("/v1/news", {
118
+ query: { theme: code, limit },
119
+ staleAfterMs: STALE_MS.news,
120
+ signal: ctx.signal,
121
+ });
122
+ return fromEnvelope(envelope, {
123
+ ...(countItems(envelope.data) !== undefined ? { count: countItems(envelope.data) } : {}),
124
+ meta: { theme_code: code, limit_requested: limit },
125
+ });
126
+ },
127
+ });
128
+ registerReadTool(server, client, {
129
+ name: "get_quotes",
130
+ title: "批量行情",
131
+ description: [
132
+ "批量取股票/指数实时行情:最新价、涨跌幅、成交量、成交额、时间戳(一次最多 50 只)。",
133
+ "什么时候用:用户问「某某股票现在多少钱」「自选股今天表现」;需要几分钟级的现价快照时。",
134
+ "符号支持数组或逗号分隔字符串(如 [\"600519\",\"000001\"] 或 \"600519,000001\"),上限 50 只。",
135
+ "费用:1 + ⌈只数/50⌉ 积分(≤50 只 = 2 分)。",
136
+ ].join("\n"),
137
+ inputSchema: {
138
+ symbols: z
139
+ .union([z.array(z.string().min(1).max(32)).min(1).max(50), z.string().min(1).max(1200)])
140
+ .describe("股票/指数代码,最多 50 只;数组形式或逗号分隔字符串均可(如 \"600519,000001,399001\")"),
141
+ },
142
+ hints: ["一次传满需要查的代码(≤50 只按 2 积分计,拆多次更贵)", "只要 K 线用 get_kline,不需要先取 quotes"],
143
+ run: async (args, ctx) => {
144
+ const raw = Array.isArray(args.symbols) ? args.symbols : args.symbols.split(",");
145
+ const symbols = [...new Set(raw.map((item) => item.trim()).filter((item) => item.length > 0))];
146
+ if (symbols.length === 0)
147
+ throw badInput("symbols 不能为空。", "传入至少一个股票代码,如 [\"600519\"]。");
148
+ if (symbols.length > 50) {
149
+ throw badInput(`一次最多查询 50 只,当前传入 ${symbols.length} 只。`, "拆成多次调用(每次 ≤50 只),或先按关注度筛选后再查。");
150
+ }
151
+ const envelope = await ctx.client.get("/v1/quotes", {
152
+ query: { symbols: symbols.join(",") },
153
+ staleAfterMs: STALE_MS.quote,
154
+ signal: ctx.signal,
155
+ });
156
+ return fromEnvelope(envelope, {
157
+ ...(countItems(envelope.data) !== undefined ? { count: countItems(envelope.data) } : {}),
158
+ meta: { symbols_requested: symbols.length },
159
+ });
160
+ },
161
+ });
162
+ registerReadTool(server, client, {
163
+ name: "get_kline",
164
+ title: "K 线数据",
165
+ description: [
166
+ "取单只标的的 K 线(默认日线 1d,可选 5 分钟 5m),用于走势、涨跌幅、均线等技术判断。",
167
+ "什么时候用:用户问「最近走势」「这段时间涨了多少」「画个 K 线」;需要历史价格序列做计算时。",
168
+ "参数:code 代码、days 根数(默认 60,最大 250)、period 周期(1d / 5m)。",
169
+ "费用:2 + ⌈根数/50⌉ 积分(60 根 → 4 分;250 根 → 7 分)。",
170
+ ].join("\n"),
171
+ inputSchema: {
172
+ code: z.string().min(1).max(32).describe("股票/指数代码,如 600519、000001、399001"),
173
+ days: z.number().int().min(1).max(250).optional().describe("K 线根数,默认 60,最大 250;每 50 根 +1 积分"),
174
+ period: z.enum(["1d", "5m"]).optional().describe("周期:1d 日线(默认)、5m 五分钟线"),
175
+ },
176
+ hints: ["把 days 降到 60 以内", "日线够用时不要取 5m(根数越多越贵、体积越大)"],
177
+ run: async (args, ctx) => {
178
+ const code = args.code.trim();
179
+ if (!code)
180
+ throw badInput("code 不能为空。", "传入股票代码,如 \"600519\"。");
181
+ const days = args.days ?? 60;
182
+ const period = args.period ?? "1d";
183
+ const envelope = await ctx.client.get("/v1/stocks/kline", {
184
+ query: { codes: code, days, period }, // 服务端参数名为 codes(逗号分隔)
185
+ staleAfterMs: period === "5m" ? STALE_MS.quote : STALE_MS.sessionHalfDay,
186
+ signal: ctx.signal,
187
+ });
188
+ return fromEnvelope(envelope, {
189
+ meta: { code, days_requested: days, period },
190
+ });
191
+ },
192
+ });
193
+ }
194
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/tools/market.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** 情报类工具:search_news / get_news / get_story(scope: news:read)。 */
2
+ import type { AntitoneClient } from "../client.js";
3
+ import { type ToolSink } from "./kit.js";
4
+ export declare function registerNewsTools(server: ToolSink, client: AntitoneClient): void;
5
+ //# sourceMappingURL=news.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news.d.ts","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAGlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAmE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAQ1G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA0FhF"}
@@ -0,0 +1,101 @@
1
+ /** 情报类工具:search_news / get_news / get_story(scope: news:read)。 */
2
+ import { z } from "zod";
3
+ import { DEFAULT_LIMIT } from "../config.js";
4
+ import { countItems, fromEnvelope, registerReadTool, STALE_MS, badInput } from "./kit.js";
5
+ const NEWS_HINTS = [
6
+ "把 limit 降到 20 以内(每 20 条 +1 积分,也更省 token)",
7
+ "用 q / ticker / theme 收窄主题,而不是拉全量",
8
+ "用 from_at 缩小时间窗:≤7 天不加价,8–30 天 ×2、31–180 天 ×3、>180 天 ×5",
9
+ ];
10
+ export function registerNewsTools(server, client) {
11
+ registerReadTool(server, client, {
12
+ name: "search_news",
13
+ title: "搜索新闻",
14
+ description: [
15
+ "按关键词 / 股票 / 题材 / 时间窗检索 Antitone 情报流,返回新闻列表(标题、摘要、来源、重要度、关联标的、public_id)。",
16
+ "什么时候用:用户问「今天/最近有什么关于 X 的消息」「某只股票/板块出了什么事」「某题材有什么新闻」;或需要先拿到 public_id 再用 get_news 读详情。",
17
+ "什么时候不用:需要实时推送(MCP 不能主动推送,实时请用 Webhook);需要全量历史同步(改用 /v1/stream/replay 脚本)。",
18
+ "参数:q 关键词、ticker 股票代码、market 市场、theme 题材编码、from_at 起始时间、limit 条数(默认 20,最大 200)。",
19
+ "费用:1 + ⌈limit/20⌉ 积分(limit=20 → 2 分;100 → 6 分),历史跨度修饰另乘。",
20
+ ].join("\n"),
21
+ inputSchema: {
22
+ q: z.string().min(1).max(200).optional().describe("关键词,中英文均可(如「半导体」「降息」「业绩预增」),与 ticker/theme 可组合"),
23
+ ticker: z.string().min(1).max(32).optional().describe("股票代码,A 股为 6 位数字(如 600519),也支持 600519.SH 形式"),
24
+ market: z.string().min(1).max(16).optional().describe("市场过滤,如 cn / hk / us"),
25
+ theme: z.string().min(1).max(64).optional().describe("题材编码,先用 list_themes 取编码"),
26
+ from_at: z.string().min(1).max(64).optional().describe("起始时间,ISO8601(2026-09-01T00:00:00Z)或日期(2026-09-01);跨度 >7 天会加价"),
27
+ limit: z.number().int().min(1).max(200).optional().describe("返回条数,默认 20,最大 200;每 20 条 +1 积分"),
28
+ },
29
+ hints: NEWS_HINTS,
30
+ run: async (args, ctx) => {
31
+ const limit = args.limit ?? DEFAULT_LIMIT;
32
+ const envelope = await ctx.client.get("/v1/news", {
33
+ query: {
34
+ q: args.q,
35
+ ticker: args.ticker,
36
+ market: args.market,
37
+ theme: args.theme,
38
+ published_from: args.from_at, // 服务端参数名为 published_from
39
+ limit,
40
+ },
41
+ staleAfterMs: STALE_MS.news,
42
+ signal: ctx.signal,
43
+ });
44
+ return fromEnvelope(envelope, {
45
+ ...(countItems(envelope.data) !== undefined ? { count: countItems(envelope.data) } : {}),
46
+ meta: { limit_requested: limit },
47
+ });
48
+ },
49
+ });
50
+ registerReadTool(server, client, {
51
+ name: "get_news",
52
+ title: "读取单条新闻",
53
+ description: [
54
+ "按 public_id 读取一条新闻的完整结构化记录(含正文摘要、来源、时间、重要度、关联股票/题材)。",
55
+ "什么时候用:已经从 search_news 拿到 public_id,需要看这一条的细节或全文时;用户追问「刚才那条第 2 条具体说了什么」。",
56
+ "include_full_text=true 会返回全文,费用 ×3(2 → 6 积分),只在确实需要原文时开启。",
57
+ "费用:固定 2 积分(含全文 6 积分)。",
58
+ ].join("\n"),
59
+ inputSchema: {
60
+ public_id: z.string().min(1).max(128).describe("新闻 public_id,来自 search_news 的返回结果"),
61
+ include_full_text: z.boolean().optional().describe("是否返回全文,默认 false;开启后费用 ×3(2 → 6 积分)"),
62
+ },
63
+ hints: ["确认 public_id 是否来自 search_news(拼错会 404)", "非必要不要开 include_full_text(费用 ×3)"],
64
+ run: async (args, ctx) => {
65
+ const publicId = args.public_id.trim();
66
+ if (!publicId)
67
+ throw badInput("public_id 不能为空。", "先用 search_news 取一条新闻的 public_id 再调用。");
68
+ const envelope = await ctx.client.get(`/v1/news/${encodeURIComponent(publicId)}`, {
69
+ query: { include_full_text: args.include_full_text === true },
70
+ staleAfterMs: STALE_MS.news,
71
+ signal: ctx.signal,
72
+ });
73
+ return fromEnvelope(envelope, { meta: { public_id: publicId, include_full_text: args.include_full_text === true } });
74
+ },
75
+ });
76
+ registerReadTool(server, client, {
77
+ name: "get_story",
78
+ title: "读取事件簇(story)",
79
+ description: [
80
+ "读取一个事件簇(story):同一事件的多条新闻聚合、时间线与影响面。",
81
+ "什么时候用:用户想了解「这件事的来龙去脉/最新进展」,而不是零散单条新闻时;先用 search_news 找到相关新闻里的 story_id。",
82
+ "story_id 与 public_id 不同:public_id 是单条新闻,story_id 是一个事件簇。",
83
+ "费用:固定 3 积分。",
84
+ ].join("\n"),
85
+ inputSchema: {
86
+ story_id: z.string().min(1).max(128).describe("事件簇 ID(story_id),可从 search_news 结果里带出"),
87
+ },
88
+ hints: ["story_id 与 public_id 不同,别混用", "若只有关键词,先用 search_news 找 story_id"],
89
+ run: async (args, ctx) => {
90
+ const storyId = args.story_id.trim();
91
+ if (!storyId)
92
+ throw badInput("story_id 不能为空。", "先用 search_news 找到相关新闻,取其 story_id。");
93
+ const envelope = await ctx.client.get(`/v1/stories/${encodeURIComponent(storyId)}`, {
94
+ staleAfterMs: STALE_MS.news,
95
+ signal: ctx.signal,
96
+ });
97
+ return fromEnvelope(envelope, { meta: { story_id: storyId } });
98
+ },
99
+ });
100
+ }
101
+ //# sourceMappingURL=news.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news.js","sourceRoot":"","sources":["../../src/tools/news.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** get_usage(scope: usage:read,免费端点)。 */
2
+ import type { AntitoneClient } from "../client.js";
3
+ import { type ToolSink } from "./kit.js";
4
+ /**
5
+ * 2026-09-16 压缩(实测教训):
6
+ * 旧版无条件同时拉 /v1/usage + /v1/credits/usage,后者一次最多返回 500 条积分流水 ——
7
+ * 一次「查余额」实测 82,914 B,被 32 KB 上限截断后仍灌了约 31 KB(≈8–10k tokens)进上下文。
8
+ * 现在的口径:
9
+ * · 默认只拉 /v1/usage(体量小,就是余额与调用统计)
10
+ * · 需要逐笔流水时显式传 ledger_days(1–90)
11
+ */
12
+ export declare function registerUsageTools(server: ToolSink, client: AntitoneClient): void;
13
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/tools/usage.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAGzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAA8C,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuCjF"}
@@ -0,0 +1,50 @@
1
+ /** get_usage(scope: usage:read,免费端点)。 */
2
+ import { z } from "zod";
3
+ import { fromEnvelopes, registerReadTool, STALE_MS } from "./kit.js";
4
+ /**
5
+ * 2026-09-16 压缩(实测教训):
6
+ * 旧版无条件同时拉 /v1/usage + /v1/credits/usage,后者一次最多返回 500 条积分流水 ——
7
+ * 一次「查余额」实测 82,914 B,被 32 KB 上限截断后仍灌了约 31 KB(≈8–10k tokens)进上下文。
8
+ * 现在的口径:
9
+ * · 默认只拉 /v1/usage(体量小,就是余额与调用统计)
10
+ * · 需要逐笔流水时显式传 ledger_days(1–90)
11
+ */
12
+ export function registerUsageTools(server, client) {
13
+ registerReadTool(server, client, {
14
+ name: "get_usage",
15
+ title: "用量与余额",
16
+ description: [
17
+ "查询账号用量与余额:/v1/usage 的调用统计(免费端点,返回很小)。",
18
+ "什么时候用:用户问「我还剩多少额度」「今天/本月用了多少」;或在其他工具返回 402(余额不足)/429(超限)之后做诊断。",
19
+ "需要逐笔积分流水时传 ledger_days(如 7)会额外拉 /v1/credits/usage;不传则跳过 —— 流水一次可能几百条,很占上下文。",
20
+ "费用:0 积分。",
21
+ ].join("\n"),
22
+ inputSchema: {
23
+ ledger_days: z
24
+ .number()
25
+ .int()
26
+ .min(1)
27
+ .max(90)
28
+ .optional()
29
+ .describe("可选:同时返回最近 N 天的积分流水(1–90)。不传则不拉流水(推荐,省上下文)"),
30
+ },
31
+ hints: ["若只是余额不足,用本工具确认后到个人中心充值即可(1 积分 = ¥0.005)"],
32
+ run: async (args, ctx) => {
33
+ const usage = await ctx.client.get("/v1/usage", {
34
+ staleAfterMs: STALE_MS.quote,
35
+ signal: ctx.signal,
36
+ });
37
+ const envelopes = [["usage", usage]];
38
+ if (args.ledger_days !== undefined) {
39
+ const credits = await ctx.client.get("/v1/credits/usage", {
40
+ query: { days: args.ledger_days },
41
+ staleAfterMs: STALE_MS.quote,
42
+ signal: ctx.signal,
43
+ });
44
+ envelopes.push(["credits", credits]);
45
+ }
46
+ return fromEnvelopes(envelopes, { meta: { free: true } });
47
+ },
48
+ });
49
+ }
50
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/tools/usage.ts"],"names":[],"mappings":"AAAA,yCAAyC;AAEzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAErF;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAE,MAAsB;IACzE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE;QAC/B,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,OAAO;QACd,WAAW,EAAE;YACX,uCAAuC;YACvC,gEAAgE;YAChE,6EAA6E;YAC7E,UAAU;SACX,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE;YACX,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,2CAA2C,CAAC;SACzD;QACD,KAAK,EAAE,CAAC,yCAAyC,CAAC;QAClD,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YACvB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAU,WAAW,EAAE;gBACvD,YAAY,EAAE,QAAQ,CAAC,KAAK;gBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;aACnB,CAAC,CAAC;YACH,MAAM,SAAS,GAAsC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAExE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAU,mBAAmB,EAAE;oBACjE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;oBACjC,YAAY,EAAE,QAAQ,CAAC,KAAK;oBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACvC,CAAC;YAED,OAAO,aAAa,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "antitone",
3
+ "version": "1.1.0",
4
+ "description": "Antitone 财经情报 CLI + Skill:A股/港股/美股的行情、新闻、板块题材、涨停龙虎榜、早晚报与信号回测(16 个只读工具)。装上 Skill,Agent 会自己判断何时调用。",
5
+ "keywords": [
6
+ "antitone",
7
+ "agent",
8
+ "skill",
9
+ "cli",
10
+ "a-share",
11
+ "finance",
12
+ "news",
13
+ "stock",
14
+ "market-data"
15
+ ],
16
+ "license": "MIT",
17
+ "author": "Antitone",
18
+ "homepage": "https://desicterminal.com",
19
+ "type": "module",
20
+ "bin": {
21
+ "antitone": "dist/cli.js"
22
+ },
23
+ "main": "dist/index.js",
24
+ "types": "dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ },
30
+ "./server": {
31
+ "types": "./dist/server.d.ts",
32
+ "import": "./dist/server.js"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "SKILL.md"
40
+ ],
41
+ "engines": {
42
+ "node": ">=18.17"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "clean": "node -e \"fs.rmSync('dist',{recursive:true,force:true})\"",
49
+ "build": "npm run clean && tsc -p tsconfig.json && node scripts/postbuild.mjs",
50
+ "typecheck": "tsc -p tsconfig.json --noEmit",
51
+ "smoke": "node scripts/smoke.mjs",
52
+ "test": "npm run build && npm run smoke",
53
+ "prepublishOnly": "npm run build && npm run smoke"
54
+ },
55
+ "dependencies": {
56
+ "zod": "^3.25.76"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.20.2",
60
+ "typescript": "^5.9.3"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "git+https://github.com/xiazhi88/antitone-mcp.git"
65
+ }
66
+ }