volcengine-api-mcp 0.0.0-stage → 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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -2
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +44 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/ark.d.ts +28 -0
  7. package/dist/lib/ark.js +105 -0
  8. package/dist/lib/ark.js.map +1 -0
  9. package/dist/lib/auc.d.ts +67 -0
  10. package/dist/lib/auc.js +160 -0
  11. package/dist/lib/auc.js.map +1 -0
  12. package/dist/lib/client.d.ts +18 -0
  13. package/dist/lib/client.js +117 -0
  14. package/dist/lib/client.js.map +1 -0
  15. package/dist/lib/index.d.ts +8 -0
  16. package/dist/lib/index.js +9 -0
  17. package/dist/lib/index.js.map +1 -0
  18. package/dist/lib/search.d.ts +41 -0
  19. package/dist/lib/search.js +160 -0
  20. package/dist/lib/search.js.map +1 -0
  21. package/dist/lib/signer.d.ts +17 -0
  22. package/dist/lib/signer.js +58 -0
  23. package/dist/lib/signer.js.map +1 -0
  24. package/dist/lib/tos.d.ts +29 -0
  25. package/dist/lib/tos.js +93 -0
  26. package/dist/lib/tos.js.map +1 -0
  27. package/dist/lib/tts.d.ts +59 -0
  28. package/dist/lib/tts.js +126 -0
  29. package/dist/lib/tts.js.map +1 -0
  30. package/dist/lib/types.d.ts +34 -0
  31. package/dist/lib/types.js +15 -0
  32. package/dist/lib/types.js.map +1 -0
  33. package/dist/tools/auc.d.ts +34 -0
  34. package/dist/tools/auc.js +76 -0
  35. package/dist/tools/auc.js.map +1 -0
  36. package/dist/tools/image.d.ts +37 -0
  37. package/dist/tools/image.js +58 -0
  38. package/dist/tools/image.js.map +1 -0
  39. package/dist/tools/search.d.ts +38 -0
  40. package/dist/tools/search.js +56 -0
  41. package/dist/tools/search.js.map +1 -0
  42. package/dist/tools/tos.d.ts +30 -0
  43. package/dist/tools/tos.js +38 -0
  44. package/dist/tools/tos.js.map +1 -0
  45. package/dist/tools/tts.d.ts +43 -0
  46. package/dist/tools/tts.js +80 -0
  47. package/dist/tools/tts.js.map +1 -0
  48. package/package.json +48 -3
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 豆包语音合成大模型 - 单向流式 HTTP 接口(HTTP Chunked)。
3
+ * 文档: https://www.volcengine.com/docs/6561/1327536 (单向流式语音合成 HTTP)
4
+ * - Agent Plan 网关: POST https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional(ark- 密钥)
5
+ * - 语音控制台: POST https://openspeech.bytedance.com/api/v3/tts/unidirectional(X-Api-Key)
6
+ * 响应为流式 JSON 分片,每片 {code, message, data: base64音频, sentence?, usage?},拼接 data 直到流结束。
7
+ */
8
+ const PLAN_TTS_URL = 'https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional';
9
+ /** 语音控制台密钥使用的官方端点(Agent Plan 之外的接入方式,暂未暴露为工具参数) */
10
+ export const CONSOLE_TTS_URL = 'https://openspeech.bytedance.com/api/v3/tts/unidirectional';
11
+ export const TTS_DEFAULT_SPEAKER = 'zh_female_vv_uranus_bigtts'; // 豆包 2.0 通用女声
12
+ export const TTS_DEFAULT_RESOURCE_ID = 'seed-tts-2.0';
13
+ export const TTS_DEFAULT_SAMPLE_RATE = 24_000;
14
+ /** 从流式 buffer 中提取顶层 JSON 对象(兼容换行分隔与直接拼接两种分片方式) */
15
+ export function extractJsonObjects(buffer) {
16
+ const objects = [];
17
+ let depth = 0;
18
+ let start = -1;
19
+ let inString = false;
20
+ let escaped = false;
21
+ for (let i = 0; i < buffer.length; i++) {
22
+ const ch = buffer[i];
23
+ if (inString) {
24
+ if (escaped)
25
+ escaped = false;
26
+ else if (ch === '\\')
27
+ escaped = true;
28
+ else if (ch === '"')
29
+ inString = false;
30
+ continue;
31
+ }
32
+ if (ch === '"')
33
+ inString = true;
34
+ else if (ch === '{') {
35
+ if (depth === 0)
36
+ start = i;
37
+ depth++;
38
+ }
39
+ else if (ch === '}') {
40
+ depth--;
41
+ if (depth === 0 && start >= 0) {
42
+ objects.push(JSON.parse(buffer.slice(start, i + 1)));
43
+ start = -1;
44
+ }
45
+ }
46
+ }
47
+ // 字符串未闭合/对象未闭合的部分留给下一次
48
+ const rest = depth > 0 || inString ? buffer.slice(Math.max(start, 0)) : buffer.slice(buffer.length);
49
+ return { objects, rest };
50
+ }
51
+ /** 提交单向流式合成并收集完整音频。 */
52
+ export async function unidirectionalTts(opts) {
53
+ if (!opts.apiKey?.trim()) {
54
+ throw new Error('缺少 API Key,请配置环境变量 ARK_API_KEY');
55
+ }
56
+ if (!opts.text?.trim()) {
57
+ throw new Error('缺少待合成文本 text');
58
+ }
59
+ const format = opts.format ?? 'mp3';
60
+ const sampleRate = opts.sampleRate ?? TTS_DEFAULT_SAMPLE_RATE;
61
+ const endpoint = opts.endpoint ?? PLAN_TTS_URL;
62
+ const reqParams = {
63
+ text: opts.text,
64
+ speaker: opts.speaker ?? TTS_DEFAULT_SPEAKER,
65
+ audio_params: {
66
+ format,
67
+ sample_rate: sampleRate,
68
+ ...(opts.speechRate !== undefined ? { speech_rate: opts.speechRate } : {}),
69
+ ...(opts.loudnessRate !== undefined ? { loudness_rate: opts.loudnessRate } : {}),
70
+ },
71
+ ...(opts.model !== undefined ? { model: opts.model } : {}),
72
+ ...(opts.enableSubtitle !== undefined ? { enable_subtitle: opts.enableSubtitle } : {}),
73
+ ...(opts.explicitLanguage !== undefined ? { explicit_language: opts.explicitLanguage } : {}),
74
+ };
75
+ const res = await fetch(endpoint, {
76
+ method: 'POST',
77
+ headers: {
78
+ 'Content-Type': 'application/json',
79
+ Connection: 'keep-alive',
80
+ 'X-Api-Key': opts.apiKey.trim(),
81
+ 'X-Api-Resource-Id': opts.resourceId ?? TTS_DEFAULT_RESOURCE_ID,
82
+ 'X-Api-Request-Id': crypto.randomUUID(),
83
+ },
84
+ body: JSON.stringify({ req_params: reqParams }),
85
+ signal: AbortSignal.timeout(opts.timeoutMs ?? 300_000),
86
+ });
87
+ if (!res.ok || !res.body) {
88
+ const text = await res.text().catch(() => '');
89
+ throw new Error(`TTS 接口返回 ${res.status}:${text.slice(0, 300) || res.statusText}`);
90
+ }
91
+ const chunks = [];
92
+ let total = 0;
93
+ let sentence;
94
+ let usage;
95
+ let pending = '';
96
+ const decoder = new TextDecoder();
97
+ for await (const chunk of res.body) {
98
+ pending += decoder.decode(chunk, { stream: true });
99
+ const { objects, rest } = extractJsonObjects(pending);
100
+ pending = rest;
101
+ for (const obj of objects) {
102
+ const msg = obj;
103
+ // 成功码:0 或 20000000(openspeech 通用成功状态,与语音识别一致;实测 plan 网关返回后者)
104
+ if (typeof msg.code === 'number' && msg.code !== 0 && msg.code !== 20_000_000) {
105
+ throw new Error(`TTS 合成失败:code=${msg.code},message=${msg.message ?? '无'}`);
106
+ }
107
+ if (msg.sentence?.text)
108
+ sentence = msg.sentence;
109
+ if (msg.usage)
110
+ usage = msg.usage;
111
+ if (msg.data) {
112
+ const audio = Buffer.from(msg.data, 'base64');
113
+ chunks.push(audio);
114
+ total += audio.length;
115
+ }
116
+ }
117
+ }
118
+ if (pending.trim()) {
119
+ throw new Error(`TTS 响应存在未完成的 JSON 分片,疑似响应中断:${pending.slice(0, 120)}`);
120
+ }
121
+ if (total === 0) {
122
+ throw new Error('TTS 响应中没有音频数据');
123
+ }
124
+ return { audio: Buffer.concat(chunks, total), format, sampleRate, sentence, usage };
125
+ }
126
+ //# sourceMappingURL=tts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export interface VolcengineCredentials {
2
+ accessKeyId: string;
3
+ secretAccessKey: string;
4
+ }
5
+ export interface VolcengineApiRequest {
6
+ /** 请求方法,默认 GET */
7
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
8
+ /** API Action,如 DescribeInstances */
9
+ action: string;
10
+ /** API Version,如 2020-04-01 */
11
+ version: string;
12
+ /** 服务名(签名用),如 ecs / vpc / iam / vod */
13
+ service: string;
14
+ /** 服务 Host,如 ecs.cn-north-1.volcengineapi.com;缺省时由客户端按 service/region 推导 */
15
+ host?: string;
16
+ /** 区域,默认 cn-north-1 */
17
+ region?: string;
18
+ /** 业务参数;GET 时拼接为 query,POST 时作为 JSON body */
19
+ params?: Record<string, unknown>;
20
+ /** 额外 HTTP header(不要带签名相关 header) */
21
+ headers?: Record<string, string>;
22
+ }
23
+ export interface VolcengineApiResponse<T = unknown> {
24
+ status: number;
25
+ headers: Record<string, string>;
26
+ body: T;
27
+ }
28
+ export declare class VolcengineApiError extends Error {
29
+ readonly status: number;
30
+ readonly code: string | undefined;
31
+ readonly requestId: string | undefined;
32
+ readonly body?: unknown | undefined;
33
+ constructor(message: string, status: number, code: string | undefined, requestId: string | undefined, body?: unknown | undefined);
34
+ }
@@ -0,0 +1,15 @@
1
+ export class VolcengineApiError extends Error {
2
+ status;
3
+ code;
4
+ requestId;
5
+ body;
6
+ constructor(message, status, code, requestId, body) {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ this.requestId = requestId;
11
+ this.body = body;
12
+ this.name = 'VolcengineApiError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AA8BA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IACA;IACA;IACA;IALlB,YACE,OAAe,EACC,MAAc,EACd,IAAwB,EACxB,SAA6B,EAC7B,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAoB;QACxB,cAAS,GAAT,SAAS,CAAoB;QAC7B,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ export declare const asrTranscribeTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ url: z.ZodOptional<z.ZodString>;
7
+ file_path: z.ZodOptional<z.ZodString>;
8
+ format: z.ZodOptional<z.ZodString>;
9
+ language: z.ZodOptional<z.ZodString>;
10
+ model: z.ZodOptional<z.ZodEnum<["2.0", "1.0"]>>;
11
+ enable_speaker_info: z.ZodOptional<z.ZodBoolean>;
12
+ enable_punc: z.ZodOptional<z.ZodBoolean>;
13
+ enable_itn: z.ZodOptional<z.ZodBoolean>;
14
+ ssd_version: z.ZodOptional<z.ZodEnum<["200", "300"]>>;
15
+ timeout_seconds: z.ZodOptional<z.ZodNumber>;
16
+ };
17
+ handler: (args: {
18
+ url?: string;
19
+ file_path?: string;
20
+ format?: string;
21
+ language?: string;
22
+ model?: "2.0" | "1.0";
23
+ enable_speaker_info?: boolean;
24
+ enable_punc?: boolean;
25
+ enable_itn?: boolean;
26
+ ssd_version?: "200" | "300";
27
+ timeout_seconds?: number;
28
+ }) => Promise<{
29
+ content: {
30
+ type: "text";
31
+ text: string;
32
+ }[];
33
+ }>;
34
+ };
@@ -0,0 +1,76 @@
1
+ import { z } from 'zod';
2
+ import { buildObjectKey, detectFormat, renderTranscriptMd, resolveTosOptions, transcribeAudio, uploadToTos, } from '../lib/index.js';
3
+ export const asrTranscribeTool = {
4
+ name: 'auc_bigmodel_transcribe',
5
+ description: '火山引擎语音技术-大模型录音文件识别(端点 openspeech.bytedance.com/api/v3/auc/bigmodel/submit + query)。' +
6
+ '提交音频并轮询直到完成,返回全文、分句时间戳与说话人。音频源二选一:url(公网可访问)或 file_path(本地文件,自动上传 TOS 换取预签名地址,需 VOLC_TOS_* 配置)。需要环境变量 VOLC_ASR_API_KEY。',
7
+ inputSchema: {
8
+ url: z.string().optional().describe('音频公网 URL(与 file_path 二选一)'),
9
+ file_path: z.string().optional().describe('本地音频文件路径(与 url 二选一;自动上传 TOS 生成预签名 URL)'),
10
+ format: z
11
+ .string()
12
+ .optional()
13
+ .describe('音频格式(wav/mp3/ogg/spx/amr/aac/m4a);不传时从 url/file_path 扩展名推断'),
14
+ language: z.string().optional().describe('语言,如 zh / en;不传自动检测'),
15
+ model: z.enum(['2.0', '1.0']).optional().describe('模型版本,默认 2.0(1.0 为旧版)'),
16
+ enable_speaker_info: z.boolean().optional().describe('是否区分说话人(说话人分离)'),
17
+ enable_punc: z.boolean().optional().describe('是否加标点'),
18
+ enable_itn: z.boolean().optional().describe('是否做数字规整(ITN)'),
19
+ ssd_version: z.enum(['200', '300']).optional().describe('说话人分离模型:200 非会议(≤5人) / 300 长会议声纹'),
20
+ timeout_seconds: z.number().int().positive().optional().describe('轮询超时(秒),默认 600'),
21
+ },
22
+ handler: async (args) => {
23
+ if (!args.url && !args.file_path) {
24
+ throw new Error('url 与 file_path 至少提供一个');
25
+ }
26
+ let audioUrl = args.url;
27
+ let source = audioUrl ?? args.file_path;
28
+ if (args.file_path) {
29
+ const tos = resolveTosOptions({ prefix: 'asr' });
30
+ const key = buildObjectKey(tos.prefix, new Date().toISOString().slice(0, 10), args.file_path);
31
+ const uploaded = await uploadToTos(tos, args.file_path, key);
32
+ audioUrl = uploaded.url;
33
+ source = args.file_path;
34
+ }
35
+ const format = args.format ?? detectFormat(source);
36
+ if (!format) {
37
+ throw new Error('无法从扩展名推断音频格式,请显式传 format(wav/mp3/ogg/spx/amr/aac/m4a)');
38
+ }
39
+ const apiKey = process.env.VOLC_ASR_API_KEY;
40
+ if (!apiKey?.trim()) {
41
+ throw new Error('缺少环境变量 VOLC_ASR_API_KEY(火山语音控制台的 X-Api-Key)');
42
+ }
43
+ const result = await transcribeAudio({
44
+ apiKey: apiKey.trim(),
45
+ url: audioUrl,
46
+ format,
47
+ language: args.language,
48
+ model: args.model,
49
+ enableSpeakerInfo: args.enable_speaker_info,
50
+ enablePunc: args.enable_punc,
51
+ enableItn: args.enable_itn,
52
+ ssdVersion: args.ssd_version,
53
+ timeoutMs: args.timeout_seconds ? args.timeout_seconds * 1000 : undefined,
54
+ });
55
+ return {
56
+ content: [
57
+ {
58
+ type: 'text',
59
+ text: JSON.stringify({
60
+ ok: true,
61
+ task_id: result.taskId,
62
+ audio_url: audioUrl,
63
+ format,
64
+ text: result.text,
65
+ utterances_count: result.utterances.length,
66
+ }, null, 2),
67
+ },
68
+ {
69
+ type: 'text',
70
+ text: renderTranscriptMd(result.utterances),
71
+ },
72
+ ],
73
+ };
74
+ },
75
+ };
76
+ //# sourceMappingURL=auc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auc.js","sourceRoot":"","sources":["../../src/tools/auc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ /** 方舟密钥必须显式配置 ARK_API_KEY;ANTHROPIC_* 等环境变量不一定是火山的,不做回退 */
3
+ export declare function resolveArkApiKey(): string;
4
+ export declare const generateImageTool: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ prompt: z.ZodString;
9
+ output_path: z.ZodString;
10
+ model: z.ZodOptional<z.ZodString>;
11
+ size: z.ZodOptional<z.ZodString>;
12
+ watermark: z.ZodOptional<z.ZodBoolean>;
13
+ seed: z.ZodOptional<z.ZodNumber>;
14
+ format: z.ZodOptional<z.ZodEnum<["png", "jpeg"]>>;
15
+ };
16
+ handler: (args: {
17
+ prompt: string;
18
+ output_path: string;
19
+ model?: string;
20
+ size?: string;
21
+ watermark?: boolean;
22
+ seed?: number;
23
+ format?: "png" | "jpeg";
24
+ }) => Promise<{
25
+ content: ({
26
+ type: "text";
27
+ text: string;
28
+ data?: undefined;
29
+ mimeType?: undefined;
30
+ } | {
31
+ type: "image";
32
+ data: string;
33
+ mimeType: string;
34
+ text?: undefined;
35
+ })[];
36
+ }>;
37
+ };
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { ARK_DEFAULT_IMAGE_MODEL, ARK_DEFAULT_SIZE, arkDownloadImage, arkGenerateImage, } from '../lib/index.js';
3
+ const ARK_DEFAULT_MODEL_HINT = ARK_DEFAULT_IMAGE_MODEL;
4
+ /** 方舟密钥必须显式配置 ARK_API_KEY;ANTHROPIC_* 等环境变量不一定是火山的,不做回退 */
5
+ export function resolveArkApiKey() {
6
+ const key = process.env.ARK_API_KEY;
7
+ if (!key?.trim() || !/^ark-[A-Za-z0-9-]+$/.test(key.trim())) {
8
+ throw new Error('缺少有效的方舟 API Key(ark- 开头),请配置环境变量 ARK_API_KEY');
9
+ }
10
+ return key.trim();
11
+ }
12
+ /** 输出格式跟随落盘扩展名(.png→png、.jpg/.jpeg→jpeg),未识别时默认 png;可用 format 参数覆盖 */
13
+ function deriveFormat(outputPath, format) {
14
+ if (format)
15
+ return format;
16
+ const ext = (outputPath.match(/\.([a-z0-9]+)$/i)?.[1] ?? '').toLowerCase();
17
+ return ext === 'jpg' || ext === 'jpeg' ? 'jpeg' : 'png';
18
+ }
19
+ export const generateImageTool = {
20
+ name: 'plan_images_generations',
21
+ description: '火山方舟图片生成(端点 /api/plan/v3/images/generations,Seedream 文生图)。输入 prompt 与保存路径,生成图片并落盘,同时把图片直接返回给 Agent 查看。' +
22
+ `默认模型 ${ARK_DEFAULT_MODEL_HINT},默认尺寸 ${ARK_DEFAULT_SIZE}(宽x高,或 1K/2K/4K)。`,
23
+ inputSchema: {
24
+ prompt: z.string().min(1).describe('生图提示词。图上要出现的文字用「」原样写进 prompt'),
25
+ output_path: z.string().min(1).describe('图片保存的绝对路径(.png 或 .jpg,格式跟随扩展名)'),
26
+ model: z.string().optional().describe(`模型 ID,默认 ${ARK_DEFAULT_MODEL_HINT}`),
27
+ size: z.string().optional().describe('图片尺寸,宽x高如 2048x1152,或 1K/2K/4K,默认 1728x2304'),
28
+ watermark: z.boolean().optional().describe('是否加水印,默认 false'),
29
+ seed: z.number().int().optional().describe('随机种子,固定 seed 可复现同一张图'),
30
+ format: z.enum(['png', 'jpeg']).optional().describe('覆盖输出格式(默认跟随 output_path 扩展名)'),
31
+ },
32
+ handler: async (args) => {
33
+ const apiKey = resolveArkApiKey();
34
+ const outputFormat = deriveFormat(args.output_path, args.format);
35
+ const result = await arkGenerateImage({
36
+ apiKey,
37
+ prompt: args.prompt,
38
+ model: args.model,
39
+ size: args.size,
40
+ watermark: args.watermark,
41
+ seed: args.seed,
42
+ outputFormat,
43
+ });
44
+ const { path, bytes } = await arkDownloadImage(result.url, args.output_path);
45
+ const mimeType = result.outputFormat === 'jpeg' ? 'image/jpeg' : 'image/png';
46
+ const base64 = (await import('node:fs')).readFileSync(path).toString('base64');
47
+ return {
48
+ content: [
49
+ {
50
+ type: 'text',
51
+ text: JSON.stringify({ ok: true, model: result.model, output: path, size: result.size, format: result.outputFormat, bytes }, null, 2),
52
+ },
53
+ { type: 'image', data: base64, mimeType },
54
+ ],
55
+ };
56
+ },
57
+ };
58
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/tools/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ export declare const webSearchTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ query: z.ZodString;
7
+ count: z.ZodOptional<z.ZodNumber>;
8
+ search_type: z.ZodOptional<z.ZodEnum<["web", "image"]>>;
9
+ time_range: z.ZodOptional<z.ZodString>;
10
+ auth_level: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<0>, z.ZodLiteral<1>]>>;
11
+ need_content: z.ZodOptional<z.ZodBoolean>;
12
+ need_url: z.ZodOptional<z.ZodBoolean>;
13
+ sites: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
14
+ block_hosts: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
15
+ industry: z.ZodOptional<z.ZodEnum<["finance", "game", "gov"]>>;
16
+ query_rewrite: z.ZodOptional<z.ZodBoolean>;
17
+ content_formats: z.ZodOptional<z.ZodEnum<["text", "markdown"]>>;
18
+ };
19
+ handler: (args: {
20
+ query: string;
21
+ count?: number;
22
+ search_type?: "web" | "image";
23
+ time_range?: string;
24
+ auth_level?: 0 | 1;
25
+ need_content?: boolean;
26
+ need_url?: boolean;
27
+ sites?: string[];
28
+ block_hosts?: string[];
29
+ industry?: "finance" | "game" | "gov";
30
+ query_rewrite?: boolean;
31
+ content_formats?: "text" | "markdown";
32
+ }) => Promise<{
33
+ content: {
34
+ type: "text";
35
+ text: string;
36
+ }[];
37
+ }>;
38
+ };
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { buildWebSearchPayload, webSearchByAkSk, webSearchByApiKey } from '../lib/index.js';
3
+ /** 鉴权二选一:搜索 API Key(feedcoopapi 网关)或火山 AK/SK(V4 签名 mercury 网关) */
4
+ function resolveSearchAuth() {
5
+ const apiKey = process.env.ASK_ECHO_SEARCH_INFINITY_API_KEY;
6
+ if (apiKey?.trim())
7
+ return { mode: 'api-key', apiKey: apiKey.trim() };
8
+ const ak = process.env.VOLCENGINE_ACCESS_KEY;
9
+ const sk = process.env.VOLCENGINE_SECRET_KEY;
10
+ if (ak?.trim() && sk?.trim())
11
+ return { mode: 'ak-sk', ak: ak.trim(), sk: sk.trim() };
12
+ throw new Error('缺少搜索鉴权配置,请设置环境变量 ASK_ECHO_SEARCH_INFINITY_API_KEY,或同时设置 VOLCENGINE_ACCESS_KEY / VOLCENGINE_SECRET_KEY');
13
+ }
14
+ export const webSearchTool = {
15
+ name: 'askecho_web_search',
16
+ description: '火山引擎联网搜索(豆包搜索,服务 volc_torchlight_api,Action WebSearch)。支持网页与图片搜索,可按时间/站点/行业过滤、返回正文。' +
17
+ '鉴权二选一:ASK_ECHO_SEARCH_INFINITY_API_KEY 或 VOLCENGINE_ACCESS_KEY + VOLCENGINE_SECRET_KEY。',
18
+ inputSchema: {
19
+ query: z.string().min(1).max(100).describe('搜索 query,1~100 个字符'),
20
+ count: z.number().int().optional().describe('返回条数,web 默认 10(最多 50),image 默认 5(最多 5)'),
21
+ search_type: z.enum(['web', 'image']).optional().describe('搜索类型,默认 web'),
22
+ time_range: z.string().optional().describe('时间范围,OneDay/OneWeek/OneMonth/OneYear 或 YYYY-MM-DD..YYYY-MM-DD,仅 web'),
23
+ auth_level: z.union([z.literal(0), z.literal(1)]).optional().describe('权威等级过滤,1 = 非常权威,仅 web'),
24
+ need_content: z.boolean().optional().describe('是否返回网页正文,仅 web'),
25
+ need_url: z.boolean().optional().describe('是否返回网页 URL,仅 web'),
26
+ sites: z.array(z.string()).optional().describe('仅搜索指定站点,最多 20 个,仅 web'),
27
+ block_hosts: z.array(z.string()).optional().describe('排除指定站点,最多 5 个,仅 web'),
28
+ industry: z.enum(['finance', 'game', 'gov']).optional().describe('行业搜索,仅 web'),
29
+ query_rewrite: z.boolean().optional().describe('是否启用查询改写'),
30
+ content_formats: z.enum(['text', 'markdown']).optional().describe('网页正文格式,仅 web'),
31
+ },
32
+ handler: async (args) => {
33
+ const payload = buildWebSearchPayload({
34
+ query: args.query,
35
+ count: args.count,
36
+ searchType: args.search_type,
37
+ timeRange: args.time_range,
38
+ authLevel: args.auth_level,
39
+ needContent: args.need_content,
40
+ needUrl: args.need_url,
41
+ sites: args.sites,
42
+ blockHosts: args.block_hosts,
43
+ industry: args.industry,
44
+ queryRewrite: args.query_rewrite,
45
+ contentFormats: args.content_formats,
46
+ });
47
+ const auth = resolveSearchAuth();
48
+ const body = auth.mode === 'api-key'
49
+ ? await webSearchByApiKey(auth.apiKey, payload)
50
+ : await webSearchByAkSk({ accessKeyId: auth.ak, secretAccessKey: auth.sk }, payload);
51
+ return {
52
+ content: [{ type: 'text', text: JSON.stringify(body, null, 2) }],
53
+ };
54
+ },
55
+ };
56
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { z } from 'zod';
2
+ export declare const tosPutObjectTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ file_path: z.ZodString;
7
+ key: z.ZodOptional<z.ZodString>;
8
+ prefix: z.ZodOptional<z.ZodString>;
9
+ expires: z.ZodOptional<z.ZodNumber>;
10
+ content_type: z.ZodOptional<z.ZodString>;
11
+ bucket: z.ZodOptional<z.ZodString>;
12
+ region: z.ZodOptional<z.ZodString>;
13
+ endpoint: z.ZodOptional<z.ZodString>;
14
+ };
15
+ handler: (args: {
16
+ file_path: string;
17
+ key?: string;
18
+ prefix?: string;
19
+ expires?: number;
20
+ content_type?: string;
21
+ bucket?: string;
22
+ region?: string;
23
+ endpoint?: string;
24
+ }) => Promise<{
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ }>;
30
+ };
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { buildObjectKey, resolveTosOptions, uploadToTos } from '../lib/index.js';
3
+ export const tosPutObjectTool = {
4
+ name: 'tos_object_put',
5
+ description: '上传本地文件到火山引擎 TOS(API Action: PutObject,对应工具名 tos_object_put = 服务_资源_动作),bucket 保持私有,返回预签名下载 URL(默认 24h 有效)。' +
6
+ '对象 key 默认为 <prefix>/<YYYY-MM-DD>/<文件名>。需要环境变量 VOLC_TOS_ACCESS_KEY / VOLC_TOS_SECRET_KEY / VOLC_TOS_BUCKET / VOLC_TOS_REGION。',
7
+ inputSchema: {
8
+ file_path: z.string().min(1).describe('要上传的本地文件路径(绝对路径)'),
9
+ key: z.string().optional().describe('完整对象 key;不传则自动生成 <prefix>/<日期>/<文件名>'),
10
+ prefix: z.string().optional().describe('key 前缀,默认取 VOLC_TOS_PREFIX,再默认 volcengine-api-mcp'),
11
+ expires: z.number().int().positive().optional().describe('预签名 URL 有效期(秒),默认 86400(24h)'),
12
+ content_type: z.string().optional().describe('覆盖 Content-Type(默认按扩展名推导,未知类型为 application/octet-stream)'),
13
+ bucket: z.string().optional().describe('覆盖默认 bucket'),
14
+ region: z.string().optional().describe('覆盖默认 region'),
15
+ endpoint: z.string().optional().describe('覆盖默认 endpoint'),
16
+ },
17
+ handler: async (args) => {
18
+ const opts = resolveTosOptions({ bucket: args.bucket, region: args.region, endpoint: args.endpoint, prefix: args.prefix });
19
+ const key = args.key ?? buildObjectKey(opts.prefix, new Date().toISOString().slice(0, 10), args.file_path);
20
+ const result = await uploadToTos(opts, args.file_path, key, args.expires, args.content_type);
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: JSON.stringify({
26
+ ok: true,
27
+ bucket: result.bucket,
28
+ key: result.key,
29
+ bytes: result.bytes,
30
+ url: result.url,
31
+ url_expires_seconds: args.expires ?? 86_400,
32
+ }, null, 2),
33
+ },
34
+ ],
35
+ };
36
+ },
37
+ };
38
+ //# sourceMappingURL=tos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tos.js","sourceRoot":"","sources":["../../src/tools/tos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,4GAA4G;QAC5G,8HAA8H;IAChI,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACzD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC3F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACxF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;QACxG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KAC1D;IACD,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3G,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,EAAE,EAAE,IAAI;wBACR,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,mBAAmB,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;qBAC5C,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { z } from 'zod';
2
+ export declare const ttsUnidirectionalTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ text: z.ZodString;
7
+ output_path: z.ZodString;
8
+ speaker: z.ZodOptional<z.ZodString>;
9
+ resource_id: z.ZodOptional<z.ZodString>;
10
+ model: z.ZodOptional<z.ZodString>;
11
+ format: z.ZodOptional<z.ZodEnum<["mp3", "pcm", "ogg_opus", "wav"]>>;
12
+ sample_rate: z.ZodOptional<z.ZodNumber>;
13
+ speech_rate: z.ZodOptional<z.ZodNumber>;
14
+ loudness_rate: z.ZodOptional<z.ZodNumber>;
15
+ enable_subtitle: z.ZodOptional<z.ZodBoolean>;
16
+ explicit_language: z.ZodOptional<z.ZodString>;
17
+ };
18
+ handler: (args: {
19
+ text: string;
20
+ output_path: string;
21
+ speaker?: string;
22
+ resource_id?: string;
23
+ model?: string;
24
+ format?: "mp3" | "pcm" | "ogg_opus" | "wav";
25
+ sample_rate?: number;
26
+ speech_rate?: number;
27
+ loudness_rate?: number;
28
+ enable_subtitle?: boolean;
29
+ explicit_language?: string;
30
+ }) => Promise<{
31
+ content: ({
32
+ type: "text";
33
+ text: string;
34
+ data?: undefined;
35
+ mimeType?: undefined;
36
+ } | {
37
+ type: "audio";
38
+ data: string;
39
+ mimeType: string;
40
+ text?: undefined;
41
+ })[];
42
+ }>;
43
+ };