import { z } from "zod";
const echoSchema = z.object({
message: z.string(),
});
const knowledgeSchema = z.object({
kw: z.string().optional().default(""),
pageSize: z.number().int().positive().optional(),
pageNum: z.number().int().positive().optional(),
});
const stockSearchSchema = z.object({
input: z.string().min(1, "搜索关键字不能为空"),
count: z.number().int().positive().max(50).optional().default(10),
});
const KB_API_URL =
process.env.FUND_KB_API_URL ||
"https://reportdev.haiyu.datavita.com.cn/api/admin/knowledge/query"
const STOCK_SEARCH_API_URL = "https://searchapi.eastmoney.com/api/suggest/get";
async function handleKnowledge(args: unknown) {
const { kw = "", pageSize = 10, pageNum = 1 } = knowledgeSchema.parse(args);
const url = new URL(KB_API_URL);
url.searchParams.set("kw", kw);
url.searchParams.set("pageSize", String(pageSize));
url.searchParams.set("pageNum", String(pageNum));
const response = await fetch(url.toString(), {
method: "GET",
headers: {
Accept: "application/json",
},
});
if (!response.ok) {
throw new Error(
`Knowledge API request failed: ${response.status} ${response.statusText}`
);
}
let data: any;
try {
data = await response.json();
} catch (e) {
throw new Error("Knowledge API returned invalid JSON");
}
// Normalize basic shape: { code, msg, result }
console.log('handleKnowledge', data)
return {
content: [{ type: "text", text: JSON.stringify(data) }],
};
}
async function handleStockSearch(args: unknown) {
const { input, count = 10 } = stockSearchSchema.parse(args);
const url = new URL(STOCK_SEARCH_API_URL);
url.searchParams.set("input", input);
url.searchParams.set("type", "14");
url.searchParams.set("status", "1");
url.searchParams.set("count", String(count));
const response = await fetch(url.toString(), {
method: "GET",
headers: {
Accept: "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
},
});
console.log('response', response)
if (!response.ok) {
throw new Error(
`Stock search API request failed: ${response.status} ${response.statusText}`
);
}
let data: any;
try {
data = await response.json();
} catch (e) {
throw new Error("Stock search API returned invalid JSON");
}
console.log('handleStockSearch', data);
return {
content: [{ type: "text", text: JSON.stringify(data) }],
};
}
export const handleToolRequest = async (request: any) => {
const { name, arguments: args } = request.params;
if (name === "fund.echo") {
const parsed = echoSchema.parse(args);
return {
content: [{ type: "text", text: parsed.message }],
};
}
if (name === "fund.knoewledge") {
return await handleKnowledge(args);
}
if (name === "fund.stock_search") {
return await handleStockSearch(args);
}
throw new Error(`Unknown tool: ${name}`);
};