@fastthree-ai/mcp 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js ADDED
@@ -0,0 +1,97 @@
1
+ /**
2
+ * HTTP 客户端:封装 /api/open/v1 的鉴权与 CommonResult 包络解析。
3
+ *
4
+ * LLM 的 /chat/completions 不走 CommonResult 包络(OpenAI 兼容格式),
5
+ * 故 chat_completion 走 requestRaw 自行处理响应。
6
+ */
7
+ export class ApiError extends Error {
8
+ code;
9
+ constructor(code, message) {
10
+ super(message);
11
+ this.code = code;
12
+ this.name = "ApiError";
13
+ }
14
+ }
15
+ export function resolveBaseUrl() {
16
+ const url = process.env.FT_API_BASE_URL || "https://ai-api.fastthree.com";
17
+ return url.replace(/\/$/, "");
18
+ }
19
+ export function resolveToken() {
20
+ const t = process.env.FT_API_TOKEN;
21
+ if (!t)
22
+ throw new Error("缺少环境变量 FT_API_TOKEN");
23
+ return t;
24
+ }
25
+ /** 调用 GET/POST,自动解 CommonResult 包络;后端 HTTP 永远 200,code != 0/200 视为失败 */
26
+ export async function request(method, path, options = {}) {
27
+ const url = `${resolveBaseUrl()}${path}`;
28
+ const headers = {
29
+ Authorization: `Bearer ${resolveToken()}`,
30
+ "Content-Type": "application/json",
31
+ };
32
+ const init = { method, headers };
33
+ if (options.body !== undefined && method !== "GET") {
34
+ init.body = JSON.stringify(options.body);
35
+ }
36
+ const resp = await fetch(url, init);
37
+ const text = await resp.text();
38
+ let payload = null;
39
+ try {
40
+ payload = text ? JSON.parse(text) : null;
41
+ }
42
+ catch {
43
+ throw new ApiError(resp.status, `响应解析失败: ${text.slice(0, 200)}`);
44
+ }
45
+ if (payload && typeof payload.code === "number" && payload.code !== 0 && payload.code !== 200) {
46
+ throw new ApiError(payload.code, payload.message || `请求失败 (code=${payload.code})`);
47
+ }
48
+ if (!payload || payload.data === undefined) {
49
+ throw new ApiError(resp.status, `响应格式异常: ${text.slice(0, 200)}`);
50
+ }
51
+ return payload.data;
52
+ }
53
+ /** 不解包络的请求,用于 LLM chat/completions(OpenAI 兼容格式,无 CommonResult 包装) */
54
+ export async function requestRaw(method, path, options = {}) {
55
+ const url = `${resolveBaseUrl()}${path}`;
56
+ const headers = {
57
+ Authorization: `Bearer ${resolveToken()}`,
58
+ "Content-Type": "application/json",
59
+ };
60
+ const init = { method, headers };
61
+ if (options.body !== undefined && method !== "GET") {
62
+ init.body = JSON.stringify(options.body);
63
+ }
64
+ const resp = await fetch(url, init);
65
+ const text = await resp.text();
66
+ let json = null;
67
+ try {
68
+ json = text ? JSON.parse(text) : null;
69
+ }
70
+ catch {
71
+ // 留空
72
+ }
73
+ return { status: resp.status, json, text };
74
+ }
75
+ /** 上传图片二进制,返回可直接填入出图参数的 URL */
76
+ export async function uploadImageBuffer(buf, filename) {
77
+ const form = new FormData();
78
+ form.append("file", new Blob([buf]), filename);
79
+ const resp = await fetch(`${resolveBaseUrl()}/api/open/v1/upload`, {
80
+ method: "POST",
81
+ headers: { Authorization: `Bearer ${resolveToken()}` },
82
+ body: form,
83
+ });
84
+ const text = await resp.text();
85
+ let payload = null;
86
+ try {
87
+ payload = text ? JSON.parse(text) : null;
88
+ }
89
+ catch {
90
+ throw new ApiError(resp.status, `上传响应解析失败: ${text.slice(0, 200)}`);
91
+ }
92
+ if (!payload || (payload.code !== 0 && payload.code !== 200)) {
93
+ throw new ApiError(payload?.code ?? resp.status, payload?.message || "上传失败");
94
+ }
95
+ return payload.data;
96
+ }
97
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACd;IAAnB,YAAmB,IAAY,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,8BAA8B,CAAC;IAC1E,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC;AAQD,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,IAAY,EACZ,UAA8B,EAAE;IAEhC,MAAM,GAAG,GAAG,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,YAAY,EAAE,EAAE;QACzC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC9F,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,OAAO,CAAC,IAAS,CAAC;AAC3B,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,UAA8B,EAAE;IAEhC,MAAM,GAAG,GAAG,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,YAAY,EAAE,EAAE;QACzC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,KAAK;IACP,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,QAAgB;IACnE,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,EAAE,qBAAqB,EAAE;QACjE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,YAAY,EAAE,EAAE,EAAE;QACtD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,GAA6B,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,OAAO,CAAC,IAAc,CAAC;AAChC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ft-mcp — FastThree Model Context Protocol Server 入口
4
+ *
5
+ * 通过 stdio 传输与 MCP 客户端(Claude Desktop / Cursor / VS Code 等)通信。
6
+ * 客户端配置 mcp.json 时通过环境变量传入凭据:
7
+ * FT_API_BASE_URL — 后端 base URL(默认 https://ai-api.fastthree.com)
8
+ * FT_API_TOKEN — API Token(Authorization: Bearer 凭据)
9
+ *
10
+ * 暴露的 tools 见 ./tools.ts。
11
+ */
12
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
15
+ import { registerAllTools, handleCall } from "./tools.js";
16
+ const server = new Server({ name: "ft-mcp", version: "0.2.0" }, { capabilities: { tools: {} } });
17
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
18
+ tools: registerAllTools(),
19
+ }));
20
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
21
+ try {
22
+ return await handleCall(req.params.name, req.params.arguments ?? {});
23
+ }
24
+ catch (err) {
25
+ const msg = err instanceof Error ? err.message : String(err);
26
+ return {
27
+ content: [{ type: "text", text: `❌ ${msg}` }],
28
+ isError: true,
29
+ };
30
+ }
31
+ });
32
+ const transport = new StdioServerTransport();
33
+ await server.connect(transport);
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EACpC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,gBAAgB,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI;SACmC,CAAC;IACrD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
package/dist/tools.js ADDED
@@ -0,0 +1,263 @@
1
+ import { request, requestRaw, uploadImageBuffer } from "./client.js";
2
+ /**
3
+ * 与 OpenApiController.ALLOWED_OPEN_API_KEYS 同口径——加新接口时两侧都要改。
4
+ * 这里只列「允许直接点名」的 22 个;详情图/风格复刻那 10 个被 BLOCKED,不在册。
5
+ */
6
+ const DRAW_MODELS = [
7
+ ["matting", "抠图"],
8
+ ["extract", "图案提取(主档)"],
9
+ ["extract-fast", "图案提取(快速档)"],
10
+ ["extract-ultra", "图案提取(超清档)"],
11
+ ["image-edit", "图像编辑(主档)"],
12
+ ["image-edit-fast", "图像编辑(快速档)"],
13
+ ["image-edit-ultra", "图像编辑(超清档)"],
14
+ ["image-edit-2.5", "图像编辑 2.5(主档)"],
15
+ ["image-edit-2.5-fast", "图像编辑 2.5(快速档)"],
16
+ ["image-edit-2.5-plus", "图像编辑 2.5(增强档)"],
17
+ ["image-edit-2.5-ultra", "图像编辑 2.5(超清档)"],
18
+ ["image-edit-2.5-max", "图像编辑 2.5(顶配档)"],
19
+ ["seamless-tile", "无缝拼贴"],
20
+ ["seamless-tile-fast", "无缝拼贴(快速档)"],
21
+ ["pattern-extract-rh", "图案提取 RH"],
22
+ ["upscale", "超分辨率放大"],
23
+ ["image-expand", "扩图"],
24
+ ["nano banana 2", "Nano Banana 2"],
25
+ ["nano banana pro", "Nano Banana Pro"],
26
+ ["nano-banana-lite", "Nano Banana Lite"],
27
+ ["turbo", "Turbo"],
28
+ ["cut-pieces", "裁片提取(按片计费)"],
29
+ ];
30
+ export function registerAllTools() {
31
+ return [
32
+ {
33
+ name: "account_info",
34
+ description: "查询 FastThree 账户的算力、积分、会员档位。",
35
+ inputSchema: { type: "object", properties: {} },
36
+ },
37
+ {
38
+ name: "list_llm_models",
39
+ description: "列出可调用的 LLM 模型 ID(用于 chat_completion 的 model 参数)。",
40
+ inputSchema: { type: "object", properties: {} },
41
+ },
42
+ {
43
+ name: "list_draw_models",
44
+ description: "列出可调用的出图模型 api_key(作为 draw_image 的 apiKey 参数)。返回每个 key 的简要说明。",
45
+ inputSchema: { type: "object", properties: {} },
46
+ },
47
+ {
48
+ name: "upload_image",
49
+ description: "上传本地图片到 FastThree,返回可填入 draw_image 图片类参数(image/reference_images 等)的 URL。" +
50
+ "当图片已是公网可访问 URL 时跳过此步直接用。",
51
+ inputSchema: {
52
+ type: "object",
53
+ properties: {
54
+ fileBase64: { type: "string", description: "图片二进制内容的 base64 编码" },
55
+ filename: { type: "string", description: "文件名(含扩展名,用于 MIME 推断)" },
56
+ },
57
+ required: ["fileBase64", "filename"],
58
+ },
59
+ },
60
+ {
61
+ name: "draw_image",
62
+ description: "提交出图任务(异步)。返回受理回执(含 taskId),调用方需再调 get_task 查询最终状态与结果 URL。" +
63
+ "出图任务通常需要数秒到数十秒。如需同步等待结果请用 draw_image_wait。",
64
+ inputSchema: {
65
+ type: "object",
66
+ properties: {
67
+ apiKey: {
68
+ type: "string",
69
+ description: "出图模型标识,例如 matting / extract / image-edit / image-edit-2.5 / seamless-tile / upscale / image-expand / nano banana 2 等。完整列表见 list_draw_models。",
70
+ },
71
+ params: {
72
+ type: "object",
73
+ description: "模型参数键值对。常见键:prompt、image(URL,由 upload_image 返回)、output_tier(fast/plus/ultra/max)、reference_images(URL 数组)等。具体可用键随 apiKey 变化。",
74
+ },
75
+ callbackUrl: { type: "string", description: "回调 URL(可选)" },
76
+ callbackSecret: {
77
+ type: "string",
78
+ description: "回调密钥(16~256 字符,与 callbackUrl 同时提供)",
79
+ },
80
+ },
81
+ required: ["apiKey", "params"],
82
+ },
83
+ },
84
+ {
85
+ name: "draw_image_wait",
86
+ description: "提交出图任务并同步等待结果(在 180 秒内轮询完成)。" +
87
+ "返回最终任务对象(status=success/failed 或超时时的当前状态)。" +
88
+ "适合不希望自己写轮询循环的调用方;如要更细的控制请用 draw_image + get_task。",
89
+ inputSchema: {
90
+ type: "object",
91
+ properties: {
92
+ apiKey: { type: "string", description: "出图模型标识,见 list_draw_models。" },
93
+ params: {
94
+ type: "object",
95
+ description: "模型参数键值对,同 draw_image。",
96
+ },
97
+ callbackUrl: { type: "string", description: "回调 URL(可选)" },
98
+ callbackSecret: { type: "string", description: "回调密钥(与 callbackUrl 同时提供)" },
99
+ timeoutMs: {
100
+ type: "integer",
101
+ description: "同步等待超时毫秒数,默认 180000。",
102
+ },
103
+ },
104
+ required: ["apiKey", "params"],
105
+ },
106
+ },
107
+ {
108
+ name: "get_task",
109
+ description: "按任务 ID 查询出图任务的状态与结果 URL(draw_image 返回的 taskId)。",
110
+ inputSchema: {
111
+ type: "object",
112
+ properties: {
113
+ id: { type: "string", description: "任务 ID" },
114
+ },
115
+ required: ["id"],
116
+ },
117
+ },
118
+ {
119
+ name: "chat_completion",
120
+ description: "OpenAI 兼容的 LLM 聊天补全(非流式)。一次性返回完整响应。" +
121
+ "model 取值见 list_llm_models;messages 角色为 system/user/assistant。",
122
+ inputSchema: {
123
+ type: "object",
124
+ properties: {
125
+ model: { type: "string", description: "模型 ID(见 list_llm_models)" },
126
+ messages: {
127
+ type: "array",
128
+ items: {
129
+ type: "object",
130
+ properties: {
131
+ role: { type: "string", enum: ["system", "user", "assistant"] },
132
+ content: { type: "string" },
133
+ },
134
+ required: ["role", "content"],
135
+ },
136
+ },
137
+ max_tokens: { type: "integer", description: "最大生成 token 数" },
138
+ temperature: { type: "number", description: "采样温度(可选)" },
139
+ },
140
+ required: ["model", "messages"],
141
+ },
142
+ },
143
+ ];
144
+ }
145
+ /**
146
+ * SDK 1.30 把 CallToolRequestSchema handler 的返回类型收紧为 ServerResult | ResultT
147
+ * 联合,自定义 interface 不被接受;直接用官方 CallToolResult 类型,content 元素的
148
+ * type 用 `as const` 让字面量收窄到 "text" 字面量类型。
149
+ */
150
+ function ok(text) {
151
+ return { content: [{ type: "text", text }] };
152
+ }
153
+ function err(text) {
154
+ return { content: [{ type: "text", text }], isError: true };
155
+ }
156
+ export async function handleCall(name, args) {
157
+ try {
158
+ switch (name) {
159
+ case "account_info": {
160
+ const data = await request("GET", "/api/open/v1/account");
161
+ return ok(JSON.stringify(data, null, 2));
162
+ }
163
+ case "list_llm_models": {
164
+ const data = await request("GET", "/api/open/v1/models");
165
+ const ids = (data?.data || []).map((m) => m.id);
166
+ return ok(`可用 LLM 模型:\n${ids.map((i) => `- ${i}`).join("\n")}`);
167
+ }
168
+ case "list_draw_models": {
169
+ const lines = DRAW_MODELS.map(([k, d]) => `- ${k} ${d}`).join("\n");
170
+ return ok(`可调用的出图模型 api_key:\n${lines}`);
171
+ }
172
+ case "upload_image": {
173
+ const b64 = String(args.fileBase64 || "");
174
+ const filename = String(args.filename || "image.png");
175
+ if (!b64)
176
+ return err("fileBase64 不能为空");
177
+ const buf = Buffer.from(b64, "base64");
178
+ const url = await uploadImageBuffer(buf, filename);
179
+ return ok(url);
180
+ }
181
+ case "draw_image": {
182
+ const apiKey = String(args.apiKey || "").trim();
183
+ if (!apiKey)
184
+ return err("apiKey 不能为空");
185
+ const params = args.params || {};
186
+ const body = { ...params };
187
+ if (args.callbackUrl)
188
+ body.callback_url = String(args.callbackUrl);
189
+ if (args.callbackSecret)
190
+ body.callback_secret = String(args.callbackSecret);
191
+ const data = await request("POST", `/api/open/v1/tasks/${encodeURIComponent(apiKey)}`, { body });
192
+ return ok(JSON.stringify(data, null, 2));
193
+ }
194
+ case "draw_image_wait": {
195
+ const apiKey = String(args.apiKey || "").trim();
196
+ if (!apiKey)
197
+ return err("apiKey 不能为空");
198
+ const params = args.params || {};
199
+ const body = { ...params };
200
+ if (args.callbackUrl)
201
+ body.callback_url = String(args.callbackUrl);
202
+ if (args.callbackSecret)
203
+ body.callback_secret = String(args.callbackSecret);
204
+ // 1. 提交任务拿 taskId
205
+ const submit = await request("POST", `/api/open/v1/tasks/${encodeURIComponent(apiKey)}`, { body });
206
+ const taskId = submit?.taskId;
207
+ if (!taskId) {
208
+ // 没拿到 taskId,直接返回提交响应
209
+ return ok(JSON.stringify(submit, null, 2));
210
+ }
211
+ // 2. 轮询直到 status=success/failed 或超时
212
+ const timeoutMs = Number(args.timeoutMs) || 180_000;
213
+ const deadline = Date.now() + timeoutMs;
214
+ const pollInterval = 2_000;
215
+ let last = submit;
216
+ while (Date.now() < deadline) {
217
+ const task = await request("GET", `/api/open/v1/tasks/${encodeURIComponent(taskId)}`);
218
+ last = task;
219
+ const status = String(task?.status || "").toLowerCase();
220
+ if (["success", "failed", "error", "cancelled"].includes(status)) {
221
+ return ok(JSON.stringify(task, null, 2));
222
+ }
223
+ await new Promise((r) => setTimeout(r, pollInterval));
224
+ }
225
+ // 超时:返回最后一次状态 + 标记
226
+ return ok(JSON.stringify(last, null, 2) +
227
+ "\n(超时:任务尚未完成,请用 get_task 继续查询)");
228
+ }
229
+ case "get_task": {
230
+ const id = String(args.id ?? "").trim();
231
+ if (!id)
232
+ return err("id 不能为空");
233
+ const data = await request("GET", `/api/open/v1/tasks/${encodeURIComponent(id)}`);
234
+ return ok(JSON.stringify(data, null, 2));
235
+ }
236
+ case "chat_completion": {
237
+ const body = {
238
+ model: args.model,
239
+ messages: args.messages,
240
+ stream: false,
241
+ };
242
+ if (args.max_tokens)
243
+ body.max_tokens = Number(args.max_tokens);
244
+ if (args.temperature !== undefined)
245
+ body.temperature = Number(args.temperature);
246
+ const r = await requestRaw("POST", "/api/open/v1/chat/completions", { body });
247
+ const errPayload = r.json?.error;
248
+ if (r.status >= 400 || errPayload) {
249
+ const msg = errPayload?.message || r.text.slice(0, 200);
250
+ return err(`LLM 调用失败 (status=${r.status}): ${msg}`);
251
+ }
252
+ return ok(JSON.stringify(r.json, null, 2));
253
+ }
254
+ default:
255
+ return err(`未知工具: ${name}`);
256
+ }
257
+ }
258
+ catch (e) {
259
+ const msg = e instanceof Error ? e.message : String(e);
260
+ return err(msg);
261
+ }
262
+ }
263
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,36 @@
1
- {
2
- "name": "@fastthree-ai/mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
1
+ {
2
+ "name": "@fastthree-ai/mcp",
3
+ "version": "0.2.0",
4
+ "description": "FastThree Model Context Protocol Server — 让 Claude/Cursor 通过 MCP 接入出图与 LLM 能力",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "ft-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "clean": "rimraf dist",
15
+ "prepublishOnly": "npm run clean && npm run build"
16
+ },
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "dependencies": {
28
+ "@modelcontextprotocol/sdk": "^1.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^20.11.0",
32
+ "rimraf": "^5.0.5",
33
+ "tsx": "^4.7.0",
34
+ "typescript": "^5.3.0"
35
+ }
36
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.